@@ -21,98 +21,106 @@ package custom_validation
2121
2222import (
2323 "reflect"
24- "github.com/antchfx/xmlquery"
25- "github.com/go-redis/redis/v7 "
24+
25+ "github.com/Azure/sonic-mgmt-common/cvl/common "
2626 "github.com/Azure/sonic-mgmt-common/cvl/internal/util"
2727 "github.com/Azure/sonic-mgmt-common/cvl/internal/yparser"
28- )
28+ "github.com/antchfx/xmlquery"
29+ "github.com/go-redis/redis/v7"
30+ )
2931
30- type CustomValidation struct {}
32+ type CustomValidation struct {}
3133
3234type CVLValidateType uint
35+
3336const (
34- VALIDATE_NONE CVLValidateType = iota //Data is used as dependent data
35- VALIDATE_SYNTAX //Syntax is checked and data is used as dependent data
36- VALIDATE_SEMANTICS //Semantics is checked
37- VALIDATE_ALL //Syntax and Semantics are checked
37+ VALIDATE_NONE CVLValidateType = iota //Data is used as dependent data
38+ VALIDATE_SYNTAX //Syntax is checked and data is used as dependent data
39+ VALIDATE_SEMANTICS //Semantics is checked
40+ VALIDATE_ALL //Syntax and Semantics are checked
3841)
3942
4043type CVLOperation uint
44+
4145const (
42- OP_NONE CVLOperation = 0 //Used to just validate the config without any operation
43- OP_CREATE = 1 << 0 //For Create operation
44- OP_UPDATE = 1 << 1 //For Update operation
45- OP_DELETE = 1 << 2 //For Delete operation
46+ OP_NONE CVLOperation = 0 //Used to just validate the config without any operation
47+ OP_CREATE = 1 << 0 //For Create operation
48+ OP_UPDATE = 1 << 1 //For Update operation
49+ OP_DELETE = 1 << 2 //For Delete operation
4650)
4751
48- //CVLRetCode CVL Error codes
52+ // CVLRetCode CVL Error codes
4953type CVLRetCode int
54+
5055const (
5156 CVL_SUCCESS CVLRetCode = iota
5257 CVL_ERROR
5358 CVL_NOT_IMPLEMENTED
5459 CVL_INTERNAL_UNKNOWN
5560 CVL_FAILURE
56- CVL_SYNTAX_ERROR = CVLRetCode (yparser .YP_SYNTAX_ERROR )
57- CVL_SEMANTIC_ERROR = CVLRetCode (yparser .YP_SEMANTIC_ERROR )
58- CVL_SYNTAX_MISSING_FIELD = CVLRetCode (yparser .YP_SYNTAX_MISSING_FIELD )
59- CVL_SYNTAX_INVALID_FIELD = CVLRetCode (yparser .YP_SYNTAX_INVALID_FIELD ) /* Invalid Field */
60- CVL_SYNTAX_INVALID_INPUT_DATA = CVLRetCode (yparser .YP_SYNTAX_INVALID_INPUT_DATA ) /*Invalid Input Data */
61- CVL_SYNTAX_MULTIPLE_INSTANCE = CVLRetCode (yparser .YP_SYNTAX_MULTIPLE_INSTANCE ) /* Multiple Field Instances */
62- CVL_SYNTAX_DUPLICATE = CVLRetCode (yparser .YP_SYNTAX_DUPLICATE ) /* Duplicate Fields */
63- CVL_SYNTAX_ENUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_ENUM_INVALID ) /* Invalid enum value */
64- CVL_SYNTAX_ENUM_INVALID_NAME = CVLRetCode (yparser .YP_SYNTAX_ENUM_INVALID_NAME ) /* Invalid enum name */
65- CVL_SYNTAX_ENUM_WHITESPACE = CVLRetCode (yparser .YP_SYNTAX_ENUM_WHITESPACE ) /* Enum name with leading/trailing whitespaces */
66- CVL_SYNTAX_OUT_OF_RANGE = CVLRetCode (yparser .YP_SYNTAX_OUT_OF_RANGE ) /* Value out of range/length/pattern (data) */
67- CVL_SYNTAX_MINIMUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_MINIMUM_INVALID ) /* min-elements constraint not honored */
68- CVL_SYNTAX_MAXIMUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_MAXIMUM_INVALID ) /* max-elements constraint not honored */
69- CVL_SEMANTIC_DEPENDENT_DATA_MISSING = CVLRetCode (yparser .YP_SEMANTIC_DEPENDENT_DATA_MISSING ) /* Dependent Data is missing */
61+ CVL_SYNTAX_ERROR = CVLRetCode (yparser .YP_SYNTAX_ERROR )
62+ CVL_SEMANTIC_ERROR = CVLRetCode (yparser .YP_SEMANTIC_ERROR )
63+ CVL_SYNTAX_MISSING_FIELD = CVLRetCode (yparser .YP_SYNTAX_MISSING_FIELD )
64+ CVL_SYNTAX_INVALID_FIELD = CVLRetCode (yparser .YP_SYNTAX_INVALID_FIELD ) /* Invalid Field */
65+ CVL_SYNTAX_INVALID_INPUT_DATA = CVLRetCode (yparser .YP_SYNTAX_INVALID_INPUT_DATA ) /*Invalid Input Data */
66+ CVL_SYNTAX_MULTIPLE_INSTANCE = CVLRetCode (yparser .YP_SYNTAX_MULTIPLE_INSTANCE ) /* Multiple Field Instances */
67+ CVL_SYNTAX_DUPLICATE = CVLRetCode (yparser .YP_SYNTAX_DUPLICATE ) /* Duplicate Fields */
68+ CVL_SYNTAX_ENUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_ENUM_INVALID ) /* Invalid enum value */
69+ CVL_SYNTAX_ENUM_INVALID_NAME = CVLRetCode (yparser .YP_SYNTAX_ENUM_INVALID_NAME ) /* Invalid enum name */
70+ CVL_SYNTAX_ENUM_WHITESPACE = CVLRetCode (yparser .YP_SYNTAX_ENUM_WHITESPACE ) /* Enum name with leading/trailing whitespaces */
71+ CVL_SYNTAX_OUT_OF_RANGE = CVLRetCode (yparser .YP_SYNTAX_OUT_OF_RANGE ) /* Value out of range/length/pattern (data) */
72+ CVL_SYNTAX_MINIMUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_MINIMUM_INVALID ) /* min-elements constraint not honored */
73+ CVL_SYNTAX_MAXIMUM_INVALID = CVLRetCode (yparser .YP_SYNTAX_MAXIMUM_INVALID ) /* max-elements constraint not honored */
74+ CVL_SEMANTIC_DEPENDENT_DATA_MISSING = CVLRetCode (yparser .YP_SEMANTIC_DEPENDENT_DATA_MISSING ) /* Dependent Data is missing */
7075 CVL_SEMANTIC_MANDATORY_DATA_MISSING = CVLRetCode (yparser .YP_SEMANTIC_MANDATORY_DATA_MISSING ) /* Mandatory Data is missing */
71- CVL_SEMANTIC_KEY_ALREADY_EXIST = CVLRetCode (yparser .YP_SEMANTIC_KEY_ALREADY_EXIST ) /* Key already existing. */
72- CVL_SEMANTIC_KEY_NOT_EXIST = CVLRetCode (yparser .YP_SEMANTIC_KEY_NOT_EXIST ) /* Key is missing. */
73- CVL_SEMANTIC_KEY_DUPLICATE = CVLRetCode (yparser .YP_SEMANTIC_KEY_DUPLICATE ) /* Duplicate key. */
74- CVL_SEMANTIC_KEY_INVALID = CVLRetCode (yparser .YP_SEMANTIC_KEY_INVALID )
76+ CVL_SEMANTIC_KEY_ALREADY_EXIST = CVLRetCode (yparser .YP_SEMANTIC_KEY_ALREADY_EXIST ) /* Key already existing. */
77+ CVL_SEMANTIC_KEY_NOT_EXIST = CVLRetCode (yparser .YP_SEMANTIC_KEY_NOT_EXIST ) /* Key is missing. */
78+ CVL_SEMANTIC_KEY_DUPLICATE = CVLRetCode (yparser .YP_SEMANTIC_KEY_DUPLICATE ) /* Duplicate key. */
79+ CVL_SEMANTIC_KEY_INVALID = CVLRetCode (yparser .YP_SEMANTIC_KEY_INVALID )
7580)
7681
77- //CVLEditConfigData Strcture for key and data in API
82+ // CVLEditConfigData Strcture for key and data in API
7883type CVLEditConfigData struct {
79- VType CVLValidateType //Validation type
80- VOp CVLOperation //Operation type
81- Key string //Key format : "PORT|Ethernet4"
82- Data map [string ]string //Value : {"alias": "40GE0/28", "mtu" : 9100, "admin_status": down}
84+ VType CVLValidateType //Validation type
85+ VOp CVLOperation //Operation type
86+ Key string //Key format : "PORT|Ethernet4"
87+ Data map [string ]string //Value : {"alias": "40GE0/28", "mtu" : 9100, "admin_status": down}
8388}
8489
85- //CVLErrorInfo CVL Error Structure
90+ // CVLErrorInfo CVL Error Structure
8691type CVLErrorInfo struct {
87- TableName string /* Table having error */
88- ErrCode CVLRetCode /* CVL Error return Code. */
89- CVLErrDetails string /* CVL Error Message details. */
90- Keys [] string /* Keys of the Table having error. */
91- Value string /* Field Value throwing error */
92- Field string /* Field Name throwing error . */
93- Msg string /* Detailed error message. */
94- ConstraintErrMsg string /* Constraint error message. */
95- ErrAppTag string
92+ TableName string /* Table having error */
93+ ErrCode CVLRetCode /* CVL Error return Code. */
94+ CVLErrDetails string /* CVL Error Message details. */
95+ Keys [] string /* Keys of the Table having error. */
96+ Value string /* Field Value throwing error */
97+ Field string /* Field Name throwing error . */
98+ Msg string /* Detailed error message. */
99+ ConstraintErrMsg string /* Constraint error message. */
100+ ErrAppTag string
96101}
97102
98103type CustValidationCache struct {
99104 Data interface {}
100105}
101106
102- //CustValidationCtxt Custom validation context passed to custom validation function
107+ // CustValidationCtxt Custom validation context passed to custom validation function
103108type CustValidationCtxt struct {
104- ReqData []CVLEditConfigData //All request data
105- CurCfg * CVLEditConfigData //Current request data for which validation should be done
106- YNodeName string //YANG node name
107- YNodeVal string //YANG node value, leaf-list will have "," separated value
108- YCur * xmlquery.Node //YANG data tree
109+ ReqData []CVLEditConfigData //All request data
110+ CurCfg * CVLEditConfigData //Current request data for which validation should be done
111+ YNodeName string //YANG node name
112+ YNodeVal string //YANG node value, leaf-list will have "," separated value
113+ YCur * xmlquery.Node //YANG data tree
109114 SessCache * CustValidationCache //Session cache, can be used for storing data, persistent in session
110- RClient * redis.Client //Redis client
115+ RClient * redis.Client //Redis client
111116}
112117
113- //InvokeCustomValidation Common function to invoke custom validation
114- //TBD should we do this using GO plugin feature ?
115- func InvokeCustomValidation (cv * CustomValidation , name string , args ... interface {}) CVLErrorInfo {
118+ // Search criteria for advanced lookup through DBAccess APIs
119+ type Search = common.Search
120+
121+ // InvokeCustomValidation Common function to invoke custom validation
122+ // TBD should we do this using GO plugin feature ?
123+ func InvokeCustomValidation (cv * CustomValidation , name string , args ... interface {}) CVLErrorInfo {
116124 inputs := make ([]reflect.Value , len (args ))
117125 for i := range args {
118126 inputs [i ] = reflect .ValueOf (args [i ])
@@ -129,4 +137,3 @@ func InvokeCustomValidation(cv *CustomValidation, name string, args... interface
129137
130138 return CVLErrorInfo {ErrCode : CVL_SUCCESS }
131139}
132-
0 commit comments