Skip to content

Commit

Permalink
fix: add conditional profiles
Browse files Browse the repository at this point in the history
fix: add conversion of conditional profiles

fix: validate if any varBind, pattern or conditions were added

fix: remove filed and patterns columns from profiles screen, rename fileds in profile form

fix: rename UI fileds in profiles

change conversion to int and float
  • Loading branch information
wojtekzyla committed Jul 7, 2023
1 parent 30f6d90 commit 1e146c9
Show file tree
Hide file tree
Showing 12 changed files with 580 additions and 99 deletions.
87 changes: 74 additions & 13 deletions backend/SC4SNMP_UI_backend/common/conversions.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,29 @@ def ui2backend(self, document: dict, **kwargs):
class ProfileConversion(Conversion):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__backend2ui_conditional_operations = {
"lt": "less than",
"gt": "greater than",
"equal": "equal",
"in": "in"
}
self.__ui2backend_conditional_operations = {}
for key, value in self.__backend2ui_conditional_operations.items():
self.__ui2backend_conditional_operations[value] = key

self.__backend2ui_profile_types = {
"field": "smart"
}
self.__ui2backend_profile_types = {}
for key, value in self.__backend2ui_profile_types.items():
self.__ui2backend_profile_types[value] = key

def __string_value_to_numeric(self, value: str):
if value.isnumeric():
value = int(value)
elif value.replace(".", "").isnumeric():
value = float(value)
return value

def _backend2ui_map(self, document: dict, **kwargs):
profile_name = None
Expand All @@ -67,20 +90,42 @@ def _backend2ui_map(self, document: dict, **kwargs):

if "condition" in document[profile_name]:
backend_condition = document[profile_name]["condition"]
condition_type = backend_condition["type"]
field = backend_condition["field"] if condition_type == "field" else ""
condition_type = self.__backend2ui_profile_types[backend_condition["type"]]
field = backend_condition["field"] if backend_condition["type"] == "field" else ""
patterns = [{"pattern": p} for p in backend_condition["patterns"]] \
if condition_type == "field" else []
if backend_condition["type"] == "field" else []
conditions = {
"condition": condition_type,
"field": field,
"patterns": patterns
"patterns": patterns,
"conditions": []
}
elif "conditions" in document[profile_name]:
conditional = []
for back_condition in document[profile_name]["conditions"]:
field = back_condition["field"]
operation = self.__backend2ui_conditional_operations[back_condition["operation"]]
value = []
if operation == "in":
for v in back_condition["value"]:
value.append(str(v))
else:
value.append(str(back_condition["value"]))
conditional.append(
{"field": field, "operation": operation, "value": value}
)
conditions = {
"condition": "conditional",
"field": "",
"patterns": [],
"conditions": conditional
}
else:
conditions = {
"condition": "None",
"condition": "standard",
"field": "",
"patterns": []
"patterns": [],
"conditions": []
}
result = {
"_id": str(document["_id"]),
Expand All @@ -92,16 +137,30 @@ def _backend2ui_map(self, document: dict, **kwargs):
return result

def _ui2backend_map(self, document: dict, **kwargs):
if document['conditions']['condition'] == "field":
conditions = {
conditions = None
condition = None
if document['conditions']['condition'] == "smart":
condition = {
'type': 'field',
'field': document['conditions']['field'],
'patterns': [el['pattern'] for el in document['conditions']['patterns']]
}
elif document['conditions']['condition'] == "None":
conditions = None
else:
conditions = {
elif document['conditions']['condition'] == "conditional":
conditions = []
for ui_condition in document['conditions']['conditions']:
field = ui_condition["field"]
operation = self.__ui2backend_conditional_operations[ui_condition["operation"]]
if operation == "in":
value = []
for v in ui_condition["value"]:
value.append(self.__string_value_to_numeric(v))
else:
value = self.__string_value_to_numeric(ui_condition["value"][0])
conditions.append(
{"field": field, "operation": operation, "value": value}
)
elif document['conditions']['condition'] != "standard":
condition = {
'type': document['conditions']['condition']
}
var_binds = []
Expand All @@ -119,8 +178,10 @@ def _ui2backend_map(self, document: dict, **kwargs):
'varBinds': var_binds
}
}
if condition is not None:
item[document['profileName']].update({'condition': condition})
if conditions is not None:
item[document['profileName']].update({'condition': conditions})
item[document['profileName']].update({'conditions': conditions})
return item


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ function Header(){
ProfCtx.setCondition("None");
ProfCtx.setConditionField("");
ProfCtx.setConditionPatterns([]);
ProfCtx.setConditional([]);
ProfCtx.setAddOpen(true);
ProfCtx.setIsEdit(false);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ function AddProfileModal(props) {
conditions: {
condition: ProfCtx.condition,
field: ProfCtx.conditionField,
patterns: ProfCtx.conditionPatterns
patterns: ProfCtx.conditionPatterns,
conditions: ProfCtx.conditional
}
};

Expand Down Expand Up @@ -140,7 +141,12 @@ function AddProfileModal(props) {
<Condition newSubmit={newSubmit}/>

<StyledControlGroup label="VarBinds">
<VarBinds newSubmit={newSubmit}/>
<div style={validationGroup}>
<VarBinds newSubmit={newSubmit}/>
{((ValCtx.varBindsExistErrors) ?
<P key={createDOMID()} style={validationMessage}>{ValCtx.varBindsExistErrors}</P>
: null)}
</div>
</StyledControlGroup>

</StyledModalBody>
Expand Down
35 changes: 25 additions & 10 deletions frontend/packages/manager/src/components/profiles/Condition.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import P from "@splunk/react-ui/Paragraph";
import FieldPatterns from "./FieldPatterns";
import {validationGroup, validationMessage} from "../../styles/ValidationStyles";
import ProfilesValidationContxt from "../../store/profiles-validation-contxt";
import Conditional from "./Conditional";

function Condition(props){
const ProfCtx = useContext(ProfileContext);
Expand All @@ -23,35 +24,49 @@ function Condition(props){

return(
<div>
<StyledControlGroup label="Condition"
<StyledControlGroup label="Profile type"
labelFor="customized-select-after">
<Select value={ProfCtx.condition} onChange={handleChange} filter>
<Select.Option label="None" value="None"/>
<Select.Option label="standard" value="standard"/>
<Select.Option label="base" value="base"/>
<Select.Option label="field" value="field"/>
<Select.Option label="smart" value="smart"/>
<Select.Option label="walk" value="walk"/>
<Select.Option label="conditional" value="conditional"/>
</Select>
</StyledControlGroup>
{
ProfCtx.condition === 'field' ? (
ProfCtx.condition === 'smart' ? (
<div>
<StyledControlGroup label="field">
<StyledControlGroup label="Field">
<div style={validationGroup}>
<Text value={ProfCtx.conditionField} onChange={handleFieldChange} error={((ValCtx.conditionFieldErrors) ? true : false)}/>
{((ValCtx.conditionFieldErrors) ? ValCtx.conditionFieldErrors.map((el) =>
<P key={createDOMID()} style={validationMessage}>{el}</P>) : <P/>)}
</div>
</StyledControlGroup>
<StyledControlGroup label="patterns">
<FieldPatterns newSubmit={props.newSubmit}/>
<StyledControlGroup label="Patterns">
<div style={validationGroup}>
<FieldPatterns newSubmit={props.newSubmit}/>
{((ValCtx.patternsExistErrors) ?
<P key={createDOMID()} style={validationMessage}>{ValCtx.patternsExistErrors}</P>
: null)}
</div>
</StyledControlGroup>
</div>) : null
}

{ProfCtx.condition === 'conditional' ? (
<div />
) : null}
{
ProfCtx.condition === 'conditional' ? (
<StyledControlGroup label="Conditions">
<div style={validationGroup}>
<Conditional newSubmit={props.newSubmit}/>
{((ValCtx.conditionalExistErrors) ?
<P key={createDOMID()} style={validationMessage}>{ValCtx.conditionalExistErrors}</P>
: null)}
</div>
</StyledControlGroup>
) : null
}
</div>
)
}
Expand Down
Loading

0 comments on commit 1e146c9

Please sign in to comment.