add branch validation to queue

This commit is contained in:
2025-12-22 15:07:11 +01:00
parent 5f4eaaaa20
commit a4205f513d
2 changed files with 131 additions and 41 deletions

View File

@@ -13,6 +13,45 @@ jobs_bp = Blueprint('jobs', __name__, url_prefix='/jobs')
def submit(): def submit():
return render_template('jobs/submit.html') return render_template('jobs/submit.html')
@jobs_bp.route('/debug/test-step2')
@login_required
def debug_test_step2():
"""Debug endpoint to test step2 template with mock data"""
if not current_user.is_admin:
return jsonify({'error': 'Admin access required'}), 403
# Mock data similar to what we expect from scenario scan
organized_data = {
"drivers": {
"diag_protocol_stack": ["diag_protocol_stack_init_test"]
},
"application_layer": {
"data_pool": ["data_pool_init_test"],
"actuator_manager": ["actuator_manager_init_test2", "actuator_manager_init_test"],
"event_system": ["event_system_init_test"]
}
}
scenario_map = {
"diag_protocol_stack_init_test": "drivers/diag_protocol_stack/test/diag_protocol_stack_init_test.test_scenario.xml",
"data_pool_init_test": "application_layer/DP_stack/data_pool/test/data_pool_init_test.test_scenario.xml",
"actuator_manager_init_test2": "application_layer/business_stack/actuator_manager/test/actuator_manager_init_test2.test_scenario.xml",
"actuator_manager_init_test": "application_layer/business_stack/actuator_manager/test/actuator_manager_init_test.test_scenario.xml",
"event_system_init_test": "application_layer/business_stack/event_system/test/event_system_init_test.test_scenario.xml"
}
try:
return render_template('jobs/submit_step2.html',
branch_name='test_branch',
organized_data=organized_data,
scenario_map=scenario_map)
except Exception as e:
return jsonify({
'error': str(e),
'type': type(e).__name__,
'template_exists': True
})
@jobs_bp.route('/debug/ssh-test') @jobs_bp.route('/debug/ssh-test')
@login_required @login_required
def debug_ssh_test(): def debug_ssh_test():
@@ -216,21 +255,46 @@ def submit_step1():
@jobs_bp.route('/submit/step2-validated', methods=['POST']) @jobs_bp.route('/submit/step2-validated', methods=['POST'])
@login_required @login_required
def submit_step2_validated(): def submit_step2_validated():
branch_name = request.form.get('branch_name')
organized_data_json = request.form.get('organized_data')
scenario_map_json = request.form.get('scenario_map')
try: try:
organized_data = json.loads(organized_data_json) if organized_data_json else {} branch_name = request.form.get('branch_name')
scenario_map = json.loads(scenario_map_json) if scenario_map_json else {} organized_data_json = request.form.get('organized_data')
except json.JSONDecodeError: scenario_map_json = request.form.get('scenario_map')
flash('Invalid scenario data', 'error')
return redirect(url_for('jobs.submit'))
return render_template('jobs/submit_step2.html', print(f"[DEBUG] Step2 - Branch: {branch_name}")
branch_name=branch_name, print(f"[DEBUG] Step2 - Organized data length: {len(organized_data_json) if organized_data_json else 0}")
organized_data=organized_data, print(f"[DEBUG] Step2 - Scenario map length: {len(scenario_map_json) if scenario_map_json else 0}")
scenario_map=scenario_map)
if not branch_name:
print("[ERROR] Step2 - No branch name provided")
flash('Branch name is required', 'error')
return redirect(url_for('jobs.submit'))
try:
organized_data = json.loads(organized_data_json) if organized_data_json else {}
scenario_map = json.loads(scenario_map_json) if scenario_map_json else {}
print(f"[DEBUG] Step2 - Parsed organized_data keys: {list(organized_data.keys())}")
print(f"[DEBUG] Step2 - Parsed scenario_map count: {len(scenario_map)}")
except json.JSONDecodeError as e:
print(f"[ERROR] Step2 - JSON decode error: {e}")
flash('Invalid scenario data', 'error')
return redirect(url_for('jobs.submit'))
print(f"[DEBUG] Step2 - Rendering template with {len(organized_data)} layers")
return render_template('jobs/submit_step2.html',
branch_name=branch_name,
organized_data=organized_data,
scenario_map=scenario_map)
except Exception as e:
print(f"[ERROR] Step2 - Unexpected error: {str(e)}")
print(f"[ERROR] Step2 - Error type: {type(e).__name__}")
import traceback
print(f"[ERROR] Step2 - Traceback: {traceback.format_exc()}")
flash(f'Error loading scenario selection: {str(e)}', 'error')
return redirect(url_for('jobs.submit'))
@login_required @login_required
def submit_step2(): def submit_step2():
branch_name = request.form.get('branch_name') branch_name = request.form.get('branch_name')

View File

@@ -45,39 +45,65 @@
</div> </div>
<div class="scenario-tree"> <div class="scenario-tree">
{% for layer_name, layer_data in organized_data.items() %} {% if organized_data %}
<div class="tree-layer"> {% for layer_name, layer_data in organized_data.items() %}
<div class="tree-node layer-node" onclick="toggleLayer('{{ layer_name }}')"> <div class="tree-layer">
<span class="tree-toggle" id="toggle-{{ layer_name }}"></span> <div class="tree-node layer-node" onclick="toggleLayer('{{ layer_name }}')">
<input type="checkbox" class="layer-checkbox" id="layer-{{ layer_name }}" onchange="toggleLayerSelection('{{ layer_name }}')"> <span class="tree-toggle" id="toggle-{{ layer_name }}"></span>
<label for="layer-{{ layer_name }}" class="tree-label layer-label">{{ layer_name.replace('_', ' ').title() }}</label> <input type="checkbox" class="layer-checkbox" id="layer-{{ layer_name }}" onchange="toggleLayerSelection('{{ layer_name }}')">
</div> <label for="layer-{{ layer_name }}" class="tree-label layer-label">{{ layer_name.replace('_', ' ').title() }}</label>
</div>
<div class="tree-children" id="children-{{ layer_name }}" style="display: none;"> <div class="tree-children" id="children-{{ layer_name }}" style="display: none;">
{% for stack_name, scenarios in layer_data.items() %} {% if layer_data %}
<div class="tree-stack"> {% for stack_name, scenarios in layer_data.items() %}
<div class="tree-node stack-node" onclick="toggleStack('{{ layer_name }}', '{{ stack_name }}')"> <div class="tree-stack">
<span class="tree-toggle" id="toggle-{{ layer_name }}-{{ stack_name }}"></span> <div class="tree-node stack-node" onclick="toggleStack('{{ layer_name }}', '{{ stack_name }}')">
<input type="checkbox" class="stack-checkbox" id="stack-{{ layer_name }}-{{ stack_name }}" onchange="toggleStackSelection('{{ layer_name }}', '{{ stack_name }}')"> <span class="tree-toggle" id="toggle-{{ layer_name }}-{{ stack_name }}"></span>
<label for="stack-{{ layer_name }}-{{ stack_name }}" class="tree-label stack-label">{{ stack_name.replace('_', ' ').title() }}</label> <input type="checkbox" class="stack-checkbox" id="stack-{{ layer_name }}-{{ stack_name }}" onchange="toggleStackSelection('{{ layer_name }}', '{{ stack_name }}')">
</div> <label for="stack-{{ layer_name }}-{{ stack_name }}" class="tree-label stack-label">{{ stack_name.replace('_', ' ').title() }}</label>
</div>
<div class="tree-children" id="children-{{ layer_name }}-{{ stack_name }}" style="display: none;"> <div class="tree-children" id="children-{{ layer_name }}-{{ stack_name }}" style="display: none;">
{% for scenario in scenarios %} {% if scenarios %}
<div class="tree-scenario"> {% for scenario in scenarios %}
<div class="tree-node scenario-node"> <div class="tree-scenario">
<span class="tree-spacer"></span> <div class="tree-node scenario-node">
<input type="checkbox" class="scenario-checkbox" id="scenario-{{ scenario }}" value="{{ scenario }}" onchange="updateSelectionCount()" data-layer="{{ layer_name }}" data-stack="{{ stack_name }}"> <span class="tree-spacer"></span>
<label for="scenario-{{ scenario }}" class="tree-label scenario-label">{{ scenario }}</label> <input type="checkbox" class="scenario-checkbox" id="scenario-{{ scenario }}" value="{{ scenario }}" onchange="updateSelectionCount()" data-layer="{{ layer_name }}" data-stack="{{ stack_name }}">
<label for="scenario-{{ scenario }}" class="tree-label scenario-label">{{ scenario }}</label>
</div>
</div>
{% endfor %}
{% else %}
<div class="tree-scenario">
<div class="tree-node scenario-node">
<span class="tree-spacer"></span>
<span class="tree-label scenario-label" style="color: #9ca3af;">No scenarios found</span>
</div>
</div>
{% endif %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> {% else %}
<div class="tree-stack">
<div class="tree-node stack-node">
<span class="tree-spacer"></span>
<span class="tree-label stack-label" style="color: #9ca3af;">No stacks found</span>
</div>
</div>
{% endif %}
</div> </div>
{% endfor %}
</div> </div>
</div> {% endfor %}
{% endfor %} {% else %}
<div class="tree-layer">
<div class="tree-node layer-node">
<span class="tree-label layer-label" style="color: #9ca3af;">No scenarios available</span>
</div>
</div>
{% endif %}
</div> </div>
<div class="form-actions"> <div class="form-actions">