Skip to content

Conversation

@Yael-F
Copy link
Contributor

@Yael-F Yael-F commented Nov 3, 2025

Add Tekton EventListener for MLOps benchmark testing workflows
Implement EventListener infrastructure to trigger MLOps batch analysis via webhook, including pipeline tasks for API calls and status polling, comprehensive documentation, and Makefile integration for automated deployment.

Implement complete EventListener infrastructure to trigger MLOps batch analysis via webhook, including pipeline tasks for API calls and status polling, comprehensive documentation, and Makefile integration for automated deployment.
@Yael-F Yael-F force-pushed the feat/mlops-eventlistener-benchmark branch from 6b6c196 to 6d34c36 Compare November 3, 2025 12:33
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I've reviewed the code snippet. Here's a summary of potential issues and suggestions for improvement:

Review Summary:

The code defines the TriggerTemplate resource which will instantiate a PipelineRun. The parameters are used to inject parameters into a PipelineRun.

Potential Issues and Suggestions:

  • Issue: There is no documentation about this file.
    • Suggestion: Add a documentation file to explain the purpose of the file.
  • Issue: Hardcoded namespace value.
    • Suggestion: Avoid hardcoding the namespace value, and consider parameterizing it.
  • Issue: There is no validation for parameters.
    • Suggestion: Validate the parameters by using CEL to avoid command injection.
  • Issue: If any of the parameters is not set, the pipeline will not fail, and will use default value, which might not be the desired behavior.
    • Suggestion: Consider removing default values, or have the pipeline check if the value is set.
```diff --- a/deploy/Makefile +++ b/deploy/Makefile @@ -10,7 +10,6 @@ CO := oc --context $(CONTEXT)

Pipeline parameters (overrideable on the CLI):

-REPO_REMOTE_URL ?= source/code/url
HUMAN_VERIFIED_FILE_PATH ?= ""

LLM_URL ?= http://<>
@@ -56,6 +55,10 @@
GITHUB_REPO_URL ?= https://github.com/RHEcosystemAppEng/sast-ai-workflow.git
ARGOCD_NAMESPACE ?= sast-ai

  • EventListener Configuration

  • ORCHESTRATOR_API_URL ?=
  • MLOPS_ORCHESTRATOR_API_URL ?=
  • Secret configuration (loaded from .env file)

    GITLAB_TOKEN ?= ""
    LLM_API_KEY ?= ""
    @@ -77,20 +80,20 @@
    AWS_ACCESS_KEY_ID ?= ""
    AWS_SECRET_ACCESS_KEY ?= ""
    S3_ENDPOINT_URL ?= ""
    --
    -.PHONY: deploy setup tasks secrets pipeline scripts configmaps run clean generate-prompts prompts argocd-deploy-mlops argocd-deploy-prod argocd-clean

+.PHONY: deploy deploy-dev deploy-prod deploy-mlops setup tasks-dev tasks-prod tasks-mlops secrets pipeline scripts configmaps run clean generate-prompts prompts argocd-deploy-dev argocd-deploy-prod argocd-clean eventlistener eventlistener-clean

Unified deploy command

Usage:

make deploy # Deploy base (Google Drive, :latest)

make deploy ENV=mlops # Deploy MLOps (S3/Minio, :latest)

make deploy ENV=prod IMAGE_VERSION=1.2.3 # Deploy prod (Google Drive, versioned)

-deploy:

  • @if [ "$(ENV)" = "prod" ] && [ -z "$(IMAGE_VERSION)" ]; then
    +deploy: deploy-$(ENV)

+deploy-dev: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):latest
+deploy-dev: setup-common tasks-dev argocd-deploy-dev

  • @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  • @echo "🚀 SAST AI Workflow - Development Deployment"
  • @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  • @echo " Environment: Development"
  • @echo " Container Image: $(CONTAINER_IMAGE)"
  • @echo ""
  • @echo "✅ Development deployment completed successfully!"

+deploy-prod: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)
+deploy-prod: setup tasks-prod argocd-deploy-prod

  • @if [ -z "$(IMAGE_VERSION)" ]; then
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━";
    echo "❌ ERROR: IMAGE_VERSION is required for production deployment";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━";
    @@ -105,3 +108,4 @@
    echo "";
    echo "Available versions can be found at:";
    echo "https://quay.io/repository/ecosystem-appeng/sast-ai-workflow?tab=tags";
    exit 1; \

**Review Summary:**

The changes introduce a more structured deployment process using `make deploy-dev`, `make deploy-prod` and `make deploy-mlops` targets, which is an improvement. It enforces the `IMAGE_VERSION` requirement for production deployments, preventing accidental deployments without a specific version. It also sets up a clearer separation of concerns for different environments.

**File: deploy/Makefile**

*   **Issue:** There are inconsistencies in the use of `$(ENV)` variable. It's used in the main `deploy` target but not consistently used in other targets like `deploy-mlops`. Suggestion: Standardize the use of `$(ENV)` across all deployment targets for consistency. Example: `deploy-mlops: setup tasks-mlops argocd-deploy-mlops` should become `deploy-mlops: ENV=mlops setup tasks-mlops argocd-deploy-mlops`.
*   **Suggestion:** The `deploy` target can be improved to provide a default behavior if `ENV` is not specified. For example, `deploy: deploy-dev` could be added to make development deployment the default.
*    **Suggestion:** Consider adding error handling for missing environment variables like `IMAGE_REGISTRY` or `IMAGE_NAME` similar to the check for `IMAGE_VERSION` in the `deploy-prod` target.
*   **Suggestion:** Add similar checks for `deploy-mlops` to ensure required variables for `mlops` environment are present, like checking if `S3_OUTPUT_BUCKET_NAME` is set, before proceeding with the deployment.
*   **Suggestion:** The echo messages can be improved by using constants for colors and styles so you can change the output format easily.

```makefile
# Example of color constants
RED   := $(shell tput -Txterm setaf 1)
GREEN := $(shell tput -Txterm setaf 2)
RESET := $(shell tput -Txterm sgr0)

deploy-prod: ...
	@if [ -z "$(IMAGE_VERSION)" ]; then \
		echo "${RED}ERROR: IMAGE_VERSION is required for production deployment${RESET}"; \
        ...

Okay, I've reviewed the provided Makefile diff. Here's a summary of the issues and suggestions:

Review Summary:

The changes introduce a new deploy-mlops target, streamline the setup target, and remove some environment-specific logic. The deploy-mlops target deploys an EventListener, specifically for MLOps benchmarking. The removal of the environment-specific logic simplifies the base setup and pushes the MLOps deployment into a dedicated target. However, there are some areas that could be improved for clarity, error handling, and security.

File: Makefile

Issues and Suggestions:

  1. Clarity and Consistency:

    • Suggestion: Consider renaming deploy-mlops to something more descriptive like deploy-mlops-benchmark. This clarifies the specific purpose of this target.
  2. Error Handling:

    • Issue: The $(CO) apply command in deploy-mlops uses || { ... exit 1; }. While it prevents the script from continuing on failure, the error message "Failed to deploy EventListener resources" is generic.
    • Suggestion: Capture the output of the $(CO) apply command (stderr) and include it in the error message. This will provide more specific debugging information. For example:
      $(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) 2>&1 || { echo "    Failed to deploy EventListener resources: $(CO) apply failed with: $$?"; exit 1; }
      Using $$? will provide the exit code which is useful in debugging.
  3. Security:

    • Issue: The sed command in deploy-mlops directly modifies a file in the tekton/eventlistener/ directory. This is not ideal, especially if this directory is under version control. It's better to create the file in a temporary location and then move it to the destination.
    • Suggestion: Use mktemp to create a temporary file, perform the sed operation on the temporary file, and then move the temporary file to the destination. This prevents potential issues if the sed command fails midway through execution. For Example:
      deploy-mlops: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):latest
      deploy-mlops: setup tasks-mlops argocd-deploy-mlops
      	@if [ -z "$(MLOPS_ORCHESTRATOR_API_URL)" ]; then \
      		echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
      		echo "❌ ERROR: MLOPS_ORCHESTRATOR_API_URL is required for MLOps deployment"; \
      		echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
      		echo ""; \
      		echo "Usage: make deploy-mlops MLOPS_ORCHESTRATOR_API_URL=<url>"; \
      		echo ""; \
      		echo "Example:"; \
      		echo "  make deploy-mlops MLOPS_ORCHESTRATOR_API_URL=http://orchestrator.sast-ai.svc.cluster.local:8080"; \
      		exit 1; \
      	fi
      	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
      	@echo "🤖 SAST AI Workflow - MLOps Benchmarking Deployment"
      	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
      	@echo "   Environment: MLOps (Benchmarking)"
      	@echo "   Container Image: $(CONTAINER_IMAGE)"
      	@echo "   Orchestrator URL: $(MLOPS_ORCHESTRATOR_API_URL)"
      	@echo ""
      	@echo "🎯 Deploying EventListener..."
      	@TMP_FILE=$$(mktemp); \
      	sed -e 's|ORCHESTRATOR_API_URL_PLACEHOLDER|$(MLOPS_ORCHESTRATOR_API_URL)|g' tekton/eventlistener/benchmark-config.yaml.example > "$$TMP_FILE"; \
      	mv "$$TMP_FILE" tekton/eventlistener/benchmark-config.yaml; \
      	$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) 2>&1 || \
      		{ echo "   ❌ Failed to deploy EventListener resources: $(CO) apply failed with: $$?"; exit 1; }
      	@echo "   ✓ EventListener deployed"
      	@echo ""
      	@echo "✅ MLOps deployment completed successfully!"
      
  4. Idempotency

    • The sed command is not idempotent and will change the file every time the command is run. It is important to make sure the command does not change the file if it does not need to. Consider checking to see if the file contains the placeholder before replacing it.

These suggestions aim to improve the robustness, clarity, and security of the Makefile. Let me know if you have any further questions.

Okay, I've reviewed the Makefile diff. Here's a summary and specific comments:

Review Summary

The changes introduce better organization and modularity to the Makefile, specifically around Tekton resource deployment. The separation of tasks into tasks-dev, tasks-prod, and tasks-mlops improves clarity and allows for environment-specific deployments. The addition of the eventlistener target and related cleanup is also a welcome improvement.

File: Makefile

  • Improvement: Clear separation of Tekton task deployments using tasks-dev, tasks-prod, and tasks-mlops. This is a good organizational change.
  • Improvement: The eventlistener target is well-structured, with clear instructions and error handling.
  • Improvement: The eventlistener-clean target is comprehensive in removing related resources.
  • Suggestion: In eventlistener, consider using yq or kustomize to avoid in-place modification of benchmark-config.yaml. This would make the process more robust and prevent accidental modifications to the example file.
  • Suggestion: In eventlistener-clean, the redirection of stdout and stderr to /dev/null might hide important error messages during deletion. Consider removing the redirection initially to observe any errors, and only add it back if the noise is excessive.
  • Suggestion: Consistent use of @ to suppress commands, some lines don't have it. This can cause unnecessary output to the console.
# tekton/eventlistener/benchmark-config.yaml.example > tekton/eventlistener/benchmark-config.yaml
# @$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) || \
# { echo "   ❌ Failed to deploy EventListener resources"; exit 1; }
# $(CO) delete pipelinerun -l app.kubernetes.io/component=benchmark-mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true
# $(CO) delete taskrun -l app.kubernetes.io/component=benchmark-mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true

Okay, I've reviewed the changes provided in the diff. Here's a summary of the issues and suggestions:

Review Summary:

The changes primarily focus on improving the Makefile for deployment and cleanup, adding ArgoCD integration with hooks for automated batch triggering, and updating the README.md to reflect these changes. The addition of ArgoCD hooks is a significant improvement, but needs careful consideration for security and error handling. The Makefile changes introduce some conditional logic that could be simplified. The addition of the mlop environment is good.

File-Specific Comments:

1. Makefile

  • Issue: The conditional logic for ENV in the clean target is repetitive.
    • Suggestion: Create a variable that holds the path to the kustomize directory based on the ENV variable, and then use that variable in the delete command. This reduces duplication.
  • Issue: The use of || true after delete commands silences errors. While this prevents the make process from stopping, it can hide important issues.
    • Suggestion: Consider logging the error message instead of completely ignoring it. At least then you'll know something failed. Or check the return code before silencing.
  • Issue: There are three secrets being deleted which contain the word account, consider if they are actually service accounts and if so, should they be managed using workload identity.
    • Suggestion: Follow least privilege when it comes to service accounts.
  • Issue: There are three secrets being deleted which contain the word token, consider if they are actually tokens and if so, should they be managed using workload identity.
    • Suggestion: Follow least privilege when it comes to tokens.

2. deploy/README.md

  • Issue: The explanation of ArgoCD hooks needs to emphasize security considerations. Specifically, validating the source of the webhook and handling potential errors from the orchestrator.
    • Suggestion: Add a section about security best practices for ArgoCD hooks. Mention things like validating the request origin and using a secure authentication mechanism. Also, describe how failures in the orchestrator API call are handled (retries, logging, alerting).
  • Issue: Missing information about setting up secrets.
    • Suggestion: Provide a section on how to set up secrets.

I am ready for the next set of changes.

Okay, I've reviewed the changes you've provided. Here's a summary of potential issues and suggestions for improvement, focusing on clarity, maintainability, and best practices:

General Review Summary:

The changes introduce a Tekton EventListener setup for MLOps benchmarking. The documentation is generally good, providing instructions for deployment, testing, and troubleshooting. However, there are opportunities to improve clarity and address potential configuration issues.

File-Specific Comments:

File: argocd/hooks/README.md

  • Clarity: The instructions for disabling hooks could be more explicit. Consider adding a note about the potential impact of disabling hooks and when it might be appropriate.
  • Clarity: Add example content of the sast-ai-hook-config ConfigMap.
  • Clarity: In "Monitor hook execution" add description of command flags like --tail=100.

File: deploy/tekton/eventlistener/README.md

  • Missing Information: The instructions lack specifics on how to configure the benchmark-config.yaml file. This is a critical piece, and users will need guidance on the required parameters and their meanings. Provide an example.
  • Missing Information: The instructions don't specify where to obtain or how to create the MLOps pipeline referenced in Step 1. This is a critical dependency that needs to be addressed.
  • Suggestion: Consider adding a section on security considerations, such as how to secure the EventListener endpoint.
  • Suggestion: Add more details to the troubleshooting section. What are common errors, and how can users diagnose them?

I'll wait for the next file diffs to continue the review.

Okay, I've reviewed the provided text which seems to be documentation for deploying and testing an EventListener for MLOps benchmarking. Here's a summary of potential issues and suggestions:

Review Summary:

The documentation is generally clear and well-structured. However, there are a few points where clarity could be improved, and security best practices emphasized. The use of hardcoded URLs and the lack of input validation in the make command are potential areas for improvement. The troubleshooting section is a good addition.

Specific Issues and Suggestions:

  • File: Documentation (overall)
    • Issue: Hardcoded Namespace. The example uses your-namespace extensively.
    • Suggestion: Emphasize the need to replace your-namespace with the actual namespace throughout the documentation. Consider using a placeholder like <your-namespace> to make it more obvious.
  • File: Documentation (Step 3 - Deploy EventListener)
    • Issue: Lack of Input Validation in make command. The make command doesn't seem to validate ORCHESTRATOR_API_URL and NAMESPACE.
    • Suggestion: Add input validation to the Makefile to ensure that these parameters are provided and are in the correct format. This prevents errors during deployment.
  • File: Documentation (Step 3 - Deploy EventListener)
    • Issue: Hardcoded API Endpoint. The documentation explicitly states the endpoint is hardcoded.
    • Suggestion: While it's documented, hardcoding the endpoint makes the EventListener less flexible. Consider making the endpoint configurable via a parameter or environment variable, if possible. If not possible, add a very clear comment explaining why it is hardcoded and the implications.
  • File: Documentation (Step 4 - Test the EventListener)
    • Issue: Port-forwarding Security. The documentation suggests port-forwarding for external testing.
    • Suggestion: Add a clear warning about the security implications of port-forwarding, especially in production environments. Suggest alternative methods for testing, such as using oc exec to run curl from within the cluster.
  • File: Documentation (Step 4 - Test the EventListener)
    • Issue: Error Handling. The documentation shows "Successful Test" results.
    • Suggestion: Add examples of what to expect when a test fails. Include likely error messages and troubleshooting steps specific to those errors. For example, what happens if the Orchestrator API is unavailable? What happens if the JSON payload is invalid?

These suggestions aim to improve the clarity, security, and robustness of the documented deployment process.

Okay, I've reviewed the provided text, which appears to be documentation for an event listener and related configurations for an MLOps benchmarking system. Here's a summary of potential issues and suggestions for improvement:

Review Summary:

The documentation is generally well-structured and provides useful information. However, there are opportunities to improve clarity, conciseness, and security considerations. Specifically, it is missing the authentication mechanism and the code lacks any kind of input sanitization.

File-Specific Comments and Suggestions:

  • Overall (Documentation):

    • Clarity: The documentation assumes a level of familiarity with Tekton, Kubernetes, and the overall system architecture. Consider adding a brief introductory section that defines key terms and provides a high-level overview for newcomers.
    • Security: The documentation lacks any information on authentication/authorization for the webhook. It's crucial to add information on how to secure the endpoint to prevent unauthorized triggering of pipelines.
    • Error Handling: The "Common Issues" sections are helpful. Consider adding more specific troubleshooting steps and potential solutions for each issue.
    • ConfigMap Updates: The documentation mentions updating the ConfigMap. Add a warning about potential downtime or disruption if the orchestrator service relies on this ConfigMap and is not configured to handle updates gracefully.
    • Version Control: Mention how changes to the configuration (ConfigMap, pipeline definitions) should be managed and versioned (e.g., using Git).
  • Webhook Payload Format:

    • Validation: Emphasize the importance of validating the webhook payload to prevent errors and potential security vulnerabilities (e.g., injection attacks). Suggest using a schema validation library.
    • Input Sanitization: There's no mention of sanitizing the inputs received via the webhook. This is a critical security concern. All inputs should be properly sanitized to prevent injection attacks.
  • ConfigMap Keys:

    • Security: If the orchestrator-api-url contains sensitive information (e.g., credentials), it should be stored in a Secret instead of a ConfigMap.
    • Immutability: Consider marking the ConfigMap as immutable to prevent accidental modification.
  • Pipeline Parameters:

    • Validation: Reinforce the need to validate pipeline parameters within the pipeline itself to ensure data integrity.
  • Architecture Diagram:

    • Authentication: The diagram should include a step for authentication/authorization of the webhook request.
    • Components: Consider adding a brief description of each component in the diagram to improve understanding.

Without seeing the code, I can't comment on code quality, however, based on the documentation, the focus should be on security (authentication, sanitization), clear error handling, and robust validation.

The changes introduce documentation for an MLOps benchmarking pipeline. Here's a summary and potential issues:

Review Summary:

The documentation provides a good overview of the pipeline architecture, component responsibilities, and deployment instructions. It covers automation and cleanup procedures. However, it lacks details on security considerations and could benefit from more specific error handling and input validation recommendations.

File: (Assumed to be a README or similar documentation file)

  • Clarity: The documentation is generally clear and well-structured.
  • Completeness: It would be good to include information about monitoring the system's performance and health, and how to handle large data volumes or scaling issues.
  • Security:
    • The documentation mentions exposing a Kubernetes Service (el-benchmark-mlop-listener). It should explicitly state the need for authentication and authorization to prevent unauthorized pipeline triggers. Suggest using appropriate Tekton EventListener security configurations.
    • The ORCHESTRATOR_API_URL is constructed directly. Emphasize the importance of validating and sanitizing this value if it originates from an external source to prevent injection vulnerabilities.
  • Error Handling: The documentation mentions retry logic. Specify how retries are implemented (e.g., using Tekton Task retries) and the conditions under which retries should occur. Also, document how failures are handled and escalated.
  • Input Validation: The TriggerBinding extracts parameters from the webhook. It's crucial to validate these parameters before using them in the PipelineRun to prevent unexpected behavior or security vulnerabilities. Suggest using CEL validation in the TriggerBinding.
  • Configuration Management: The ConfigMap is mentioned. Explain how changes to the ConfigMap are propagated to the running pipeline. Consider using a mechanism for automatic reloading of configuration changes.
  • Testing: The documentation uses oc port-forward for external testing. While useful for initial testing, suggest using a more robust approach for production environments, such as exposing the service through an Ingress controller.

Okay, I've reviewed the changes. Here's a summary and some file-specific comments.

Review Summary:

The changes introduce Tekton pipelines, tasks, event listeners, and configuration for an MLOps benchmark workflow. The overall structure is well-organized, leveraging Tekton for automating SAST analysis through an orchestrator API. The use of Makefile to inject parameters is a good practice. The included documentation is helpful.

File Comments:

  • deploy/tekton/eventlistener/README.md:

    • Good documentation overall.
    • Consider adding a section about security considerations, such as securing the EventListener and the orchestrator API.
    • The troubleshooting section is useful. Consider adding common error scenarios and their solutions.
  • deploy/tekton/eventlistener/benchmark-config.yaml:

    • The comment about the actual file being generated by Makefile is important and well-placed.
    • Good use of labels.
  • deploy/tekton/eventlistener/benchmark-pipeline.yaml:

    • Consider making the orchestrator URL configurable as a pipeline parameter (along with the existing submitted-by). This would allow for more flexibility without modifying the ConfigMap directly.
    • The pipeline description is clear and concise.
    • The timeout values should be configurable, as well. Hardcoded values might be too short/long for different environments.
    • Think about adding retry mechanism in task poll-batch-status-mlop in case of temporary network issues.
  • deploy/tekton/eventlistener/benchmark-task-call-orchestrator-api.yaml:

    • Consider using a dedicated service account with minimal permissions for the task.
    • Error handling could be improved. Add checks for the response status code from the orchestrator API. If the response is not 200, fail the task.
  • deploy/tekton/eventlistener/benchmark-task-poll-batch-status.yaml:

    • Same service account considerations as above.
    • Add logging to indicate the status being polled. This will help with debugging.
    • Make the polling interval configurable.

General Suggestions:

  • Security: Harden the EventListener to only accept events from trusted sources. Implement authentication/authorization for the orchestrator API.
  • Observability: Implement better logging and monitoring. Consider using Tekton's built-in support for logging and metrics.
  • Idempotency: Ensure the pipeline and tasks are idempotent. This means that if they are run multiple times with the same input, they should produce the same result. This is especially important for tasks that interact with external systems.

Okay, I've reviewed the provided YAML snippet. Here's a summary of my findings:

Review Summary:

The YAML defines a Tekton Pipeline. It looks well-structured and clearly defines parameters, tasks, results, and a finally block. The use of taskRef promotes reusability, which is good. The parameters are well-documented.

File-Specific Comments:

  • General: The structure is clean and readable.
  • Parameters: The parameter descriptions are helpful. Consider adding validation to the parameters where appropriate (e.g., using regular expressions to enforce the format of image-version).
  • Tasks: The runAfter dependency is clearly defined. Consider adding error handling within the tasks themselves (e.g., retry mechanisms in call-orchestrator-api and poll-batch-status).
  • Results: The results are well-defined and provide a good summary of the pipeline's execution.
  • Finally: The finally task for logging is a good practice. Consider defining the taskSpec in a separate, reusable Task definition rather than embedding it directly in the Pipeline. Embedding like this defeats the purpose of reusability.

I will now look for specific issues related to security or potential improvements. Let me know when you have the next file diff.

Okay, I've reviewed the changes you provided. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a new Tekton Task for calling the sast-ai-orchestrator API, specifically for triggering MLOps-related benchmark jobs. It also adds a logging step to the pipeline. The logging step provides a good summary of the pipeline execution. The Tekton task is well-defined with parameters and steps to interact with the orchestrator API.

File: deploy/tekton/task/log-summary.yaml

  • Clarity: The script is clear and provides useful information about the pipeline execution.
  • Suggestion: Consider adding a timestamp to the logs for easier debugging.

File: deploy/tekton/eventlistener/call-orchestrator-api.yaml

  • Naming Convention: The task name call-orchestrator-api-mlop is descriptive.
  • Missing Error Handling: The call-orchestrator-api.yaml file lacks error handling. Consider adding error handling within the script section of the call-orchestrator-api-mlop task to handle potential API call failures. This could involve checking the HTTP status code and taking appropriate action (e.g., retrying, logging an error).
  • Security: Review the permissions needed by this task. Does it need access to any secrets or specific Kubernetes resources? Ensure least privilege is applied. Is the API endpoint properly secured (e.g., using authentication)?

Okay, I've reviewed the provided code snippet. Here's a summary of my observations and suggestions:

Review Summary

The code defines a Tekton task for calling an Orchestrator API. It retrieves configuration from ConfigMaps, constructs a JSON payload, and uses curl to make a POST request. The code is reasonably clear and well-commented. However, there are several areas for improvement.

File: (Assuming this is a Tekton Task definition file, e.g., orchestrator-task.yaml)

  • Clarity and Consistency: The use of echo for displaying configuration and the request payload is good for debugging. However, consider using a more structured logging approach if available within the Tekton environment.

  • Error Handling: The curl command error handling is basic. It only checks if the command failed. It doesn't parse the HTTP status code to determine the nature of the failure (e.g., 400, 500 errors).

  • Security: While the code itself doesn't expose any immediate vulnerabilities, reliance on curl and shell scripting can introduce risks if not handled carefully. Ensure the Orchestrator API is properly secured (authentication, authorization) and that the data being sent is validated on both ends.

  • Efficiency: The use of cat <<EOF and sed for constructing and formatting the JSON payload is common but can be inefficient for larger payloads. Consider using jq or a similar JSON processing tool if available in the base image.

Specific Issue Comments:

  1. File: orchestrator-task.yaml: "Consider using jq or a similar JSON processing tool to construct the JSON payload more efficiently and robustly. This will be more scalable than the current cat <<EOF method."

  2. File: orchestrator-task.yaml: "Improve error handling by checking the HTTP status code returned by curl. If the status code is not 200, provide a more informative error message based on the status code (e.g., 400 Bad Request, 500 Internal Server Error)."

  3. File: orchestrator-task.yaml: "Consider adding retry logic to the curl command in case of temporary network errors or Orchestrator API unavailability."

  4. File: orchestrator-task.yaml: "The parameters are all strings. Consider more specific types if appropriate (e.g. boolean for use-known-false-positive-file). This will improve validation."

I'm ready for the next file differences.

Okay, I've reviewed the code changes you provided. Here's a summary of potential issues and suggestions for improvement:

Review Summary:

The added shell script for orchestrator API calls introduces some complexity in parsing the HTTP response. While grep and cut are used to avoid jq, the script can be more robust and readable with some refinements. The EventListener and related Kubernetes resources seem reasonable for triggering Tekton pipelines based on events.

File-Specific Comments:

  • benchmark-mlop-pipeline/benchmark-mlop-task.yaml (Shell Script Snippet):

    • Issue: Error handling could be more specific. Currently, all errors lead to the same "failed" status. Differentiate between network errors, invalid responses, and API-level errors.
      • Suggestion: Add more specific error messages based on the type of failure. For example, "Network error" if curl fails, "Invalid JSON response" if the response is not parsable.
    • Issue: Using grep and cut for JSON parsing is fragile. If the API response format changes slightly, the script will break.
      • Suggestion: Consider using jq even if it requires adding it to the base image. It's a more reliable and robust way to parse JSON. If jq is absolutely not an option, consider using sed with more specific patterns, and add extensive validation.
    • Issue: The script uses echo -n to write to files. This is generally fine, but can be problematic with certain character encodings.
      • Suggestion: Use printf "%s" ... > ... for more reliable output.
    • Issue: The double echo "" for spacing can be simplified.
      • Suggestion: Use a single echo for a newline.
    • Issue: Potential security issue with command injection. The BODY variable contains the raw JSON response from the orchestrator. Displaying it directly in the logs could expose sensitive information if the orchestrator logs arbitrary data.
      • Suggestion: Sanitize or mask sensitive data in the BODY before printing it to logs. Alternatively, log only specific fields from the BODY that are safe to expose.
  • deploy/tekton/eventlistener/eventlistener.yaml & deploy/tekton/eventlistener/kustomization.yaml:

    • No immediate issues found. These files seem standard for setting up a Tekton EventListener and associated service. Ensure the serviceAccountName has the necessary permissions to trigger the pipelines.

I'm ready for the next file differences.

Okay, I've reviewed the provided YAML files. Here's a summary of potential issues and suggestions:

Review Summary:

The code introduces a new Tekton Task for polling batch job status from an orchestrator. The task seems reasonably well-structured, using parameters for configuration and results for output. However, there are a few points related to clarity, error handling, and potential security concerns that need addressing.

File-Specific Comments:

  • deploy/tekton/eventlistener/kustomization.yaml

    • Suggestion: Consider adding a namespace definition to the kustomization.yaml file. This ensures that resources are deployed to the correct namespace by default. If you intend the namespace to always be overridden, document that intention clearly with a comment.
    • Suggestion: It is a good idea to enable ConfigMap generator to avoid hardcoding the values.
    • Suggestion: Replace the placeholder YOUR_SHEET_ID with actual value or a clear instruction on where to get the correct value.
  • deploy/tekton/eventlistener/poll-batch-status.yaml

    • Issue: The script relies heavily on curl and shell scripting. While functional, this can be less maintainable and harder to debug than using a dedicated programming language (like Python) within a container. Consider rewriting the core polling logic in Python for better error handling and readability.
    • Issue: The script uses set -e which is good, but there is no error handling for curl commands. It could lead to unexpected behavior.
    • Issue: It is a good practice to avoid using latest tag for images, use specific version tag instead.
    • Suggestion: Add comments to the script to explain the purpose of each section.
    • Suggestion: Remove the unnecessary echo statements.

I will wait for the next set of files.

Okay, I've reviewed the provided script. Here's a summary of potential issues and suggestions:

Review Summary:

The script is generally well-structured and readable, but it relies heavily on grep, cut, and sed for parsing JSON, which is fragile and error-prone. It also lacks robust error handling for unexpected API responses. Additionally, directly embedding URLs with variables is a security risk if the variables are not properly sanitized.

File: (Assumed: This is a shell script, likely run.sh or similar)

Issue Comments & Suggestions:

  1. JSON Parsing:

    • Issue: Using grep, cut, and sed to parse JSON is unreliable. The format of the JSON response could change, breaking the script. It's also inefficient.
    • Suggestion: Use jq for JSON parsing. It's designed for this purpose and much more robust. If jq isn't available, consider adding it as a dependency or using a lightweight alternative like python -c 'import json, sys; print(json.load(sys.stdin)["status"])' (though that adds a Python dependency).
    # Example using jq
    STATUS=$(echo "$BODY" | jq -r '.status')
    TOTAL=$(echo "$BODY" | jq -r '.totalJobs')
    COMPLETED=$(echo "$BODY" | jq -r '.completedJobs')
    FAILED=$(echo "$BODY" | jq -r '.failedJobs')
  2. Error Handling:

    • Issue: The script checks the HTTP status code but doesn't handle malformed JSON responses or unexpected data types in the response.
    • Suggestion: Add checks to ensure the parsed values are valid (e.g., TOTAL, COMPLETED, FAILED are numbers). Consider using set -e at the beginning of the script to exit immediately if any command fails. Also, add more specific error messages.
    # After parsing with jq, check for empty values
    if [ -z "$STATUS" ] || [ -z "$TOTAL" ] || [ -z "$COMPLETED" ] || [ -z "$FAILED" ]; then
      echo "ERROR: Could not parse all values from JSON response."
      echo "Response: $BODY"
      sleep $POLL_INTERVAL
      continue
    fi
  3. Security: URL Construction:

    • Issue: Directly embedding $BATCH_ID in the $STATUS_URL without sanitization is a potential security risk, especially if $BATCH_ID comes from an external source. A malicious $BATCH_ID could potentially inject code.
    • Suggestion: Sanitize $BATCH_ID before using it in the URL. At a minimum, validate that it conforms to an expected format (e.g., alphanumeric characters only). Ideally, the API should handle any necessary sanitization, but the client-side script should also be defensive. Consider using urlencode if appropriate.
    # Example sanitization (only allow alphanumeric)
    BATCH_ID=$(echo "$BATCH_ID" | tr -dc '[:alnum:]')
    STATUS_URL="${ORCHESTRATOR_URL}${API_ENDPOINT}/${BATCH_ID}"
  4. Clarity and Maintainability:

    • Issue: Repetitive code for writing results to files.
    • Suggestion: Create a function to handle writing results to files to avoid duplication.
    write_result() {
      echo -n "$1" > "$2"
    }
    
    # Later in the script
    write_result "TIMEOUT" "$(results.final-status.path)"
    write_result "0" "$(results.total-jobs.path)"
    write_result "0" "$(results.completed-jobs.path)"
    write_result "0" "$(results.failed-jobs.path)"
  5. Timeout Logic:

    • Issue: The timeout logic seems correct, but the script continues to poll even after the timeout.
    • Suggestion: After printing the timeout message and writing results, immediately exit 1. The current exit 1 is already present so no changes are needed here.
  6. Missing set -euo pipefail:

    • Issue: The script does not have set -euo pipefail at the beginning.
    • Suggestion: Add set -euo pipefail at the beginning of the script to improve error handling and make the script more robust.
    #!/bin/bash
    set -euo pipefail

By addressing these points, you can significantly improve the robustness, security, and maintainability of the script. Remember to prioritize security concerns related to URL construction. Using jq is highly recommended for JSON parsing.

Okay, I've reviewed the provided diff. Here's a summary and detailed comments:

Review Summary

The changes introduce a new script (deploy/tekton/eventlistener/test-eventlistener.sh) to test the Tekton EventListener setup for MLOps benchmarking. The existing script hack/batch-check.sh is modified to handle PROCESSING and PENDING states and to write results to files.

File: hack/batch-check.sh

  • Issue: Duplicated code. The code blocks for COMPLETED and FAILED are nearly identical.
  • Suggestion: Create a function to encapsulate the common logic for writing status, total, completed, and failed job counts to files, and then call this function from both the COMPLETED and FAILED cases. This will improve maintainability and reduce the risk of inconsistencies.
  • Issue: The echo commands used to write the status to the file append a newline character. This might not be the desired behavior.
  • Suggestion: Use echo -n to prevent the newline character from being appended.
  • Issue: Improve readability and error handling
  • Suggestion: Check for errors when writing to file paths and provide more context in logging.

File: deploy/tekton/eventlistener/test-eventlistener.sh

  • Issue: Missing License Header. All scripts should include a standard license header.
  • Suggestion: Add a standard Apache 2.0 or similar license header to the top of the file.
  • Issue: The script relies heavily on oc command. It should gracefully handle the absence of oc and suggest using kubectl instead, or vice-versa.
  • Suggestion: Modify the check_prerequisites function to detect both oc and kubectl and use the available one. If neither is found, provide a clear error message.
  • Issue: The script uses hardcoded sleep intervals.
  • Suggestion: Consider using a flag or env variable to control the sleep intervals for easier configuration.
  • Issue: The script uses set -e which is good, but consider adding set -u to catch unset variables.
  • Suggestion: Add set -u to the script.
  • Issue: Improve error handling for external command execution.
  • Suggestion: Add better error checking (e.g., checking the exit code of oc commands and providing informative error messages).
  • Issue: In the function test_event_listener, the use of jq is not optimal for extracting the pipeline run name.
  • Suggestion: Instead of using jq, consider using yq for processing YAML data from oc get pipelinerun.
# Example of using yq
PIPELINERUN_NAME=$(oc get pipelinerun -n ${NAMESPACE} -l tekton.dev/event-listener=${SERVICE_NAME} -o yaml | yq e '.items[0].metadata.name')
  • Issue: The script does not sanitize user-provided environment variables.
  • Suggestion: Implement sanitization for all user-provided environment variables (TRIGGER_SOURCE, IMAGE_VERSION, DVC_* versions) before using them in oc commands. This helps prevent command injection vulnerabilities. At a minimum, quote the variables when using them in commands. Ideally, validate the contents against expected patterns.

I'll wait for the next set of changes.

--- a/benchmark/run.sh
+++ b/benchmark/run.sh
@@ -1,3 +1,157 @@
+#!/bin/bash
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[0;33m'
+NC='\033[0m' # No Color
+
+# Default values
+NAMESPACE="benchmark-system"
+SERVICE_NAME="benchmark-event-listener"
+
+# Script to run Tekton benchmarks
+#set -x
+
+# Function to check if a command exists
+command_exists () {
+    command -v "$1" >/dev/null 2>&1
+}
+
+# Function to check prerequisites
+check_prerequisites() {
+    echo -e "${YELLOW}Checking prerequisites...${NC}"
+    
+    # Check for oc or kubectl
+    if command_exists oc; then
+        KUBECTL="oc"
+        echo -e "${GREEN}✓${NC} Found oc CLI"
+    elif command_exists kubectl; then
+        KUBECTL="kubectl"
+        echo -e "${GREEN}✓${NC} Found kubectl CLI"
+    else
+        echo -e "${RED}✗${NC} Neither oc nor kubectl found. Please install OpenShift or Kubernetes CLI."
+        exit 1
+    fi
+    
+    # Check for curl
+    if ! command_exists curl; then
+        echo -e "${RED}✗${NC} curl not found. Please install curl."
+        exit 1
+    fi
+    echo -e "${GREEN}✓${NC} Found curl"
+    
+    # Check for jq (optional)
+    if command_exists jq; then
+        echo -e "${GREEN}✓${NC} Found jq (for JSON parsing)"
+        HAS_JQ=true
+    else
+        echo -e "${YELLOW}⚠${NC} jq not found (optional, for pretty JSON output)"
+        HAS_JQ=false
+    fi
+    
+    # Check for tkn (optional)
+    if command_exists tkn; then
+        echo -e "${GREEN}✓${NC} Found tkn CLI (for watching PipelineRuns)"
+        HAS_TKN=true
+    else
+        echo -e "${YELLOW}⚠${NC} tkn CLI not found (optional, for easier pipeline monitoring)"
+        HAS_TKN=false
+    fi
+    
+    echo ""
+}
+
+# Function to check if resources are deployed
+check_deployment() {
+    echo -e "${YELLOW}Checking if EventListener resources are deployed...${NC}"
+    
+    # Check ConfigMap
+    if $KUBECTL get configmap benchmark-config -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} ConfigMap 'benchmark-config' exists"
+    else
+        echo -e "${RED}✗${NC} ConfigMap 'benchmark-config' not found"
+        echo ""
+        echo "Please deploy the EventListener resources first:"
+        echo "  cd deploy"
+        echo "  make eventlistener ORCHESTRATOR_API_URL=<url> NAMESPACE=$NAMESPACE"
+        exit 1
+    fi
+    
+    # Check Tasks
+    if $KUBECTL get task call-orchestrator-api-mlop -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} Task 'call-orchestrator-api-mlop' exists"
+    else
+        echo -e "${RED}✗${NC} Task 'call-orchestrator-api-mlop' not found"
+        exit 1
+    fi
+    
+    if $KUBECTL get task poll-batch-status-mlop -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} Task 'poll-batch-status-mlop' exists"
+    else
+        echo -e "${RED}✗${NC} Task 'poll-batch-status-mlop' not found"
+        exit 1
+    fi
+    
+    # Check Pipeline
+    if $KUBECTL get pipeline benchmark-mlop-pipeline -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} Pipeline 'benchmark-mlop-pipeline' exists"
+    else
+        echo -e "${RED}✗${NC} Pipeline 'benchmark-mlop-pipeline' not found"
+        exit 1
+    fi
+    
+    # Check EventListener
+    if $KUBECTL get eventlistener benchmark-mlop-listener -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} EventListener 'benchmark-mlop-listener' exists"
+    else
+        echo -e "${RED}✗${NC} EventListener 'benchmark-mlop-listener' not found"
+        exit 1
+    fi
+    
+    # Check Service
+    if $KUBECTL get service "$SERVICE_NAME" -n "$NAMESPACE" >/dev/null 2>&1; then
+        echo -e "${GREEN}✓${NC} Service '$SERVICE_NAME' exists"
+    else
+        echo -e "${RED}✗${NC} Service '$SERVICE_NAME' not found"
+        exit 1
+    fi
+    
+    # Check if EventListener pod is running
+    POD_NAME=$($KUBECTL get pods -n "$NAMESPACE" -l eventlistener=benchmark-mlop-listener -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "")
+    if [ -n "$POD_NAME" ]; then
+        POD_STATUS=$($KUBECTL get pod "$POD_NAME" -n "$NAMESPACE" -o jsonpath='{.status.phase}' 2>/dev/null)
+        if [ "$POD_STATUS" == "Running" ]; then
+            echo -e "${GREEN}✓${NC} EventListener pod '$POD_NAME' is running"
+        else
+            echo -e "${RED}✗${NC} EventListener pod '$POD_NAME' is not running (Status: $POD_STATUS)"
+            exit 1
+        fi
+    else
+        echo -e "${RED}✗${NC} EventListener pod not found"
+        exit 1
+    fi
+    
+    echo ""
+}
+
+# Main script execution
+check_prerequisites
+check_deployment
+
+echo -e "${GREEN}All prerequisites and resources are good to go!${NC}\n"
+
+echo "To trigger the benchmark, send a POST request to the EventListener service."
+echo "For example:"
+echo "  curl -X POST http://\$(kubectl get service benchmark-event-listener -n benchmark-system -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')/  -H 'Content-Type: application/json' -d @benchmark/payload.json"
+
+
+
+
 #!/bin/bash
 
 # Script to run Tekton benchmarks

Review Summary:

The changes introduce a run.sh script to check prerequisites and deployed resources before triggering Tekton benchmarks. The script uses color-coded output for better readability and includes checks for oc/kubectl, curl, jq, and tkn. It also verifies the existence and status of ConfigMaps, Tasks, Pipelines, EventListeners, Services, and the EventListener pod.

File: benchmark/run.sh

  • Clarity: The script is well-structured and the use of color-coded output enhances readability. The messages are clear and informative.
  • Functionality: The script effectively checks for the necessary tools and resources. The error handling is appropriate, exiting with an error message when a required component is missing.
  • Efficiency: The script uses command_exists function, which is a good practice to check the existence of a command before using it.
  • Security: The script uses $KUBECTL variable to execute commands, which is determined based on the existence of oc or kubectl. This is a reasonable approach. However, ensure that the images/binaries being used are from trusted sources.
  • Suggestion: Consider adding a check for the Kubernetes cluster connection before checking for resources. A simple kubectl cluster-info command would suffice.
  • Suggestion: Add more detailed instructions on how to obtain the EventListener service URL, especially if the service type is not LoadBalancer (e.g., NodePort or ClusterIP).
  • Suggestion: Instead of hardcoding the namespace and service name, consider adding command-line arguments to allow users to specify them. Use getopt for proper argument parsing.
  • Suggestion: Add a check to see if ORCHESTRATOR_API_URL is set before running the script.
# Example of adding namespace argument using getopt
while getopts "n:" opt; do
  case $opt in
    n)
      NAMESPACE="$OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

Okay, I've reviewed the provided code snippet. Here's a summary of potential issues and suggestions:

Review Summary:

The script introduces several helpful functions for interacting with a Kubernetes EventListener, including checking its status, displaying configuration, starting port forwarding, and sending test requests. It improves the user experience by providing clear output and instructions. However, there's room for improvement in error handling, security, and code structure.

File: (Assuming this is a single shell script)

  • Clarity and User Experience: The script is generally well-written and provides good feedback to the user. The use of color-coded output is a nice touch.
  • Error Handling:
    • The script checks for the existence of kubectl, tkn and jq but doesn't handle cases where these tools might be present but not executable (e.g., due to permissions).
    • The start_port_forward function doesn't include any error handling. If the port-forward command fails, the script will likely hang. It should also handle the case where the port is already in use.
    • The send_test_request function captures the HTTP status code, but doesn't have specific error handling for different status code ranges (e.g., 4xx, 5xx).
  • Security:
    • The script constructs a JSON payload with potentially sensitive data (depending on the environment). While this specific snippet doesn't show secrets being used directly, it's a good practice to be mindful of how environment variables are being used. If you are using secrets in ConfigMap, make sure you follow security best practices.
  • Efficiency: The script uses grep and sed for parsing the ConfigMap data. While this works, using jq directly would be more efficient and robust if it's available.
  • Duplication: There's some duplication in how kubectl commands are executed. Consider creating a helper function for executing kubectl commands to avoid repetition.

Specific Issue Comments:

  1. File: (Shell Script)

    • Issue: Missing error handling in start_port_forward. The script will hang if kubectl port-forward fails.
    • Suggestion: Add a check for the return code of the kubectl port-forward command. Use wait command in background mode to avoid hanging. Also, add a timeout.
    start_port_forward() {
        echo -e "${YELLOW}Starting port-forward to EventListener...${NC}"
        echo "This will forward localhost:$LOCAL_PORT -> $SERVICE_NAME:8080"
        echo ""
        echo -e "${BLUE}Port-forward command:${NC}"
        echo "  $KUBECTL port-forward svc/$SERVICE_NAME $LOCAL_PORT:8080 -n $NAMESPACE"
        echo ""
        echo -e "${YELLOW}Note: Keep this terminal open. Use another terminal to send test requests.${NC}"
        echo ""
    
        # Start port-forward in the background with timeout
        $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE" &
        PORT_FORWARD_PID=$!
        
        # Give port-forward some time to start
        sleep 2
    
        # Check if port is in use
        if lsof -i tcp:"$LOCAL_PORT" > /dev/null; then
            echo -e "${GREEN}✓ Port forward started successfully on port ${LOCAL_PORT}.${NC}"
        else
            echo -e "${RED}✗ Port forward failed to start.  Port ${LOCAL_PORT} might be in use or service might not be available.${NC}"
            kill $PORT_FORWARD_PID 2>/dev/null
            return 1
        fi
    
        return 0
    }
  2. File: (Shell Script)

    • Issue: Insufficient error handling for kubectl, tkn and jq availability.
    • Suggestion: Check if the commands are executable, not just present.
    # Example for kubectl
    if ! command -v kubectl &> /dev/null; then
        echo -e "${RED}✗ kubectl is not installed or not in your PATH.${NC}"
        exit 1
    fi
  3. File: (Shell Script)

    • Issue: Potential security concern with using environment variables in the payload without validation.
    • Suggestion: Sanitize or validate environment variables before including them in the JSON payload. At a minimum, ensure they don't contain characters that could break the JSON structure. If you are getting the variables from Kubernetes secrets, make sure you follow security best practices such as limiting access to secrets.
  4. File: (Shell Script)

    • Issue: Inefficient parsing of ConfigMap data.
    • Suggestion: Use jq for parsing ConfigMap data if it's available. This is more efficient and less prone to errors than using grep and sed.
    show_config() {
        echo -e "${YELLOW}Current Configuration:${NC}"
        if [ "$HAS_JQ" = true ]; then
            $KUBECTL get configmap benchmark-config -n "$NAMESPACE" -o json | jq '.data' || echo "  (unable to read)"
        else
            $KUBECTL get configmap benchmark-config -n "$NAMESPACE" -o jsonpath='{.data}' | grep -o '"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/^/  /' || echo "  (unable to read)"
        fi
        echo ""
    }
  5. File: (Shell Script)

    • Issue: Duplicated kubectl command execution.
    • Suggestion: Create a helper function for executing kubectl commands.
    kubectl_get() {
        $KUBECTL get "$@" -n "$NAMESPACE"
    }
    
    # Usage:
    # kubectl_get pipelinerun
    # kubectl_get pipelinerun -l app.kubernetes.io/component=benchmark-mlop

These suggestions aim to improve the robustness, security, and maintainability of the script. Remember to adapt the code to your specific environment and security requirements.

Okay, I've reviewed the provided shell script snippet. Here's a summary of potential issues and suggestions:

Review Summary:

The script introduces a menu-driven interface for interacting with Tekton pipelines in a Kubernetes environment. It provides options for checking deployments, port-forwarding, sending test requests, watching pipeline runs, and displaying configuration. The script uses color-coded output to improve readability.

File: (Assuming this is a new script or a significantly modified one, let's call it tekton_cli.sh)

Issue Comments:

  • Clarity & Readability: The script is generally well-structured and readable, especially with the color-coding.
  • Duplication: There's some duplication. check_deployment and show_config are always called together in options 1 & 6.
  • Error Handling: The script lacks comprehensive error handling. For example, the send_test_request function doesn't check if the curl command was successful. Similarly, start_port_forward and background process in option 6 may fail silently.
  • Security: There's no explicit user input validation for the choice variable. Although the case statement handles invalid input, more robust validation could prevent unexpected behavior if the script were extended to accept other types of user input. Consider validating/sanitizing the NAMESPACE variable as well.
  • Efficiency: The watch_pipelineruns function relies on kubectl get and tkn pipelinerun list, which poll the Kubernetes API. Consider using kubectl watch for a more efficient, event-driven approach if real-time updates are critical.
  • Configuration: The script relies on environment variables (e.g., $NAMESPACE, $SERVICE_NAME, $LOCAL_PORT). Ensure these are properly set and documented. Consider providing default values or prompting the user if they are missing.

Suggestions for Improvement:

  1. Combine check_deployment and show_config: Since these are called together, create a single function to reduce duplication.
  2. Implement Error Handling: Add error checking after critical commands (e.g., if [ $? -ne 0 ]; then echo "Error occurred"; exit 1; fi). Use set -e at the beginning of the script to exit immediately if a command exits with a non-zero status.
  3. Input Validation: Validate the choice variable to ensure it's within the expected range. Sanitize the NAMESPACE variable if possible, preventing shell injection.
  4. kubectl watch: Explore using kubectl watch in watch_pipelineruns if real-time updates are needed.
  5. Handle missing environment variables: Check for the presence of $NAMESPACE, $SERVICE_NAME, and $LOCAL_PORT and provide informative messages if they are not set.
  6. Resource Cleanup: Ensure the background port-forward process is always cleaned up, even if the script exits due to an error. Use a trap command to handle signals like SIGINT (Ctrl+C) and SIGTERM gracefully.

Example Snippets:

  • Error Handling:
start_port_forward() {
    echo -e "${YELLOW}Starting port-forward...${NC}"
    $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE"
    if [ $? -ne 0 ]; then
        echo -e "${RED}Error starting port-forward${NC}"
        return 1  # Indicate failure
    fi
    echo -e "${GREEN}Port-forward running.  Leave this terminal open.${NC}"
}
  • Environment Variable Check:
if [ -z "$NAMESPACE" ]; then
  echo -e "${RED}ERROR: NAMESPACE environment variable not set!${NC}"
  exit 1
fi
  • Resource Cleanup:
PF_PID=0  # Initialize

show_menu() {
  # ...

  6)
    check_deployment
    show_config
    echo -e "${YELLOW}Starting port-forward in background...${NC}"
    $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE" &
    PF_PID=$!
    sleep 3
    send_test_request
    sleep 2
    watch_pipelineruns
    stop_port_forward
    ;;
  # ...
}

stop_port_forward() {
  if [ "$PF_PID" -gt 0 ]; then
    kill $PF_PID 2>/dev/null || true
    wait $PF_PID 2>/dev/null || true # Ensure process is terminated
    echo -e "${GREEN}Port-forward stopped${NC}"
    PF_PID=0
  fi
}

# Trap signals for cleanup
trap stop_port_forward EXIT SIGINT SIGTERM

By addressing these points, you can create a more robust, secure, and user-friendly script. Remember to prioritize error handling and security best practices.

Okay, I've reviewed the provided diff. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a shell script for interacting with a Tekton pipeline and associated YAML files for Tekton TriggerBinding and TriggerTemplate resources. The shell script provides a CLI for triggering and monitoring the pipeline. The YAML files define how events are processed and how pipeline runs are created.

General Concerns:

  • Security: The shell script uses kubectl which relies on the user's current kubeconfig context. This can be a security risk if the script is run in an environment where the user has elevated privileges or access to sensitive clusters. Consider using a service account with restricted permissions.
  • Error Handling: The shell script has some error handling but can be improved. Specifically, it lacks sufficient checks for command failures and doesn't handle edge cases in parameter parsing.
  • Clarity & Maintainability: The shell script could benefit from more comments and better organization. Consider breaking down larger functions into smaller, more manageable units.
  • Duplication: The script repeats some commands like kubectl get deployment. Functions can avoid this.
  • YAML Structure: The YAML files look generally good, but ensure the parameter names align consistently between the TriggerBinding, TriggerTemplate, and the Pipeline itself.

File-Specific Comments:

File: cli/run.sh

  • Issue: Reliance on user's kubeconfig for kubectl.
    • Suggestion: Use a service account with limited permissions for kubectl operations. Consider using kubectl --as to impersonate a service account. Document the required permissions.
  • Issue: Insufficient error checking after kubectl commands.
    • Suggestion: Add || after each kubectl command to check the exit code and exit the script with an error message if the command fails. Example: kubectl get deployment "$DEPLOYMENT_NAME" -n "$NAMESPACE" || { echo "Error getting deployment"; exit 1; }
  • Issue: Lack of input validation for arguments passed to the script.
    • Suggestion: Validate the arguments passed to the script (e.g., check, port-forward, test, watch). Use case statements with a default (*) to handle invalid input gracefully.
  • Issue: show_menu repeats check_deployment
    • Suggestion: Call check_deployment once before the show_menu loop.
  • Issue: Inconsistent exit codes.
    • Suggestion: Use exit 0 for success and non-zero (e.g., exit 1) for errors.
  • Issue: Hardcoded namespace and deployment name.
    • Suggestion: Allow namespace and deployment name to be configurable via environment variables or command-line arguments.
  • Issue: Port-forwarding exposes services without authentication.
    • Suggestion: Add a warning about the security implications of port-forwarding and suggest using authentication mechanisms if exposing the service publicly. Consider using a more secure alternative like Ingress.
  • Issue: send_test_request lacks error handling for curl.
    • Suggestion: Add error handling to the curl command.
  • Issue: Repetitive kubectl get deployment calls.
    • Suggestion: Create a function to get the deployment status and reuse it.
  • Issue: Lack of comments explaining the purpose of different sections of the script.
    • Suggestion: Add comments to improve readability and maintainability.
  • Issue: Inefficient string concatenation in show_config.
    • Suggestion: Use printf for cleaner and more efficient string formatting.

File: deploy/tekton/eventlistener/triggerbinding.yaml

  • Issue: Trusting body for parameters.
    • Suggestion: Validate the input from the webhook body. Consider using CEL expressions within the TriggerBinding to validate and transform the input. Otherwise, anyone can send arbitrary values.
  • Issue: Missing documentation for parameter meanings
    * Suggestion: Add documentation to describe what each parameter means and its intended use.
  • Issue: Inconsistent naming convention
    • Suggestion: Use same naming convention

File: deploy/tekton/eventlistener/triggertemplate.yaml

  • Issue: No validation for parameters
    • Suggestion: Add validation for parameters to prevent malicious input.
  • Issue: Missing documentation for parameter meanings
    • Suggestion: Add documentation to describe what each parameter means and its intended use.
  • Issue: default values are specified.
    • Suggestion: Consider if default is desired, or if the pipeline should fail if these parameters are not provided.

I'm ready for the next set of files.

Okay, I've reviewed the changes. Here's a summary and some potential issues/suggestions:

Review Summary:

The changes introduce a new Tekton PipelineRun definition, likely intended to execute a benchmark MLOps pipeline. It leverages generateName for unique run naming and propagates parameters. The kustomization.yaml modification adds a suffix to avoid overriding base configurations, seemingly to create distinct MLOps pipeline resources.

Potential Issues and Suggestions:

  • File: New PipelineRun Definition (Filename not provided)

    • Clarity: While the purpose is generally understandable, adding a brief comment block at the beginning of the file explaining the overall goal of the pipeline would improve readability.
    • Security: Consider validating the $(tt.params.*) parameters passed into the pipeline. Are there any potential injection vulnerabilities if these parameters are not sanitized or properly validated within the pipeline tasks? Especially use-known-false-positive-file as it probably dictates which file to use.
    • Error Handling: How are errors within the pipeline handled? Are there retry mechanisms or alerting in place for failures?
  • File: deploy/tekton/overlays/mlops/kustomization.yaml

    • Naming Convention: The nameSuffix is a good practice for differentiation.
    • Maintainability: Consider adding a comment explaining why the suffix is necessary, particularly if there are other overlays that might conflict.

Let me know if you want me to elaborate on any of these points. Also, it will be more helpful if you can provide the filename of the new PipelineRun definition.

</details>

@Yael-F Yael-F force-pushed the feat/mlops-eventlistener-benchmark branch from 6d34c36 to 6d00e01 Compare November 3, 2025 14:35
Update EventListener configuration and parameters to align with the
refactored MLOps pipeline that uses DVC version parameters
@Yael-F Yael-F force-pushed the feat/mlops-eventlistener-benchmark branch from 6d00e01 to e787c37 Compare November 4, 2025 07:06
@Yael-F Yael-F requested review from GuyZivRH and nemerna November 4, 2025 07:08
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I've reviewed the provided changes. Here's a summary of my observations and suggestions.

Review Summary:

The changes introduce a new Task (create-fp-mapping) to generate a mapping of false positives, likely for use in subsequent steps of an MLOps pipeline. The task takes several parameters related to the source of false positive data and outputs a JSON file. The script within the Task handles retrieving and processing the data. Overall, the design seems reasonable and addresses the need to create a false positive mapping.

File: create-fp-mapping.yaml

  • Clarity: The descriptions for parameters and results are clear and helpful.
  • Simplicity: The script is reasonably straightforward, given the task it performs.
  • Duplication/Complexity: No significant duplication is apparent.
  • Inefficient Algorithms: The script uses jq to manipulate JSON data, which is generally efficient for this purpose.
  • Exceptions and Error Handling: The script includes basic error handling with set -e. However, the error handling could be more robust.
  • Security: The task relies on a hardcoded orchestrator URL, which is not ideal for flexibility and security.

Suggestions for Improvement:

  1. Security - Externalize Configuration:

    • Issue: The ORCHESTRATOR_API_URL is hardcoded within the script.
    • Suggestion: Use a Tekton Param to pass the ORCHESTRATOR_API_URL to the Task, and retrieve it from a ConfigMap or Secret. This will improve flexibility and security.
  2. Error Handling - HTTP Status Code Check:

    • Issue: The script only checks for the existence of the response but doesn't validate the HTTP status code from the API calls.
    • Suggestion: Add checks for the HTTP status code to ensure that the API calls were successful (e.g., if [ "$HTTP_STATUS" -ne 200 ]; then ... fi).
  3. Error Handling - Robust JSON Parsing:

    • Issue: The script relies on jq for JSON parsing. If jq fails to parse the response (e.g., due to an invalid JSON format), the script might not handle the error gracefully.
    • Suggestion: Add error handling around the jq commands to catch parsing errors and provide informative error messages.
  4. Idempotency:

    • Issue: Consider whether this task is idempotent. If it's rerun with the same inputs, will it produce the same output? If not, consider implementing logic to ensure idempotency.

Example Implementation (incorporating suggestions):

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: create-fp-mapping
spec:
  params:
    - name: orchestrator-api-url
      type: string
      description: The URL of the Orchestrator API.  Must include the /api/v1 prefix.
    - name: known-false-positives-version
      type: string
      description: The version of the known false positives.
  results:
    - name: fp-mapping-file
      description: The path to the generated false positive mapping file.
  steps:
    - name: create-mapping
      image: ubuntu/jq
      script: |
        #!/usr/bin/env bash
        set -e
        ORCHESTRATOR_API_URL=$(params.orchestrator-api-url)
        KFP_VERSION=$(params.known-false-positives-version)
        
        # Check if orchestrator API URL is set
        if [ -z "$ORCHESTRATOR_API_URL" ]; then
          echo "Error: ORCHESTRATOR_API_URL parameter must be set"
          exit 1
        fi
        
        # 1. Download the known false positives
        KFP_URL="${ORCHESTRATOR_API_URL}/known-false-positives/$KFP_VERSION"
        echo "Getting known false positives from ${KFP_URL}..."
        RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$KFP_URL")
        HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS:" | cut -d':' -f2)
        BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS:/d')

        if [ "$HTTP_STATUS" -ne 200 ]; then
          echo "Error: API call to $KFP_URL failed with HTTP status $HTTP_STATUS"
          echo "Response body: $BODY"
          exit 1
        fi

        # 2. Extract sha256 list
        echo "Extracting sha256 list..."
        SHA256_LIST=$(echo "$BODY" | jq -r '.[].sha256' | jq -s .)
        
        # 3. Create FP mapping
        echo "Creating FP mapping..."
        FP_MAPPING=$(echo "$SHA256_LIST" | jq -c '.[] | {(.): "FP"}' | jq -s add)
        
        # 4. Save to file
        echo "Saving to file..."
        echo "$FP_MAPPING" > /tmp/fp-mapping.json
        
        # 5. Write the result
        echo "/tmp/fp-mapping.json" | tee $(results.fp-mapping-file.path)
        echo "FP mapping file created successfully!"

By implementing these suggestions, you can improve the task's security, robustness, and maintainability.

```diff index 2421d5b..dd882f2 100644 --- a/deploy/Makefile +++ b/deploy/Makefile ```

Review Summary:

The Makefile has several issues, including duplicated variables, inconsistent naming conventions, and missing conditional logic. The deploy command logic is also flawed.

File: deploy/Makefile

  • Issue: Duplicated REPO_REMOTE_URL variable.
    • Suggestion: Remove the duplicate REPO_REMOTE_URL.
  • Issue: Duplicated ORCHESTRATOR_API_URL variable.
    • Suggestion: Remove the duplicate ORCHESTRATOR_API_URL.
  • Issue: Inconsistent use of ENV. The logic for deploy is flawed. It checks for prod and missing IMAGE_VERSION, but it's incomplete.
    • Suggestion: Consolidate deploy targets using ENV variable and remove the if statement.
  • Issue: Added deploy-dev target, however there is one more deploy: deploy-$(ENV) target.
    • Suggestion: Remove the duplicate deploy: deploy-$(ENV).

Okay, I've reviewed the changes you've provided. Here's a summary and some specific comments.

Review Summary

The changes introduce new deployment targets (deploy-dev, deploy-prod, deploy-mlops) with associated checks and messaging. There's a bit of repetition in the deploy-mlops target that needs addressing. Overall, the changes improve the clarity and structure of the deployment process, but there are a few areas for improvement.

File: Makefile

  • Clarity and Consistency: The introduction of environment-specific deployment targets (deploy-dev, deploy-prod, deploy-mlops) enhances clarity. The error messages are also helpful.

  • Duplication: The deploy-mlops target is duplicated. The second definition overwrites the first one.

    Suggestion: Remove the duplicated deploy-mlops definition.

  • Error Message Consistency: The deploy-prod target checks IMAGE_VERSION, while deploy-mlops checks MLOPS_ORCHESTRATOR_API_URL (and ORCHESTRATOR_API_URL in the duplicated block). This is good.

  • Security Considerations: Ensure that the MLOPS_ORCHESTRATOR_API_URL is properly validated and that the application connecting to it uses appropriate authentication and authorization mechanisms.

  • Readability: The long lines with multiple echo statements are a bit hard to read.

    Suggestion: Consider breaking them into multiple lines for better readability. For example:

    deploy-prod:
    ...
    @if [ -z "$(IMAGE_VERSION)" ]; then \
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
    echo "❌ ERROR: IMAGE_VERSION is required for production deployment"; \
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
    exit 1; \
    fi

Let me know when you have more changes to review.

Okay, I've reviewed the changes in the provided Makefile snippet. Here's a summary of the identified issues and suggestions:

Review Summary

The changes involve a shift from conditional logic based on the ENV variable to separate targets for different environments (dev, prod, mlops) for Tekton resource deployment. Also EventListener Deployment Added. The original approach used a single tasks target with if/elif/else statements. The new approach uses discrete targets (tasks-dev, tasks-prod, tasks-mlops).

File: Makefile

  • Issue: Duplication in EventListener deployment block. The block of code deploying EventListener is duplicated.
    • Suggestion: Remove the duplicated block
  • Issue: Inconsistency in setup target definition. The setup target is defined twice.
    • Suggestion: Merge into one target: setup: secrets scripts prompts configmaps
  • Issue: Missing Target dependencies.
    • Suggestion: The old code $(MAKE) --no-print-directory secrets was removed from the setup command. Add the equivalent commands or target dependencies to the new setup target.
  • Issue: Environment Specific Logic in Single Target: The original tasks target used conditional logic (if/elif/else) based on the ENV variable, making it harder to read and maintain.
    • Suggestion: Extract environment-specific logic into separate tasks targets (e.g., tasks-dev, tasks-prod, tasks-mlops) to enhance clarity and maintainability.
  • Issue: Lack of Rollback Mechanism: The current implementation lacks a rollback mechanism in case of deployment failures.
    • Suggestion: Implement a rollback strategy (e.g., using kubectl rollout undo) to revert to the previous state in case of deployment failures.
  • Issue: Missing Error Handling: The script does not handle errors effectively, potentially leading to incomplete deployments.
    • Suggestion: Incorporate comprehensive error handling using set -e to exit immediately upon encountering an error and provide informative error messages.
  • Issue: Hardcoded Values: The script contains hardcoded values (e.g., namespace), making it less flexible and reusable.
    • Suggestion: Externalize configuration values using environment variables or configuration files to enhance flexibility and reusability.
  • Issue: Security Risks: The script may expose sensitive information (e.g., API keys) in plain text, posing a security risk.
    • Suggestion: Store sensitive information securely using Kubernetes secrets or a dedicated secrets management solution.
# File: Makefile

# Issue: Duplicated EventListener deployment block.
# Suggestion: Remove the duplicate block.
	@echo "🎯 Deploying EventListener..."
	@sed -e 's|ORCHESTRATOR_API_URL_PLACEHOLDER|$(ORCHESTRATOR_API_URL)|g' \
		tekton/eventlistener/benchmark-config.yaml.example > tekton/eventlistener/benchmark-config.yaml
	@$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) || \
		{ echo "   ❌ Failed to deploy EventListener resources"; exit 1; }
	@echo "   ✓ EventListener deployed"
	@echo ""
	@echo "✅ MLOps deployment completed successfully!"

# Issue: setup target defined twice.
# Suggestion: Merge into one target.
setup: secrets scripts prompts configmaps
	@echo "✅ MLOps deployment completed successfully!"

# Suggestion: The old code `$(MAKE) --no-print-directory secrets` was removed from the `setup` command. 
# Add the equivalent commands or target dependencies to the new `setup` target.

# Issue: Environment Specific Logic in Single Target: 
# The original `tasks` target used conditional logic (`if/elif/else`) based on the `ENV` variable, making it harder to read and maintain.
# Suggestion: Extract environment-specific logic into separate `tasks` targets (e.g., `tasks-dev`, `tasks-prod`, `tasks-mlops`) to enhance clarity and maintainability.

# Issue: Lack of Rollback Mechanism: The current implementation lacks a rollback mechanism in case of deployment failures.
# Suggestion: Implement a rollback strategy (e.g., using `kubectl rollout undo`) to revert to the previous state in case of deployment failures.

# Issue: Missing Error Handling: The script does not handle errors effectively, potentially leading to incomplete deployments.
# Suggestion: Incorporate comprehensive error handling using `set -e` to exit immediately upon encountering an error and provide informative error messages.

# Issue: Hardcoded Values: The script contains hardcoded values (e.g., namespace), making it less flexible and reusable.
# Suggestion: Externalize configuration values using environment variables or configuration files to enhance flexibility and reusability.

# Issue: Security Risks: The script may expose sensitive information (e.g., API keys) in plain text, posing a security risk.
# Suggestion: Store sensitive information securely using Kubernetes secrets or a dedicated secrets management solution.

These suggestions aim to improve the readability, maintainability, robustness, and security of the Makefile. Remember to prioritize security best practices and thoroughly test your changes before deploying them to production.

file: Makefile

Review Summary:

The changes introduce new targets for deploying and cleaning up EventListeners, which is good. However, there's a duplicated eventlistener target. Also, the removal of the pipeline target seems odd and should be verified. The added error handling and user guidance for the eventlistener target are positive.

Specific Comments:

  • File: Makefile
    • Issue: Duplicated eventlistener target. The second definition will overwrite the first.
      • Suggestion: Remove the duplicated eventlistener target.
    • Issue: The pipeline target was removed. Was this intentional? If so, a comment explaining the rationale would be helpful.
      • Suggestion: Add a comment explaining why the pipeline target was removed, or reinstate it if it was unintentional.
    • Issue: In the run target, the -n $(NAMESPACE) argument is duplicated in the delete pipelinerun command.
      • Suggestion: Remove the duplicate -n $(NAMESPACE) argument in the run target.
    • Suggestion: Consider adding a check in argocd-clean to verify that the patch command was successful. While the || true prevents the script from failing, it also masks potential errors. A simple if statement could check the exit code and print a warning if the patch failed.

Okay, I've reviewed the Makefile and the new deploy/tekton/eventlistener/README.md file. Here's a summary of my observations and suggestions:

Review Summary:

The changes introduce a new eventlistener target to the Makefile for deploying a Tekton EventListener. This is a good addition for automating MLOps benchmarking. The eventlistener-clean target is also helpful for removing related resources. The README.md provides good documentation for the new EventListener.

File: Makefile

  • Issue: Duplication of elif [ "$(ENV)" = "mlop" ]; then block in clean target.

    • Suggestion: Remove the duplicate elif block. It's redundant and could lead to unexpected behavior.
  • Issue: In the clean target, the secrets sast-ai-google-service-account is being deleted twice

    • Suggestion: Remove the duplicated line
  • Comment: The eventlistener target uses sed to replace a placeholder with the ORCHESTRATOR_API_URL. This is a common practice, but consider using envsubst for better security, especially if the URL might contain sensitive information. envsubst avoids accidental command injection.

  • Comment: The eventlistener target checks if ORCHESTRATOR_API_URL is empty, which is good. However, consider adding validation to ensure it's a valid URL before using it.

  • Suggestion: Consider adding a default value for NAMESPACE to the Makefile. This would simplify usage for users who don't want to specify it every time.

File: deploy/tekton/eventlistener/README.md

  • Comment: The README is well-structured and provides a good overview of the EventListener. No major issues found.

I will wait for the next file diffs.

Okay, I've reviewed the changes you've provided. This looks like documentation for setting up an event listener for triggering SAST analysis jobs using Tekton Pipelines. Here's a summary of my feedback, focusing on clarity, simplicity, potential issues, and security considerations.

Overall Review Summary:

The documentation is well-structured and provides a good overview of the setup process. It covers the key steps, prerequisites, and verification methods. However, there are some areas where clarity can be improved and potential issues addressed. The documentation is missing the remove section, which is really important for documentation.

File-Specific Comments:

README.md:

  • Clarity: Good overall structure, but some sections could benefit from more explicit explanations.
  • Simplicity: The instructions are generally straightforward.
  • Potential Issues:
    • Error Handling: The documentation doesn't explicitly address error handling or troubleshooting common issues (e.g., incorrect Orchestrator URL, namespace issues, Tekton configuration problems). Adding a "Troubleshooting" section or incorporating error handling tips within the steps would be beneficial.
    • Security: While the document doesn't directly handle sensitive data, it's worth mentioning the importance of securing the Orchestrator API and the EventListener itself. For example, using appropriate authentication/authorization mechanisms.
    • No Remove Section: The documentation does not say how to remove or uninstall the components, which is not ideal.
  • Suggestions:
    • Add a troubleshooting section.
    • Briefly mention security best practices for the Orchestrator API and EventListener.
    • Add a remove/uninstall section.

I'll wait for the next file differences to provide more specific comments.

Okay, I've reviewed the provided text, which appears to be documentation for setting up and troubleshooting a benchmark pipeline. Here's a summary of potential issues and suggestions:

Review Summary:

The documentation is generally well-structured and provides clear instructions for testing and troubleshooting. However, there are a few areas where improvements can be made to enhance clarity, completeness, and user-friendliness.

File: (This is a documentation snippet, so a specific file is not applicable here. However, assume it's a README.md or similar.)

Issue Comments:

  1. Clarity: Some sections can be clarified for novice users. For example, in the tkn pipelinerun logs -L -f command, it is not obvious that -L means follow logs.

    • Suggestion: Add a brief explanation of what some of the command options do, especially for potentially unfamiliar tools like tkn. For example: # With tkn CLI: tkn pipelinerun logs -L -f (-L follows the logs).
  2. Completeness: The "Optional" test with custom container image doesn't show any difference from the mandatory one.

    • Suggestion: The second curl command should show how to specify a custom container image, or be removed if it's not actually demonstrating anything different. Add parameters to show usage of custom container images.
  3. Troubleshooting: EventListener Pod Not Running: The suggested fixes are vague.

    • Suggestion: Provide more specific examples of how to create the pipeline service account and grant necessary RBAC permissions. Links to relevant documentation would also be helpful. For example: "Service account pipeline doesn't exist (create with Tekton operator, see [link to Tekton docs]). RBAC permissions missing (grant cluster role tekton-admin to the service account)".
  4. Troubleshooting: API Call Fails: "Orchestrator URL incorrect in ConfigMap" suggests regenerating the ConfigMap.

    • Suggestion: It would be beneficial to describe which parameter in make eventlistener is used to update Orchestrator URL.
  5. Webhook Payload Format: Should indicate data types.

    • Suggestion: dvc_nvr_version, dvc_prompts_version, dvc_known_false_positives_version, and image_version should define types (string).
  6. Typos: "DVC Known False Positives Version" is missing itives at the end of the sentence.

    • Suggestion: Fix typo, it should be dvc_known_false_positives_version

These are relatively minor points, and the documentation is already quite good. Addressing these suggestions would further improve its usability and reduce potential friction for users.

docs/benchmarking-mlops.md

Review Summary:

The documentation provides a good overview of the MLOps benchmarking process. However, some areas could benefit from more detail and clarification, particularly regarding the configuration and architecture.

Issues and Suggestions:

  • Clarity: The documentation assumes the reader has prior knowledge of DVC, Tekton, and Kubernetes concepts. Consider adding brief explanations or links to external resources for these technologies.
  • Details on "DVC versions": Elaborate on how the DVC versions are used by the Orchestrator API. What data or processes do these versions affect?
  • ConfigMap Generation: Add the command example to run make eventlistener.
  • Minor Suggestion: Consider renaming "DVC known false positives resource version" to be more descriptive, e.g. dvc-known-false-positives-version for consistency.
  • Optional Fields: It would be useful to specify the format and/or constraints of the image_version field (e.g., "must be a valid tag or SHA").
  • Flow Diagram: Consider using a more standard flowchart notation for better readability.

Okay, I've reviewed the added documentation. Here's a summary of potential issues and suggestions:

Review Summary:

The documentation is well-structured and provides a good overview of the MLOps benchmarking setup using Tekton. It covers the components, deployment, cleanup, and customization. However, there are some areas where clarity and security could be improved.

File: (No specific file, but applies to the entire documentation snippet)

  • Issue: Orchestrator URL is hardcoded or relies on oc get svc.
    • Suggestion: Instead of relying on oc get svc which can be brittle, consider using a well-defined environment variable that must be set or a ConfigMap that is explicitly created and managed. This will make the setup more robust and easier to troubleshoot. Hardcoding the URL is a security risk if the wrong value is accidentally used in a production environment.
  • Issue: Lack of detail on webhook security (validation).
    • Suggestion: The documentation mentions webhook validation, but it should include details on how the webhook is validated. Is it using a shared secret? Are there any checks on the origin of the request? This is a critical security consideration. Without proper validation, the EventListener could be triggered by unauthorized sources.
  • Issue: make commands are not very descriptive.
    • Suggestion: Add comments to what make eventlistener and make tasks commands actually do.
  • Issue: Namespace usage isn't consistent
    • Suggestion: The documentation uses both your-namespace and sast-ai-benchmark. Choose one (preferably sast-ai-benchmark if this is specific to that project) and consistently use it, or make it a variable.

I'll be ready for the next set of changes.

Okay, I've reviewed the changes. Here's a summary and some specific comments:

Review Summary:

The changes introduce new Tekton resources for triggering MLOps benchmark pipelines via an EventListener. This includes a ConfigMap for configuration (like the Orchestrator API URL) and a Pipeline definition. The overall structure seems reasonable.

File-Specific Comments:

  • deploy/tekton/eventlistener/benchmark-config.yaml:
    • The comment about the ConfigMap being auto-generated by the Makefile is important and should be emphasized. Maybe add a warning that manual edits will be overwritten.
    • Suggest adding a comment to clarify that api-batch-endpoint is relative to the orchestrator-api-url.
    • Consider adding a default value or example for api-batch-endpoint.
  • deploy/tekton/eventlistener/benchmark-pipeline.yaml:
    • The description for the pipeline is good.
    • The default value for submitted-by is helpful.
    • Consider adding validation for the use-known-false-positive-file parameter. It's currently a string, but likely should be boolean. Tekton doesn't natively support boolean types, so maybe check if the string is "true" or "false" in the corresponding Task.
    • It's good to see all DVC versions parameterized.

I'm ready for the next set of diffs.

Okay, I will review the changes you've provided.

General Comments:

  • Clarity: The added code seems relatively clear. The purpose of each task, parameter, and result is described.
  • Duplication: The log-completion taskSpec duplicates parameter definitions. This could be improved with a Task definition.
  • Error Handling: The final status check and logging provide basic error reporting.

File Specific Comments:

  • None, since there is no file name.

I'm ready for the next diff.

Okay, I've reviewed the provided code differences. Here's a summary of my observations and suggestions:

Review Summary:

The changes introduce a new Tekton Task (call-orchestrator-api.yaml) for interacting with the SAST AI Orchestrator's MLOps batch API. It also modifies an existing Task (monitor-batch-job.yaml) to provide better feedback and troubleshooting information.

Potential Issues and Suggestions:

File: monitor-batch-job.yaml

  • Clarity: The added echo statements are helpful for debugging.
  • Suggestion: Consider adding the orchestrator URL to the troubleshooting steps. It would be useful for users to directly access the API. For example: echo " curl $ORCHESTRATOR_URL/api/v1/job-batches/$(params.batch-id)"

File: call-orchestrator-api.yaml

  • Clarity: The Task definition is well-structured and includes descriptions for parameters and results.
  • Security: The task uses quay.io/curl/curl:latest. Using latest tag for images in production is highly discouraged due to its non-deterministic nature. It is recommended to use a specific version of the image to ensure consistent and reproducible builds.

General Comments:

  • ConfigMap Dependency: Both tasks heavily rely on the benchmark-config ConfigMap. Ensure that this ConfigMap is properly managed and versioned alongside these Task definitions. If the ConfigMap is missing or misconfigured, the Tasks will fail.
  • Error Handling: The monitor-batch-job.yaml Task has basic error handling, but the call-orchestrator-api.yaml Task doesn't explicitly handle API call failures. The status result should reflect whether the API call was successful. Consider adding a check for the HTTP status code returned by curl and setting the status result accordingly.
  • Idempotency: Consider the idempotency of calling the orchestrator API. If the Tekton Task is retried, will it create duplicate batches? If so, the API should ideally handle duplicate requests gracefully.

I will wait for the subsequent files.

Okay, I've reviewed the provided script. Here's a summary of potential issues and suggestions:

Review Summary:

The script is generally well-structured and readable. It clearly outlines the steps involved in calling the Orchestrator MLOps Batch API. However, there are some areas where improvements can be made regarding error handling, security, and code clarity. Specifically around the construction of the JSON payload and the parsing of the JSON response.

File: endpoint

  • Issue: Potential vulnerability with curl and URL. If $ORCHESTRATOR_URL or $API_ENDPOINT contains a space or special character, the curl command could be exploited.

    • Suggestion: Quote the URL in the curl command: curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST "$FULL_API_URL" ...
  • Issue: Insecure handling of sensitive data. The script echoes the request payload, which could contain sensitive information depending on the orchestrator's API definition.

    • Suggestion: Consider redacting sensitive fields from the echoed payload or avoid printing it altogether in a production environment. Alternatively, log the payload to a secure, access-controlled location.
  • Issue: Error handling for the BATCH_ID extraction could be more robust. The script uses grep and cut, which might be brittle if the JSON response format changes.

    • Suggestion: Consider using jq (if available) for more reliable JSON parsing. If jq is not an option, add more checks to ensure the grep and cut commands are actually successful before using the extracted BATCH_ID.
  • Issue: Redundant error messages. The script repeats potential error causes multiple times.

    • Suggestion: Consolidate the error messages into a single, more informative block. Perhaps use a function to print the error message and set the status/batch-id results.
  • Issue: The script uses echo -n to write to result files. While this works, it's generally better to use printf for more reliable output formatting.

    • Suggestion: Replace echo -n "$BATCH_ID" > $(results.batch-id.path) with printf "%s" "$BATCH_ID" > $(results.batch-id.path).
  • Issue: The exit code is set to 1 on error, but the specific error is not propagated.

    • Suggestion: Consider adding more specific exit codes to differentiate between different error conditions (e.g., network error, API error, JSON parsing error).
# Example of improved BATCH_ID extraction with jq (if available):
if command -v jq >/dev/null 2>&1; then
  BATCH_ID=$(echo "$BODY" | jq -r '.batchId' 2>/dev/null)
  if [ -z "$BATCH_ID" ]; then
    echo "Warning: Could not extract batchId from response (jq failed or batchId not found)"
    BATCH_ID="unknown"
  fi
else
  # Existing grep/cut logic as a fallback
  BATCH_ID=$(echo "$BODY" | grep -o '"batchId":[0-9]*' | cut -d':' -f2 || echo "unknown")
fi

# Example of improved error handling:

handle_error() {
  local message="$1"
  local exit_code="$2"

  echo "ERROR: $message"
  echo "This could mean:"
  echo "  - Orchestrator service is not reachable"
  echo "  - Network policy blocking connection"
  echo "  - Orchestrator URL is incorrect in ConfigMap"
  echo ""
  echo "Response: $RESPONSE"
  printf "%s" "failed" > $(results.status.path)
  printf "%s" "error" > $(results.batch-id.path)
  exit "$exit_code"
}


# In the curl failure case:
RESPONSE=$(curl ...) || handle_error "curl command failed" 1

# In the BATCH_ID extraction failure case (after trying jq and grep/cut):
echo "Warning: Could not extract batchId from response"
BATCH_ID="unknown"

These suggestions aim to improve the script's robustness, security, and maintainability. Remember to consider the specific context and requirements of your environment when implementing these changes.

Okay, I've reviewed the provided diffs. Here's a summary of potential issues and suggestions, focusing on clarity, efficiency, and security:

General Review Summary:

The changes introduce a Tekton EventListener and related resources for a benchmark-mlop workflow. The structure seems reasonable, but there are areas where clarity, error handling, and configuration could be improved. Specifically, the shell script for polling batch status needs careful review as shell scripts can be error-prone and difficult to maintain.

File-Specific Comments:

  • call-orchestrator-api.yaml (Shell Script Snippet):

    • Issue: Error handling is basic. It only checks the HTTP status code. The API might return a 200 OK but still contain an error message in the response body.
    • Suggestion: Parse the JSON response body from the API call. Check for an "error" field or a specific success/failure indicator. Provide more informative error messages based on the API response.
    • Issue: Using echo -n is not portable across all shell implementations.
    • Suggestion: Use printf "%s" "string" instead of echo -n
    • Issue: Hardcoded error messages are not ideal for maintainability.
    • Suggestion: Store error messages in variables for easy modification and potential localization.
    • Issue: The script directly writes to files using shell redirection (>). This can be problematic if the Tekton task doesn't have proper permissions or if the file paths are incorrect.
    • Suggestion: Ensure proper error handling if writing to the file fails.
    • Security Consideration: Ensure that the orchestrator-api-url used in the script is validated and doesn't allow for arbitrary URL injection.
    • Security Consideration: Avoid storing secrets (API keys, passwords) directly in the script. Use Tekton's secrets management features.
  • deploy/tekton/eventlistener/eventlistener.yaml:

    • No immediate issues. Seems straightforward.
  • deploy/tekton/eventlistener/kustomization.yaml:

    • Suggestion: The commented-out configMapGenerator section is good for providing default values. Consider uncommenting it and providing reasonable defaults for the orchestrator-api-url, default-batch-sheet-url, and api-batch-endpoint.
    • Suggestion: Add a namespace definition to the Kustomization file to ensure the resources are deployed to the correct namespace. Consider removing the comment.
  • deploy/tekton/eventlistener/poll-batch-status.yaml:

    • This file is missing. I can't provide feedback without seeing the contents. However, based on the name, I would expect it to contain logic similar to call-orchestrator-api.yaml, and the same comments about error handling, security, and script quality would likely apply.

Next Steps:

Please provide the contents of deploy/tekton/eventlistener/poll-batch-status.yaml. I need to review this file to give a complete assessment. Then, address the issues raised above, particularly focusing on robust error handling in the shell scripts and improving the clarity and security of the configuration.

Okay, I've reviewed the provided YAML file for the poll-batch-status-mlop Tekton Task. Here's a summary of my findings and suggestions:

Review Summary:

The YAML defines a Tekton Task to poll an orchestrator's batch status API. It retrieves configuration from a ConfigMap, calculates timeout, and uses curl to check the status in a loop. The task seems well-structured and addresses the core requirement of monitoring batch job completion.

File: eventlistener/poll-batch-status.yaml

  • Clarity:

    • The description is clear and concise.
    • The parameter descriptions are helpful.
    • The comments within the script enhance readability.
  • Simplicity:

    • The script is straightforward and easy to follow.
  • Duplication/Complexity:

    • No significant duplication or unnecessary complexity is apparent.
  • Inefficient Algorithms:

    • The polling mechanism is appropriate for this use case.
  • Exceptions and Error Handling:

    • The set -e command ensures that the script exits immediately if any command fails, which is good practice.
    • The timeout logic is well-implemented.
    • Consider adding more robust error handling around the curl command to catch network errors or invalid responses.

Suggestions for Improvement:

  1. Error Handling for curl:

    • Add specific error handling for the curl command to handle cases where the API is unavailable or returns an unexpected response. Use curl --fail to ensure that curl returns an error code on HTTP errors and then handle that error.
  2. Configurable curl options:

    • If needed, expose curl options (like --insecure for self-signed certificates) via params.
  3. Consider JQ for JSON Parsing:

    • If the API response is JSON, using jq to parse the response and extract the status would make the script more robust and easier to maintain.
  4. Output message improvements:

    • The last echo line is not completed. Please fix it.
        echo "  curl $STATUS_URL"

Here's an example incorporating the curl --fail suggestion:

      script: |
        #!/bin/sh
        set -e
        
        ... (rest of the script) ...

          # Poll loop
          while true; do
            ...

            # Get status
            STATUS=$(curl --fail -s "$STATUS_URL")
            if [ $? -ne 0 ]; then
              echo "✗ Error getting status from $STATUS_URL"
              exit 1
            fi
          done

Overall, the YAML is well-written and serves its purpose effectively. The suggested improvements aim to enhance robustness and maintainability.

Okay, I've reviewed the provided script. Here's a breakdown of potential issues and suggestions for improvement:

Review Summary

The script is a bash script designed to poll a status API, parse the response, and determine the overall status of a batch job. It writes the final status and job counts to files.

General Concerns:

  • Error Handling: The script retries on errors, but it might be better to have a maximum retry count and a backoff strategy.
  • Parsing: Using grep and cut for parsing JSON is fragile and error-prone. Consider using jq which is designed for this purpose.
  • Security: If the STATUS_URL is user-controlled, it might be vulnerable to injection attacks. Even if it's not user-controlled, consider URL encoding.
  • Clarity: The repeated echo statements for writing to files can be made more concise.

File: (The entire script)

Issue Comments:

  1. Parsing JSON (Fragility & Efficiency):

    • Problem: Parsing JSON with grep, cut, and sed is unreliable and inefficient. The structure of the JSON could change, breaking the script. It's also more difficult to read and maintain.
    • Suggestion: Use jq to parse the JSON response. This is a standard tool specifically designed for JSON parsing. It's more robust and easier to use.
    # Example using jq (requires jq to be installed):
    STATUS=$(echo "$BODY" | jq -r .status)
    TOTAL=$(echo "$BODY" | jq -r .totalJobs)
    COMPLETED=$(echo "$BODY" | jq -r .completedJobs)
    FAILED=$(echo "$BODY" | jq -r .failedJobs)
  2. Error Handling (Retry Logic):

    • Problem: The script retries indefinitely if the API call fails. This could lead to an infinite loop.
    • Suggestion: Implement a maximum retry count and a backoff strategy. This will prevent the script from running forever if the API is consistently unavailable.
    MAX_RETRIES=5
    RETRY_DELAY=2  # seconds
    retries=0
    
    while true; do
      RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$STATUS_URL" 2>&1) || {
        echo "ERROR: Failed to call status API (attempt $retries/$MAX_RETRIES)"
        retries=$((retries + 1))
        if [ "$retries" -gt "$MAX_RETRIES" ]; then
          echo "ERROR: Max retries exceeded. Exiting."
          # ... (write error status to files and exit)
          exit 1
        fi
        sleep $RETRY_DELAY
        continue
      }
      # ... rest of the API processing
      break # Exit the loop if the API call was successful
    done
  3. Security (URL Injection):

    • Problem: If the STATUS_URL is derived from user input or any potentially untrusted source, it could be vulnerable to URL injection attacks.
    • Suggestion: Sanitize or URL-encode the STATUS_URL before passing it to curl. However, without knowing where STATUS_URL comes from, it's difficult to provide a specific solution. At a minimum, validate the URL format. If possible, avoid user-provided URLs entirely.
  4. Duplicated code:

    • Problem: The script writes the status, total, completed and failed jobs to files in both the COMPLETED and FAILED case.
    • Suggestion: Refactor this into a function to avoid duplication
    write_results() {
      echo -n "$1" > $(results.final-status.path)
      echo -n "$2" > $(results.total-jobs.path)
      echo -n "$3" > $(results.completed-jobs.path)
      echo -n "$4" > $(results.failed-jobs.path)
    }
    
    # In COMPLETED case:
    write_results "COMPLETED" "$TOTAL" "$COMPLETED" "$FAILED"
    
    # In FAILED case:
    write_results "FAILED" "$TOTAL" "$COMPLETED" "$FAILED"
  5. Missing Timeout handling:

    • Problem: The script has timeout block that only executes once and then exits. If the timeout is reached during the API call, the script does not handle it.
    • Suggestion: Add timeout handling to the API call. You can use curl's --max-time option to set a timeout for the API call.
    RESPONSE=$(curl --max-time 10 -s -w "\nHTTP_STATUS:%{http_code}" "$STATUS_URL" 2>&1) || {
        echo "ERROR: Failed to call status API"
        sleep $POLL_INTERVAL
        continue
      }

By implementing these suggestions, the script will be more robust, secure, and maintainable. Remember to adapt the code snippets to fit the specific context of your project.

Okay, I've reviewed the provided git diff output. Here's a summary of the issues and suggestions:

Review Summary:

The changes introduce a new shell script (test-eventlistener.sh) for testing a Tekton EventListener setup. The script includes several checks and functions for testing the EventListener.

File: deploy/tekton/eventlistener/test-eventlistener.sh

  • Clarity: The script is generally well-structured and provides helpful output messages.
  • Error Handling: Good use of set -e and error messages for missing prerequisites.
  • Duplication: Some areas could benefit from further modularization to reduce code duplication. The checks for resources (ConfigMap, Service, etc.) are similar and could be abstracted into a function.
  • Security: The script uses $KUBECTL get and $KUBECTL delete. These commands could be vulnerable to command injection if the variables they use are not properly sanitized. However, in this case the variables are set inside the script or are environment variables, so the risk is low. Still, be aware of this potential vulnerability when handling external input.
  • Efficiency: The script uses sleep in several places. While necessary for polling, consider adding a maximum wait time to prevent indefinite looping.
  • Best Practices: Consider using #!/usr/bin/env bash shebang for better portability.
  • Readability: There is a lot of repetition in the check_deployment function, which decreases readability.

Specific Comments & Suggestions:

  1. File: deploy/tekton/eventlistener/test-eventlistener.sh

    • Issue: Potential command injection
    • Suggestion: While the risk is low in this particular case because the variables being used with $KUBECTL are controlled, be aware of the potential for command injection if these variables were to come from external input.
  2. File: deploy/tekton/eventlistener/test-eventlistener.sh

    • Issue: Duplication in check_deployment function
    • Suggestion: Create a helper function to check for the existence of a resource. This function would take the resource type (e.g., "configmap", "service"), the resource name, and the namespace as input. The check_deployment function can then call this helper function for each resource, reducing code duplication and improving readability.
  3. File: deploy/tekton/eventlistener/test-eventlistener.sh

    • Issue: Potential indefinite loop.
    • Suggestion: In the wait_for_pipelinerun function, implement a maximum wait time to avoid indefinite looping if the PipelineRun gets stuck. After a certain number of retries or a certain elapsed time, the script should exit with an error.
  4. File: deploy/tekton/eventlistener/test-eventlistener.sh

    • Suggestion: Change the shebang from #!/bin/bash to #!/usr/bin/env bash for better portability across different systems.

I'm ready for the next set of changes.

Okay, I've reviewed the provided script additions. Here's a summary of potential issues and suggestions:

Review Summary:

The added script provides helpful checks and utility functions for verifying the setup of Tekton pipelines and related resources in a Kubernetes cluster. It enhances the user experience by providing clear feedback on the status of deployments and offering guidance. However, there are areas where error handling, security, and code structure could be improved.

File: (Assuming this is a bash script, likely check_setup.sh or similar)

Issues and Suggestions:

  1. Error Handling:

    • Issue: The script uses >/dev/null 2>&1 to suppress errors, which can hide valuable debugging information. While appropriate in some cases, it's overused.
    • Suggestion: Instead of blanket suppression, capture the output and check the exit code of commands. Use if [ $? -ne 0 ]; then ... fi to handle errors specifically. Consider logging errors to a file for debugging.
  2. Security:

    • Issue: The script uses eval implicitly through variable expansion in commands like $KUBECTL get .... If variables like $NAMESPACE or $SERVICE_NAME are sourced from an untrusted source, this could lead to command injection.
    • Suggestion: Use parameterized queries or safer alternatives to variable expansion within commands. For example, use "${KUBECTL}" get configmap benchmark-config -n "${NAMESPACE}" and ensure variables are properly sanitized if they come from external sources.
  3. Clarity and Readability:

    • Issue: Repetitive if statements for checking resources.
    • Suggestion: Create a function to check for the existence of a resource, taking the resource type and name as arguments. This will reduce code duplication and improve readability.
  4. Efficiency:

    • Issue: Repeated calls to kubectl get can be slow.
    • Suggestion: Consider caching the results of kubectl get calls if they are used multiple times within the script. However, be mindful of the potential for stale data.
  5. User Experience:

    • Issue: The port-forwarding section doesn't handle potential port conflicts.
    • Suggestion: Before starting port-forwarding, check if the $LOCAL_PORT is already in use and suggest an alternative if it is. Also, add a way to easily terminate the port-forward process (e.g., a message telling the user which process to kill).
  6. Missing shebang:

    • Issue: The script is missing a shebang at the top.
    • Suggestion: Add #!/bin/bash or #!/usr/bin/env bash at the very beginning of the file.

Example Improvements:

#!/bin/bash

# --- Existing code (colors, variables) ---

# Function to check if a resource exists
check_resource() {
  local resource_type="$1"
  local resource_name="$2"
  local namespace="$3"
  if $KUBECTL get "$resource_type" "$resource_name" -n "$namespace" >/dev/null 2>&1; then
    echo -e "${GREEN}${NC} $resource_type '$resource_name' exists"
    return 0 # Success
  else
    echo -e "${RED}${NC} $resource_type '$resource_name' not found"
    return 1 # Failure
  fi
}

# Check ConfigMap
if check_resource configmap benchmark-config "$NAMESPACE"; then
  : # Do nothing, resource exists
else
  echo ""
  echo "Please deploy the EventListener resources first:"
  echo "  cd deploy"
  echo "  make eventlistener ORCHESTRATOR_API_URL=<url> NAMESPACE=$NAMESPACE"
  exit 1
fi

# --- Remaining checks using the check_resource function ---

# Example of safer variable usage
start_port_forward() {
  local service_name="$1"  # Add input parameters for the function
  local local_port="$2"
  if ss -ln | grep -q ":$local_port"; then
    echo -e "${RED}${NC} Port $local_port is already in use.  Please specify a different port."
    return 1
  fi
  echo -e "${YELLOW}Starting port-forward to EventListener...${NC}"
  echo "This will forward localhost:$local_port -> $service_name:8080"
  echo ""
  echo -e "${BLUE}Port-forward command:${NC}"
  echo "  ${KUBECTL} port-forward svc/$service_name $local_port:8080 -n $NAMESPACE"
  echo ""
  echo -e "${YELLOW}Note: Keep this terminal open. Use another terminal to send test requests.${NC}"
  echo ""
  # Start port-forward
  "${KUBECTL}" port-forward "svc/$service_name" "$local_port:8080" -n "$NAMESPACE" &
  echo "Port forward started in background.  To stop it, find the process (e.g., with 'ps aux | grep kubectl') and kill it."
}

#Later in the script when you call start_port_forward:
start_port_forward "$SERVICE_NAME" "$LOCAL_PORT"

In summary: Focus on improving error handling, addressing potential security vulnerabilities related to variable expansion, reducing code duplication through functions, and enhancing the user experience with clearer messages and port conflict detection. Remember to add a shebang.

Okay, I've reviewed the added code. Here's a summary of my findings and suggestions:

Review Summary

The added code introduces two new shell functions: send_test_request and watch_pipelineruns. These functions enhance the testing and monitoring capabilities of the script. The send_test_request function sends a test payload to the EventListener and provides feedback based on the response. The watch_pipelineruns function helps monitor the created PipelineRuns, offering different commands based on whether tkn is available.

File: (No file name provided, assuming this is a script file)

  • Clarity: The code is generally clear and well-commented. The use of color-coded output (YELLOW, GREEN, RED) enhances readability.
  • Duplication: There's some duplication in how the payload is echoed (with and without jq). This could be simplified.
  • Error Handling: The send_test_request function includes basic error checking based on the HTTP status code.

Specific Issues and Suggestions

  1. File: (Script File) - Duplication in Payload Echoing:

    • Issue: The code repeats the logic for echoing the payload based on the availability of jq.
    • Suggestion: Create a function to handle the payload echoing, encapsulating the jq check:
    echo_payload() {
      if [ "$HAS_JQ" = true ]; then
        echo "$1" | jq '.'
      else
        echo "$1"
      fi
    }
    
    # ... inside send_test_request ...
    echo "Payload:"
    echo_payload "$PAYLOAD"
  2. File: (Script File) - Potential Security Issue: Unescaped Variables in Payload

    • Issue: The variables ${TRIGGER_SOURCE:-manual-test}, ${IMAGE_VERSION:-latest}, etc. are directly embedded into the JSON payload. If these variables contain characters like " or \, it could break the JSON structure or, in more complex scenarios, introduce injection vulnerabilities if the payload is used in further processing without proper sanitization.
    • Suggestion: Properly escape the variables before embedding them in the JSON. A simple way to do this in bash is to use printf %q:
    PAYLOAD=$(cat <<EOF
    {
      "submitted_by": "test-script-$TIMESTAMP",
      "trigger_source": "$(printf %q "${TRIGGER_SOURCE:-manual-test}")",
      "image_version": "$(printf %q "${IMAGE_VERSION:-latest}")",
      "dvc_nvr_version": "$(printf %q "${DVC_NVR_VERSION:-v1}")",
      "dvc_prompts_version": "$(printf %q "${DVC_PROMPTS_VERSION:-v1}")",
      "dvc_known_false_positives_version": "$(printf %q "${DVC_KFP_VERSION:-v1}")",
      "use_known_false_positive_file": ${USE_KNOWN_FP:-true}
    }
    EOF
    )

    This will ensure that the values are properly quoted and escaped for inclusion in the JSON string. For the boolean value, you should ensure $USE_KNOWN_FP is strictly true or false for valid JSON.

  3. File: (Script File) - Inconsistent Use of Quotes:

    • Issue: There are inconsistencies in the use of double quotes around variables. For example, in tkn pipelinerun list -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop, $NAMESPACE is quoted, but in the kubectl command, it's not always quoted consistently.
    • Suggestion: Always quote variables unless you have a specific reason not to. This prevents word splitting and globbing issues.
  4. File: (Script File) - Error Handling for curl:

    • Issue: The script checks the HTTP status code, but it doesn't explicitly handle cases where curl itself fails (e.g., network errors, DNS resolution failures).
    • Suggestion: Add error handling for curl failures:
    RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST "http://localhost:$LOCAL_PORT" \
        -H "Content-Type: application/json" \
        -d "$PAYLOAD" 2>&1)
    CURL_EXIT_CODE=$?
    if [ $CURL_EXIT_CODE -ne 0 ]; then
        echo -e "${RED}✗ curl command failed with exit code $CURL_EXIT_CODE${NC}"
        echo "Check network connectivity or EventListener availability."
        exit 1
    fi
  5. File: (Script File) - Suggestion: Add set -euo pipefail to the beginning of the script

    • Issue: The script does not have this.
    • Suggestion: This is for security and will make sure your script exits if a command exits with a non-zero exit code.

Revised Code Snippets (incorporating suggestions):

#!/bin/bash
set -euo pipefail

# Function to echo payload with jq if available
echo_payload() {
  if [ "$HAS_JQ" = true ]; then
    echo "$1" | jq '.'
  else
    echo "$1"
  fi
}

# Function to send test request
send_test_request() {
    echo -e "${YELLOW}Sending test request to EventListener...${NC}"

    # Generate timestamp for unique identification
    TIMESTAMP=$(date +%Y%m%d-%H%M%S)

    # Prepare payload with all MLOps parameters (using underscores to match TriggerBinding)
    PAYLOAD=$(cat <<EOF
{
  "submitted_by": "test-script-$TIMESTAMP",
  "trigger_source": "$(printf %q "${TRIGGER_SOURCE:-manual-test}")",
  "image_version": "$(printf %q "${IMAGE_VERSION:-latest}")",
  "dvc_nvr_version": "$(printf %q "${DVC_NVR_VERSION:-v1}")",
  "dvc_prompts_version": "$(printf %q "${DVC_PROMPTS_VERSION:-v1}")",
  "dvc_known_false_positives_version": "$(printf %q "${DVC_KFP_VERSION:-v1}")",
  "use_known_false_positive_file": ${USE_KNOWN_FP:-true}
}
EOF
)

    echo "Payload:"
    echo_payload "$PAYLOAD"
    echo ""

    # Send request
    echo "Sending POST request to http://localhost:$LOCAL_PORT ..."
    RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST "http://localhost:$LOCAL_PORT" \
        -H "Content-Type: application/json" \
        -d "$PAYLOAD" 2>&1)
    CURL_EXIT_CODE=$?
    if [ $CURL_EXIT_CODE -ne 0 ]; then
        echo -e "${RED}✗ curl command failed with exit code $CURL_EXIT_CODE${NC}"
        echo "Check network connectivity or EventListener availability."
        exit 1
    fi

    # Parse response
    HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS:" | cut -d':' -f2)
    BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS:/d')

    echo "Response Status: $HTTP_STATUS"
    echo "Response Body:"
    echo_payload "$BODY"
    echo ""

    if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then
        echo -e "${GREEN}✓ EventListener accepted the request!${NC}"
        echo ""
        echo "A PipelineRun should have been created. Check with:"
        if [ "$HAS_TKN" = true ]; then
            echo "  tkn pipelinerun list -n \"$NAMESPACE\""
            echo "  tkn pipelinerun logs -L -f -n \"$NAMESPACE\""
        else
            echo "  $KUBECTL get pipelinerun -n \"$NAMESPACE\""
            echo "  $KUBECTL get pipelinerun -n \"$NAMESPACE\" -l app.kubernetes.io/component=benchmark-mlop"
        fi
    else
        echo -e "${RED}✗ EventListener returned an error${NC}"
        echo "Check EventListener logs:"
        echo "  $KUBECTL logs -l eventlistener=benchmark-mlop-listener -n \"$NAMESPACE\""
    fi
    echo ""
}

# Function to watch pipeline runs
watch_pipelineruns() {
    echo -e "${YELLOW}Watching recent benchmark PipelineRuns...${NC}"
    echo ""

    if [ "$HAS_TKN" = true ]; then
        echo "Using tkn to watch PipelineRuns:"
        tkn pipelinerun list -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop
        echo ""
        echo "To follow logs of the latest run:"
        echo "  tkn pipelinerun logs -L -f -n \"$NAMESPACE\""
    else
        echo "Recent benchmark PipelineRuns:"
        $KUBECTL get pipelinerun -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop --sort-by=.metadata.creationTimestamp
        echo ""
        echo "To view logs:"
        echo "  $KUBECTL logs -l tekton.dev/pipelineTask=call-orchestrator-api -n \"$NAMESPACE\" --tail=100"
    fi
    echo ""

    echo -e "${YELLOW}Query PipelineRuns by trigger source:${NC}"
    echo "  # Manual tests:"
    echo "  $KUBECTL get pr -n \"$NAMESPACE\" -l sast-ai.redhat.com/trigger-source=manual-test"
    echo ""
    echo "  # ArgoCD triggers:"
    echo "  $KUBECTL get pr -n \"$NAMESPACE\" -l sast-ai.redhat.com/trigger-source=argo

I hope these suggestions are helpful! Let me know if you have any other questions.

Okay, I've reviewed the provided diff for the new script and the triggerbinding.yaml file. Here's a summary of my observations and suggestions:

General Review Summary:

The script introduces a helpful interactive menu for managing and testing the Tekton PipelineRuns. The use of color-coded output enhances readability. The structure is well-organized with functions for each action. The triggerbinding.yaml seems standard for Tekton setup.

File: deploy/tekton/eventlistener/triggerbinding.yaml

  • No immediate issues. The YAML file defines a TriggerBinding which appears well-structured. Without knowing the overall Tekton setup, it's hard to say if the parameters and labels are perfectly aligned, but the syntax is correct.

File: hack/benchmark-mlop/run.sh

  • Clarity: The script is generally clear, but some comments explaining the purpose of specific variables (e.g., NAMESPACE, SERVICE_NAME) would be beneficial, especially for new users.
  • Error Handling: The script uses || true in kill $PF_PID 2>/dev/null || true. While this prevents the script from exiting on a failed kill, it might hide genuine errors. Consider logging the error message for debugging purposes.
  • Duplication: The check_deployment and show_config functions are called repeatedly. While this ensures the environment is ready, consider adding a flag to prevent redundant checks if they are time-consuming.
  • Security: Consider adding input sanitization or validation for variables like NAMESPACE to prevent potential command injection vulnerabilities, especially if the script is intended for shared use.
  • Shebang: The script is missing a shebang (#!/bin/bash) at the very top. This is generally recommended for making the script executable directly.
  • Cosmetic: The repeated echo "" for adding empty lines could be simplified by just using a single echo command with multiple newline characters (echo -e "\n\n").

Specific Issue Comments:

  • hack/benchmark-mlop/run.sh: Add #!/bin/bash at the very top of the file.
  • hack/benchmark-mlop/run.sh: Suggestion: Add comments explaining the purpose of key variables like NAMESPACE, SERVICE_NAME, and LOCAL_PORT.
  • hack/benchmark-mlop/run.sh: Suggestion: In the kill command, consider replacing || true with a more informative error message, e.g., kill $PF_PID 2>/dev/null || echo "Warning: Could not kill port-forward process (PID: $PF_PID)".
  • hack/benchmark-mlop/run.sh: Suggestion: Implement input validation for variables like NAMESPACE to prevent command injection. At a minimum, check that the namespace name conforms to expected characters.
  • hack/benchmark-mlop/run.sh: Suggestion: Add a brief description to the top explaining the overall purpose of the script.

These comments aim to improve the script's clarity, robustness, and security. Let me know if you want me to elaborate on any of these points!

Okay, I've reviewed the provided diff and have the following comments.

Review Summary

The changes introduce a new TriggerTemplate for Tekton pipelines, specifically for a "benchmark-mlop" workflow. The template defines parameters to be extracted from a TriggerBinding (presumably from a webhook payload) and passes them to the PipelineRun. Overall, the structure seems reasonable for parameterizing pipeline executions.

File: deploy/tekton/eventlistener/triggerbinding.yaml

  • Clarity: Good use of comments to explain the purpose of each parameter being extracted from the webhook body.
  • Security: Consider validating and sanitizing the input from body.* to prevent command injection or other vulnerabilities, especially for image-version and version parameters. Even if these are expected to be controlled values,defense in depth is beneficial.
  • Suggestion: It might be useful to add example values in comments for each parameter to clarify the expected format.

File: deploy/tekton/eventlistener/triggertemplate.yaml

  • Clarity: The descriptions for each parameter are helpful.
  • Default Values: Sensible default values are provided.
  • Duplication: The sast-ai.redhat.com/trigger-source annotation is specified twice, once with a static value and once with the template parameter. Remove the duplication.
  • Suggestion: Consider using resourcenames instead of generateName if you need predictable names for the PipelineRun resources. However, generateName is generally preferred for avoiding naming conflicts.
  • Suggestion: Add validation to the parameters passed to the PipelineRun. Consider adding a validation step within the pipeline to verify the versions.

In summary, the code is generally well-structured and clear. The main points to address are security (input validation) and avoid duplication and consider adding validation.

Okay, I've reviewed the changes. Here's a summary and file-specific comments:

Review Summary:

The changes seem to be adding functionality for handling false positives in a Tekton pipeline, likely for MLOps purposes. A new task and parameters are being introduced, and a kustomization overlay is used to create a separate MLOps pipeline. The changes look reasonable overall, focusing on modularity and configuration.

File-Specific Comments:

  • deploy/tekton/tasks/run-kfp-tekton-component/run-kfp-tekton-component.yaml

    • The introduction of use-known-false-positive-file parameter is good for flexibility. Ensure the task handles the case where this file is not provided or is empty gracefully. Consider adding a default value or a check within the task's script.
    • The timeout for the entire pipeline is set to 4 hours. Confirm that this timeout is appropriate for the longest-running MLOps pipelines. Consider making this configurable.
  • deploy/tekton/overlays/mlops/kustomization.yaml

    • Using nameSuffix is a clean way to avoid overriding the base pipeline. This is good practice.

Overall, the changes look good. Just a few minor points to consider.

</details>

Copy link
Collaborator

@GuyZivRH GuyZivRH left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some duplications in the Makefile.
other than that looks fine.
you made usage of set -e which is ok but maybe consider adding more granular exiting.

lgttm

deploy/Makefile Outdated
Comment on lines 24 to 25
REPO_REMOTE_URL ?= source/code/url
REPO_REMOTE_URL ?= source/code/url
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

duplication?

deploy/Makefile Outdated
Comment on lines 60 to 61
ORCHESTRATOR_API_URL ?=
MLOPS_ORCHESTRATOR_API_URL ?=
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need 2?

deploy/Makefile Outdated
Comment on lines 611 to 612
sast-ai-google-service-account \
sast-ai-google-service-account \
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

deploy/Makefile Outdated
Comment on lines 546 to 551
elif [ "$(ENV)" = "mlop" ]; then \
$(CO) delete -k tekton/overlays/mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true; \
echo " ✓ MLOp Tekton resources removed (kustomize overlay)"; \
elif [ "$(ENV)" = "mlop" ]; then \
$(CO) delete -k tekton/overlays/mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true; \
echo " ✓ MLOp Tekton resources removed (kustomize overlay)"; \
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same, i am a bit confused - maybe rebase issue?

echo " IMAGE_VERSION: ${IMAGE_VERSION:-latest}"
echo " DVC_NVR_VERSION: ${DVC_NVR_VERSION:-(empty)}"
echo " DVC_PROMPTS_VERSION: ${DVC_PROMPTS_VERSION:-(empty)}"
echo " DVC_KFP_VERSION: ${DVC_KFP_VERSION:-(empty)}"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Later on it's mapped to dvc_known_false_positives_version. The variable name should match: use DVC_KNOWN_FALSE_POSITIVES_VERSION for clarity.

tasks:
- name: call-orchestrator-api
taskRef:
name: call-orchestrator-api-mlop
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

call-orchestrator-api-mlop is the name of the resource and call-orchestrator-api is the name of instance (local alias)


# Timeout for the entire pipeline
timeouts:
pipeline: "4h"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4h?

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I've completed the review of the code differences.

Overall Summary:

The changes introduce a Tekton EventListener-based system for triggering MLOps benchmarking pipelines. The code is generally well-structured and uses parameters and functions effectively. The test suite is comprehensive, and the documentation is helpful. However, there are several areas where security, error handling, clarity, and efficiency can be improved.

Key Issues and Suggestions:

  • Security:
    • Input Validation: Implement robust input validation and sanitization for all parameters received from the EventListener, especially those used to construct shell commands or JSON payloads. Use jq for safe JSON construction and parsing.
    • Privilege Management: Use service accounts with limited permissions for Tekton tasks. Avoid running tasks as root or with excessive privileges.
    • TLS Verification: Always use TLS verification (--fail --show-error --cacert) when making HTTPS requests with curl.
    • Image Verification: Validate image versions against an allowlist or use immutable tags/digests.
  • Error Handling:
    • Comprehensive Checks: Check the exit code of every command and provide informative error messages.
    • Retry Logic: Implement retry logic with exponential backoff for API calls.
    • Timeout Mechanisms: Implement timeout mechanisms to prevent indefinite loops.
  • Clarity:
    • Descriptive Names: Use descriptive names for parameters and variables.
    • Comments: Add comments to explain complex logic.
  • Efficiency:
    • JSON Parsing: Use jq for JSON parsing.
    • Code Duplication: Reduce code duplication by creating functions.

I hope this summary is helpful. Please let me know if you have any further questions.

Okay, I've reviewed the `Makefile` diff and here's a summary of the issues and suggestions:

Review Summary:

The changes introduce environment-specific deployment targets (dev, prod, mlops) using argocd. The deploy target now acts as a router, calling the specific environment target based on the ENV variable. This is a good step towards managing different deployment configurations. There are improvements around error handling and added clarity around deployment parameters and configurations.

File: deploy/Makefile

  • Issue: The deploy target now acts as a router, and it uses deploy-$(ENV) target. If ENV is not properly set, then deploy- will be called which does nothing.
    • Suggestion: Add a default ENV value. Also, add an error message if ENV is not correctly set.
  • Issue: There are duplicated command declarations
    • Suggestion: Create a function to execute duplicated commands.
# deploy/Makefile
...
ENV ?= dev # set dev as default if not specified
...
deploy:
ifeq ($(ENV),dev)
	$(MAKE) deploy-dev
else ifeq ($(ENV),prod)
	$(MAKE) deploy-prod
else ifeq ($(ENV),mlops)
	$(MAKE) deploy-mlops
else
	$(error "Invalid environment specified.  Must be one of: dev, prod, mlops")
endif
  • Issue: Multiple targets have duplicated commands.
    • Suggestion: Create a makefile function.
define print_deployment_info
	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
	@echo "🚀 SAST AI Workflow - $(1) Deployment"
	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
	@echo "   Environment: $(1)"
	@echo "   Container Image: $(2)"
	@echo ""
	@echo "✅ $(1) deployment completed successfully!"
endef

deploy-dev: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):latest
deploy-dev: setup tasks-dev argocd-deploy-dev
	$(call print_deployment_info,Development,$(CONTAINER_IMAGE))

deploy-prod: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)
deploy-prod: setup tasks-prod argocd-deploy-prod
	@if [ -z "$(IMAGE_VERSION)" ]; then \
		echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
		echo "❌ ERROR: IMAGE_VERSION is required for production deployment"; \
		echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
		exit 1; \
	fi
	$(call print_deployment_info,Production,$(CONTAINER_IMAGE))
  • Issue: S3_OUTPUT_BUCKET_NAME has a default value of bucket-name.
    • Suggestion: Change the value to be empty string "" to enforce user to set the bucket name.
  • Issue: The documentation source/code/url is too generic
    • Suggestion: Specify a valid public repo or remove it.

I will proceed to the next file.

Okay, I've reviewed the provided Makefile snippet. Here's a summary of the identified issues and suggestions for improvement:

Review Summary:

The changes introduce a new deploy-mlops target in the Makefile, which seems to be for deploying a benchmarking setup. There are several improvements but also a few points of concern. The addition of error handling and clear messaging is good. However, there are some redundancies and potential areas for simplification. The approach to templating the benchmark-config.yaml could be improved for robustness and security.

File: Makefile - Issue Comments

  1. Redundancy in Environment Checks:

    • Issue: The ENV variable checks in the original Makefile snippet had multiple if/else blocks to decide on the setup. The new implementation seems to remove these checks and focuses solely on MLOps. However, the old logic might be needed.
    • Suggestion: Consider the need to support other environments (prod, base). If they are still required, reintegrate the conditional logic using ENV. If they are not, remove the related code.
  2. Insecure Templating:

    • Issue: Using sed for templating, especially with shell variables, can be risky if ORCHESTRATOR_API_URL contains special characters. This could lead to command injection vulnerabilities.

    • Suggestion: Use a more robust and secure templating engine like ytt or envsubst. These tools are designed to handle variable substitution safely and can prevent command injection. Example using envsubst:

      deploy-mlops:
      	...
      	export ORCHESTRATOR_API_URL # export the variable to be available for envsubst
      	envsubst < tekton/eventlistener/benchmark-config.yaml.example > tekton/eventlistener/benchmark-config.yaml
      	$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) || \
      		{ echo "   ❌ Failed to deploy EventListener resources"; exit 1; }
      	...

      Make sure that tekton/eventlistener/benchmark-config.yaml.example uses ${ORCHESTRATOR_API_URL} for the placeholder.

  3. Missing Error Handling for sed:

    • Issue: The sed command doesn't have error handling. If sed fails, the script will continue, potentially deploying an incorrect configuration.

    • Suggestion: Add error handling to the sed command:

      @sed -e 's|ORCHESTRATOR_API_URL_PLACEHOLDER|$(ORCHESTRATOR_API_URL)|g' \
      	tekton/eventlistener/benchmark-config.yaml.example > tekton/eventlistener/benchmark-config.yaml || { echo "   ❌ Failed to template benchmark-config.yaml"; exit 1; }
  4. Clarity of setup Target:

    • Issue: The setup target's purpose isn't immediately clear. It seems to set up common infrastructure but lacks a descriptive comment. Also, the setup target invokes other make targets without --no-print-directory.
    • Suggestion: Add a comment explaining what the setup target does. Also, consider adding --no-print-directory to the setup target when calling other make targets.
  5. Hardcoded Placeholder

    • Issue: The ORCHESTRATOR_API_URL_PLACEHOLDER is hardcoded into the makefile.
    • Suggestion: Consider defining it as a variable at the top of the Makefile for easy modification and consistency.
  6. Missing --no-print-directory in deploy-mlops target

    • Issue: The deploy-mlops target invokes other make targets without --no-print-directory.
    • Suggestion: Add --no-print-directory to the deploy-mlops target when calling other make targets.

General Suggestions:

  • Idempotency: Ensure the deploy-mlops target is idempotent. Running it multiple times should not cause issues. Consider adding checks to see if resources already exist before creating them.
  • Documentation: Add more comments to the Makefile to explain the purpose of each target and the variables used. This will make it easier for others to understand and maintain the code.
  • Testing: Ideally, have a way to test the deployment process in a non-production environment before deploying to production.

I hope these comments are helpful. Let me know if you have any other questions.

Okay, I've reviewed the Makefile diff. Here's a summary of my findings and suggestions:

Review Summary:

The changes introduce new targets for deploying Tekton resources in different environments (dev, prod, mlops) and a dedicated target for managing the EventListener. The addition of environment-specific Tekton deployments and the EventListener management are good improvements. However, there are some areas where the code can be more robust and easier to maintain.

File: Makefile

Issue Comments:

  1. Repetitive Code: The tasks-dev, tasks-prod, and tasks-mlops targets are very similar. Consider creating a generic tasks target that takes the environment as a parameter. This will reduce duplication and make the Makefile easier to maintain.

    tasks-%:
    	@echo "📋 Deploying Tekton resources ($(*))..."
    	@$(CO) apply -k tekton/overlays/$(*) -n $(NAMESPACE)
    	@echo "$($*) Tekton resources"

    Then call it like make tasks-dev, make tasks-prod, etc. You'll likely need to adjust the Kustomize paths accordingly. Consider having tekton/overlays/{dev,prod,mlops}/kustomization.yaml files.

  2. Error Handling: In the run target, the redirection > /dev/null 2>&1 suppresses all output, including errors. While ignoring "not found" errors is acceptable, consider logging other errors to stderr so they are visible to the user. Remove the redirection. Let $(CO) apply print it output.

  3. Variable Usage and Defaults: The eventlistener target requires ORCHESTRATOR_API_URL. Consider setting a default value for this variable, or providing a clearer error message if it's not set. Also, consider adding the eventlistener target to a top-level deploy or all target, but only when ORCHESTRATOR_API_URL is defined.

  4. Idempotency: The eventlistener target creates tekton/eventlistener/benchmark-config.yaml. If the make command is run multiple times with the same ORCHESTRATOR_API_URL, the file will be overwritten unnecessarily. Consider checking if the file already exists and has the correct content before overwriting it or use kubectl patch instead of apply to modify the existing configmap.

  5. Clean Targets: The eventlistener-clean target includes > /dev/null 2>&1 which suppress all errors. As with point 2, remove the redirection to see any errors encountered during the clean up. Also, the target deletes pipelineruns and taskruns but not the eventlistener it self. Add also a delete command for the eventlistener.

  6. Typos: In the eventlistener-clean target, there is a typo in the last line. tekto should be tekton.

Security Considerations:

  • Secrets Management: Ensure that the ORCHESTRATOR_API_URL does not contain any secrets or sensitive information. If it does, consider using a more secure way to pass this information, such as Kubernetes Secrets.
  • Input Validation: If the ORCHESTRATOR_API_URL is taken from user input, validate it to prevent potential injection attacks.

I'm ready for the next file.

Okay, I've reviewed the changes. Here's a summary and some specific comments:

Review Summary:

This PR introduces an EventListener setup for triggering MLOps benchmarking pipelines within the Tekton environment. The changes look generally good. There are some improvements that could be made around the use of more descriptive names.

File-Specific Comments:

  • Makefile:

    • Makefile: The addition of the mlop environment in the clean target is good for environment-specific cleanup.
    • Makefile: Consider renaming sast-ai-google-drive-service-account to sast-ai-google-service-account for consistency and clarity.
  • deploy/tekton/eventlistener/README.md:

    • deploy/tekton/eventlistener/README.md: The README is well-structured and provides good information on the purpose, contents, prerequisites, and setup of the EventListener. Good job!

Okay, I've reviewed the provided documentation and here's a summary of potential issues and suggestions:

Review Summary:

The documentation provides a good overview of deploying and testing an EventListener. However, there are some areas where clarity can be improved and potential issues addressed, particularly around security and error handling. The use of hardcoded values also raises concerns about flexibility and maintainability.

**File: Provided Text (Assuming this is a README or similar documentation) **

Issue Comments:

  1. Clarity: In "Step 2: Find Your Orchestrator URL", the example URL http://sast-ai-orchestrator.sast-ai.svc.cluster.local:8080 should explicitly state that the user needs to replace sast-ai with their actual namespace if it's different.

  2. Security (Hardcoded API Endpoint): The note "The EventListener always calls /api/v1/mlops-batches endpoint (hardcoded for MLOps benchmarking)" is a potential concern. Hardcoding the API endpoint reduces flexibility and could introduce security risks if the endpoint needs to change.

    • Suggestion: Consider making the API endpoint configurable via an environment variable or a ConfigMap. This would allow for easier adaptation to different environments or API versions.
  3. Error Handling (Step 4: Test the EventListener): The documentation doesn't explicitly mention how to handle errors during the curl requests or the PipelineRun execution.

    • Suggestion: Add a section on troubleshooting common errors, such as incorrect JSON payloads, network connectivity issues, or PipelineRun failures. Include guidance on how to check logs and diagnose problems.
  4. Security (Port Forwarding): The note about port-forwarding should strongly emphasize that it should only be used for testing and never in a production environment. It should also mention the security implications of exposing a service via port forwarding.

    • Suggestion: Add a warning about the security risks of port forwarding and recommend alternative testing methods within the cluster if possible (e.g., using kubectl exec to run curl from a pod in the same namespace).
  5. Clarity (Expected Results): The expected results section assumes a successful test. It would be beneficial to include examples of what error messages or logs might look like in case of a failure.

  6. Namespace Usage: The documentation mentions using your-namespace frequently. While this is a common placeholder, it might be beneficial to explicitly state that users should replace all instances of your-namespace with their actual namespace to avoid confusion.

  7. Missing Context: The provided text is a snippet, and lacks context about the larger system. Without understanding the bigger picture, it's hard to provide more specific security recommendations. For example, how is authentication/authorization handled for the Orchestrator API? Is TLS enabled for communication between components?

These suggestions aim to improve the clarity, security, and robustness of the documentation and the associated deployment process.

Okay, I've reviewed the provided documentation. Here's a summary of potential issues and suggestions for improvement, focusing on clarity, security, and maintainability.

Review Summary:

The documentation is generally well-structured and provides useful information for setting up and troubleshooting the MLOps benchmarking system. However, there are a few areas where clarity can be improved, and some potential security considerations. The troubleshooting section is helpful, but could be expanded with more specific error scenarios. The configuration reference is good, but the separation of concerns between webhook payload, configmap, and pipeline parameters could be made clearer.

File: (Assuming this is a single Markdown file, e.g., docs/mlops-benchmarking.md)

Issue Comments:

  1. Clarity: The relationships between webhook payload, ConfigMap, and Pipeline Parameters should be stated clearly. For example, document which webhook payload attributes overwrite ConfigMap parameters and pipeline parameters.
  2. Security: RBAC and Service Accounts: The troubleshooting section mentions "RBAC permissions missing." This is a critical security concern. The documentation should explicitly state the minimum required RBAC permissions for the pipeline service account (or any service account used by the Tekton Pipelines) and recommend using least privilege. Provide an example Role and RoleBinding manifest.
  3. Clarity: ConfigMap Regeneration: The instructions for regenerating the ConfigMap are a bit terse. Specifically call out to back up the existing ConfigMap first.
  4. Security: Input Validation: The documentation should emphasize the importance of input validation in the orchestrator API. Malicious actors could craft payloads designed to exploit vulnerabilities if input isn't properly validated.
  5. Clarity: In the "Webhook Payload Format" section, explicitly state how the default value for image_version ("latest") is handled. Does it translate to a specific tag or latest tag, and what are the implications of using a mutable tag like latest in a production environment? Recommend using immutable tags (e.g., v2.1.0) or SHAs.
  6. Troubleshooting: Add a troubleshooting step for cases where the pipeline runs successfully but the results are not as expected. This could include checking the orchestrator's logs for errors, verifying the data used in the benchmark, and confirming the benchmark configuration.
  7. DVC parameters: Clarify what is meant by resource version and how these parameters are used in the pipeline.
  8. Typos/Grammar: A final pass for typos and grammatical errors would improve the overall quality of the documentation.

I'm ready for the next file diff.

Okay, I've reviewed the provided text, which seems to be documentation for an MLOps benchmarking pipeline. Here's a summary of potential issues and suggestions, focusing on clarity, security, and production readiness:

Overall Review Summary:

The documentation provides a good overview of the pipeline, its components, and responsibilities. The diagram is helpful. The "Production Enhancements" section is a good start. However, there are areas where clarity could be improved, and some potential security considerations are missing.

Specific Issue Comments:

  • File: (General Documentation)

    • Issue: The documentation mentions using oc port-forward for external testing. While useful for development, it's crucial to emphasize that this should never be used in a production environment due to security implications.
    • Suggestion: Add a clear warning about the dangers of oc port-forward in production and suggest proper ingress/route configuration for production access.
  • File: (General Documentation)

    • Issue: The documentation uses hardcoded namespace sast-ai-benchmark.
    • Suggestion: Use a variable for namespace and provide guidance to users to use their own namespace.
  • File: (General Documentation)

    • Issue: The documentation focuses heavily on OpenShift (oc commands). While this might be the primary deployment target, consider making the instructions more generic or providing alternatives for standard Kubernetes deployments (e.g., using kubectl).
    • Suggestion: Add a section on deploying to standard Kubernetes, or at least mention the equivalent kubectl commands.
  • File: (Production Enhancements Section)

    • Issue: The section mentions "retry logic for transient failures" which is good, but it lacks specifics.
    • Suggestion: Briefly describe how retry logic should be implemented (e.g., using Tekton's retry feature, or within the task's script). Include considerations for backoff strategies.

I am ready to review the code differences in the following messages.

Okay, I've reviewed the added files related to Tekton event listeners and pipelines for the MLOps benchmark. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a Tekton pipeline and associated resources (EventListener, ConfigMap, Tasks) to automate MLOps benchmarking based on events. The provided documentation is helpful. However, there are some areas where clarity, security, and robustness can be improved.

File-Specific Comments:

  • deploy/tekton/eventlistener/README.md

    • Issue: The "Cleanup" section provides multiple ways to delete resources, which might be confusing. Prioritize the recommended method.
    • Suggestion: Streamline the cleanup section to primarily recommend the make eventlistener-clean command. Mention the other methods as alternatives, but with a warning that they might require more manual intervention.
    • Issue: The documentation states "All configuration is passed as parameters - no manual file editing needed!" While mostly true, customizing labels/naming requires editing YAML files.
    • Suggestion: Clarify this statement: "Most configuration is passed as parameters. Customizations like labels or names might require editing YAML files in tekton/eventlistener/."
  • deploy/tekton/eventlistener/benchmark-config.yaml

    • Issue: The ConfigMap contains a hardcoded orchestrator-api-url as a placeholder. While the README.md explains it will be replaced, it's a potential source of error if someone forgets to deploy using make.
    • Suggestion: Add a comment to the orchestrator-api-url field within the YAML file itself to explicitly warn users not to modify it directly, and to use the make command instead. For example: # DO NOT EDIT. This value is automatically replaced during deployment. Use 'make eventlistener' instead.
    • Issue: The namespace for the orchestrator URL is hardcoded (sast-ai.svc.cluster.local). This assumes the orchestrator is always deployed in the sast-ai namespace.
    • Suggestion: Consider making the namespace part of the ORCHESTRATOR_API_URL parameter passed to make eventlistener. This would allow for more flexible deployments.
  • deploy/tekton/eventlistener/benchmark-pipeline.yaml

    • Issue: The pipeline includes tasks call-orchestrator-api-mlop and poll-batch-status-mlop, but their implementations are not provided in these diffs. It's impossible to fully assess the pipeline without seeing those task definitions.
    • Suggestion: Provide the task definitions (Task resources) for call-orchestrator-api-mlop and poll-batch-status-mlop so the entire workflow can be reviewed. Pay particular attention to how these tasks handle secrets (API keys, authentication tokens) and ensure they follow security best practices (e.g., using Kubernetes Secrets, avoiding hardcoding credentials).
    • Issue: The pipeline doesn't seem to have any error handling or retry mechanisms for the tasks.
    • Suggestion: Add error handling and retry mechanisms for tasks that might fail due to network issues or temporary orchestrator unavailability.
    • Issue: The pipeline could benefit from logging key events and data throughout its execution to aid in debugging and monitoring.
    • Suggestion: Consider adding tasks to log important information, such as the start and end times of the pipeline, the parameters used, and the status of each task.

General Suggestions:

  • Security: Carefully review how the call-orchestrator-api-mlop task authenticates with the orchestrator. Avoid storing credentials directly in the Task definition or ConfigMap. Use Kubernetes Secrets and RBAC to manage access to the orchestrator API.
  • Error Handling: Implement robust error handling throughout the pipeline. Use onError to catch task failures and implement appropriate recovery actions (e.g., sending notifications, retrying tasks, or failing the pipeline).
  • Idempotency: Design the tasks to be idempotent. This means that if a task is executed multiple times with the same input, it should produce the same result. This is important for handling retries and ensuring that the pipeline can recover from failures.
  • Testing: Include a test-eventlistener.sh script to validate that the EventListener is configured correctly and can trigger the pipeline. This script should simulate a webhook event and verify that the pipeline is started and runs successfully.

Let me know if you want me to elaborate on any of these points. I'll be ready for the next set of diffs.

Review Summary:

The YAML file defines a Tekton Pipeline for an MLOps benchmark workflow. It's generally well-structured and clear, with good use of parameters and results. The pipeline calls an orchestrator API, polls for batch status, and logs completion.

File: mlop-pipeline

  • Clarity: The description is good, but could benefit from explicitly mentioning the purpose of the performance testing. What metrics are being targeted?

  • Naming Consistency: The file name mlop-pipeline and the label sast-ai-workflow are slightly inconsistent. Consider aligning these for clarity.

  • Parameter Defaults: The default value for image-version is "latest". This is generally discouraged in production environments, as "latest" is mutable. It's better to use specific, immutable versions (e.g., v2.1.0).

  • Poll Interval and Timeout: The poll-interval is 30 seconds and the timeout is 480 seconds (8 minutes). Depending on the expected batch job duration, these values might need adjustment. Ensure these are appropriate for the performance testing scenarios. Consider making these configurable via parameters.

  • Error Handling: The pipeline relies on the poll-batch-status-mlop task to handle batch completion status. Ensure that this task appropriately handles errors and failures. How does the pipeline react if poll-batch-status-mlop fails to complete within the timeout?

  • Security: Consider how the image-version parameter is validated. Arbitrary user-provided image versions could introduce security risks.

  • Use of DVC versions: The DVC version parameters are good for reproducibility.

Okay, I've reviewed the provided code. Here's a summary of potential issues and suggestions for improvement.

Review Summary:

The changes introduce two new Tekton resources: a Task named report-pipeline-summary for logging pipeline execution summaries and a Task named call-orchestrator-api-mlop for interacting with the sast-ai-orchestrator API.

The report-pipeline-summary Task effectively consolidates and presents information about the completed pipeline run. However, the script within this task could be improved to handle edge cases and provide more robust error reporting.

The call-orchestrator-api-mlop Task defines how to interact with the orchestrator's API.

File-Specific Comments:

File: deploy/tekton/task/report-pipeline-summary.yaml

  • Clarity: The logging in the report-pipeline-summary task is generally good, but could benefit from more specific error messages or troubleshooting steps tailored to common failure scenarios.
  • Error Handling: The script relies heavily on if statements. Consider adding elif statements to provide more precise feedback based on the final status.
  • Security: The script includes URLs for checking batch status. Ensure that these URLs are appropriately secured (e.g., using HTTPS) and that sensitive information is not exposed in logs.

File: deploy/tekton/eventlistener/call-orchestrator-api.yaml

  • This file is incomplete. The description of the task stops mid-sentence ("Calls the sast-ai-orchestrator MLOps bat"). Please provide the complete definition of this task.

I'll wait for the rest of the files to provide more specific and complete feedback.

Okay, I will review the provided code snippet, focusing on clarity, simplicity, efficiency, error handling, and security best practices. I will provide a summary and inline comments if I find any issues. Please send the remaining snippets.

Okay, here's a review of the provided shell script snippet, focusing on clarity, simplicity, efficiency, and security:

Review Summary:

The script is generally well-structured and readable. It performs parameter validation, constructs a JSON payload, makes an API call using curl, and processes the response. The error handling is decent, but could be more specific. There are a few areas where the code could be improved for clarity, efficiency, and security.

File: [Filename not provided]

Issue Comments:

  1. Clarity and Redundancy:

    • The repeated validation checks for required parameters (e.g., dvc-prompts-version) can be simplified using a loop and an array of required parameters. This reduces code duplication.
  2. Security:

    • The script uses curl to make an API call. While this is common, it's crucial to ensure that the ORCHESTRATOR_URL environment variable is properly sanitized and controlled to prevent potential injection vulnerabilities. Consider validating that it's a valid URL.
    • The script constructs a JSON payload using string concatenation. If any of the input parameters (e.g., params.submitted-by) contain special characters (like quotes), this can lead to invalid JSON and potentially security issues. Use jq to properly construct the JSON payload and escape any special characters.
    • Avoid using grep -o to extract json values since the value can be anything, this will be insecure.
  3. Error Handling:

    • The error message "ERROR: curl command failed" is too generic. The RESPONSE variable is captured, which is good, but the error message should include more details about the specific curl error. Consider logging the full curl command for debugging purposes (but redact any sensitive information).
    • The script checks if the HTTP status code is within the 200-299 range. While this is a good start, consider adding more specific checks for common error codes (e.g., 400, 401, 403, 500) and providing more informative error messages.
  4. Efficiency:

    • Using grep and cut to extract the batchId from the JSON response is not the most efficient or robust approach. Using jq would be much cleaner, more efficient, and less prone to errors if the JSON structure changes slightly.

Suggestions for Improvement:

  • Parameter Validation Loop: Implement a loop to iterate through an array of required parameters to avoid code duplication in the validation section.
  • JSON Construction with jq: Use jq to construct the JSON payload. This ensures proper escaping of special characters and avoids potential injection vulnerabilities. If jq is not available, consider using a different method like printf to format the JSON string.
  • More Specific Error Handling: Add more specific error handling for the curl command and HTTP status codes.
  • jq for JSON Parsing: Use jq to extract the batchId from the JSON response.
  • Sanitize Orchestrator URL: Validate that the ORCHESTRATOR_URL is a valid URL.
  • Consider Logging: Use a more robust logging mechanism (if appropriate for the environment) instead of just echo. This will make debugging easier.

Example Code Snippets (Illustrative):

# Parameter validation loop
REQUIRED_PARAMS=(
  "submitted-by"
  "image-version"
  "dvc-nvr-version"
  "dvc-prompts-version"
  "dvc-known-false-positives-version"
)

for PARAM in "${REQUIRED_PARAMS[@]}"; do
  if [ -z "$(params.${PARAM})" ]; then
    echo "ERROR: ${PARAM} parameter is required but empty"
    VALIDATION_FAILED=1
  fi
done

# JSON construction with jq
PAYLOAD=$(jq -n \
  --arg submittedBy "$(params.submitted-by)" \
  --arg imageVersion "$(params.image-version)" \
  --arg dvcNvrVersion "$(params.dvc-nvr-version)" \
  --arg dvcPromptsVersion "$(params.dvc-prompts-version)" \
  --arg dvcKnownFalsePositivesVersion "$(params.dvc-known-false-positives-version)" \
  --arg useKnownFalsePositiveFile "$(params.use-known-false-positive-file)" \
  '{submittedBy: $submittedBy, imageVersion: $imageVersion, dvcNvrVersion: $dvcNvrVersion, dvcPromptsVersion: $dvcPromptsVersion, dvcKnownFalsePositivesVersion: $dvcKnownFalsePositivesVersion, useKnownFalsePositiveFile: ($useKnownFalsePositiveFile | toboolean)}'
)

# Extract batchId with jq
BATCH_ID=$(echo "$BODY" | jq -r '.batchId' || echo "unknown")

These suggestions will help improve the script's clarity, security, and robustness. Remember to adapt the code snippets to your specific environment and requirements.

Okay, I've reviewed the provided code differences. Here's a summary of potential issues and suggestions for improvement:

General Review Summary:

The changes introduce a new Tekton EventListener to trigger a benchmark-mlop pipeline. The code appears mostly functional, but there are opportunities for improved error handling, security, and clarity.

File-Specific Comments:

File: orchestrator-api-call.sh

  • Issue: Generic error message in Warning: Could not extract batchId from response.
    • Suggestion: Add more context to the warning message, perhaps including the raw response or part of it to help diagnose why the batchId extraction failed.
  • Issue: echo -n usage.
    • Suggestion: While functional, using printf is generally more robust and portable than echo -n.
  • Issue: The script exits with code 1 if API call fails.
    • Suggestion: The script could benefit from more robust error handling. For example, retry the API call a few times before failing completely. Also, consider adding logging to a file for debugging purposes.
  • Security Issue: The script doesn't sanitize the input data (payload). This could lead to command injection vulnerabilities if the API returns malicious data that's then used in subsequent commands.
    * Suggestion: Sanitize any variables extracted from the API response before using them in commands, especially if those commands involve executing other programs. Consider using jq more extensively to safely parse and extract values from the JSON response.
  • Clarity: Repetitive echo statements for error messages.
    • Suggestion: Consider using a function to print error messages with a consistent format.

File: deploy/tekton/eventlistener/eventlistener.yaml

  • Issue: CEL Interceptor validation is good, but could be more specific.
    • Suggestion: Add specific error messages to the CEL interceptor so the user knows which parameter is missing or invalid.
  • Issue: The service account name is hardcoded.
    • Suggestion: Consider making the service account name configurable via a parameter or variable.
  • Issue: The service type is ClusterIP.
    • Suggestion: Confirm if ClusterIP is the desired service type. For external access, LoadBalancer or NodePort might be more appropriate.

File: deploy/tekton/eventlistener/kustomization.yaml

  • Suggestion: The comment about app.kubernetes.io/part-of is helpful. Ensure this convention is followed consistently throughout the project.

Let me know if you want me to elaborate on any of these points or have further questions.

Okay, I've reviewed the provided YAML files related to Tekton pipelines for a benchmark-mlop component. Here's a summary and some specific comments:

Review Summary:

The code defines a Tekton Task (poll-batch-status-mlop.yaml) to poll an orchestrator API for the status of a batch job. The task retrieves configuration from a ConfigMap, uses curl to make API requests, and parses the JSON response to determine the job's status. It also includes error handling, timeout logic, and result reporting. Overall, the structure is good.

File: deploy/tekton/eventlistener/poll-batch-status.yaml

  • Clarity: The descriptions for the Task and Params are clear and helpful.
  • ConfigMap Usage: Using a ConfigMap for the orchestrator URL and API endpoint is a good practice for environment configuration.
  • Error Handling: The script includes parameter validation and error messages, which is good.
  • Timeout Logic: The timeout implementation seems reasonable. Consider adding a small jitter to the poll interval to avoid hammering the API in case of widespread polling.
  • Security: The script uses set -e, which is good for failing fast on errors. Ensure the orchestrator API is properly secured with authentication and authorization.
  • Efficiency: Using curl and jq is a common and generally efficient way to interact with APIs in Tekton tasks.
  • Suggestion: Instead of quay.io/curl/curl:latest, specify a specific version of the curl image. Using latest can lead to unpredictable behavior if the image is updated. Also, consider using a smaller base image with curl and jq to reduce image size. Alpine based images are a good choice.
  • Suggestion: Consider adding retries with exponential backoff for API calls to handle transient network errors.
  • Suggestion: Add comments in the shell script to explain complex logic, especially around the polling and timeout mechanisms.
# Example of adding jitter
sleep $(shuf -i 1-5 -n 1) # Sleep for a random number of seconds between 1 and 5
  • Suggestion: Instead of hardcoding 480 as the default timeout, consider making the timeout configurable at the pipeline level for different use cases.
    - name: timeout
      type: string
      description: "Maximum time to wait in minutes"
      default: "480" #Consider making this configurable at the pipeline level

I'll be ready for the next set of files.

file: [no file name]

Review Summary:

The script introduces parameter validation, timeout logic, and status polling for a batch processing system. The added validation improves robustness, and the timeout mechanism prevents indefinite loops. Status polling with a clear status URL enhances monitoring.

Comments:

  • Clarity: The script is well-commented and easy to understand.
  • Error Handling: The script handles missing or invalid parameters gracefully. It also provides helpful messages to the user.
  • Readability: The script is well-formatted.
  • Security: The script avoids hardcoding sensitive information.
  • Consider using set -euo pipefail at the beginning of the script for better error handling.
  • Consider adding some logs for debugging purposes.

Okay, I've reviewed the added code. Here's a summary of potential issues and suggestions:

Review Summary:

The script seems to be polling an API to check the status of a batch job. It includes error handling, status reporting, and result recording. However, the extensive use of grep and cut for parsing JSON responses is inefficient and fragile. Also, the lack of proper error handling around file writes and the potential for infinite loops are concerns.

File: (snippet provided)

  • Clarity/Readability:
    • The repeated use of echo | grep | cut chains makes the script harder to read and understand.
  • Efficiency:
    • Parsing JSON with grep and cut is highly inefficient and prone to errors if the JSON structure changes. Consider using jq (if available) or a similar JSON processing tool.
  • Error Handling:
    • The script checks for errors when calling the status API but doesn't explicitly handle potential errors when writing to the result files (e.g., permissions issues, disk full).
  • Security:
    • If $STATUS_URL is user-supplied or can be influenced by a malicious actor, consider sanitizing it to prevent command injection vulnerabilities. Although curl -s mitigates some risks, ensuring the URL is well-formed is important.
  • Maintainability:
    • Hardcoding the polling interval and other parameters makes the script less flexible. Consider using environment variables or command-line arguments.

Specific Issue Comments:

  1. File: (snippet provided)

    • Issue: Inefficient JSON parsing using grep and cut.
    • Suggestion: Use jq to parse the JSON response. For example, instead of STATUS=$(echo "$BODY" | grep -o '"status":"[^"]*"' | cut -d'"' -f4), use STATUS=$(echo "$BODY" | jq -r '.status'). This is much more robust and readable. If jq is not guaranteed to be present, consider adding a check and providing a helpful error message if it's missing.
  2. File: (snippet provided)

    • Issue: Missing error handling when writing to result files.
    • Suggestion: Add checks after each echo -n ... > $(results.*.path) command to ensure the write was successful. For example:
      echo -n "COMPLETED" > $(results.final-status.path) || {
        echo "ERROR: Failed to write to $(results.final-status.path)"
        exit 1
      }
  3. File: (snippet provided)

    • Issue: Potential for infinite loop if the API never returns a final status (COMPLETED or FAILED).
    • Suggestion: Implement a maximum number of retries or a timeout to prevent the script from running indefinitely.
  4. File: (snippet provided)

    • Issue: Lack of input sanitization for $STATUS_URL.
    • Suggestion: Validate the format of $STATUS_URL to prevent potential command injection. At a minimum, ensure it starts with http:// or https://. More rigorous validation might be necessary depending on the context.
  5. File: (snippet provided)

    • Issue: Duplicated code for handling COMPLETED and FAILED statuses.
    • Suggestion: Create a function to encapsulate the common steps (printing messages, writing results, exiting) to reduce duplication and improve maintainability.

By addressing these points, you can significantly improve the robustness, efficiency, security, and maintainability of the script.

Okay, I've reviewed the code and here's a summary of the issues and suggestions.

General Review Summary:

The script adds a comprehensive test suite for the Tekton EventListener, including prerequisite checks, deployment validation, and payload triggering. The use of color-coded output enhances readability. However, there are areas for improvement in error handling, code structure, and security.

File: monitoring/scripts/monitor-pipeline.sh

  • Issue: The while loop condition could be simplified by combining grep and wc -l into a single grep -c command.
    • Suggestion: Replace STATUS=$(kubectl get pipelinerun "$PIPELINERUN_NAME" -n "$NAMESPACE" -o jsonpath='{.status.conditions[*].type}' | grep -E 'Succeeded|Failed') with STATUS=$(kubectl get pipelinerun "$PIPELINERUN_NAME" -n "$NAMESPACE" -o jsonpath='{.status.conditions[*].type}' | grep -c -E 'Succeeded|Failed') and adjust the subsequent logic accordingly. This reduces external command calls.
  • Issue: The script blindly sleeps even on terminal statuses.
    • Suggestion: Add a check for "Succeeded" or "Failed" in the case statement to break the loop immediately upon completion, avoiding unnecessary sleep.
  • Issue: No error checking on kubectl get pipelinerun. If the PR is not found, the script spins forever.
    • Suggestion: Add an initial check to verify the PipelineRun exists before entering the loop. If not, exit with an error message.

File: deploy/tekton/eventlistener/test-eventlistener.sh

  • Issue: The script uses hardcoded service name and could be parameterized.
    • Suggestion: Consider making SERVICE_NAME configurable via an environment variable, allowing for testing different EventListeners.
  • Issue: The script uses echo to print environment variables, which could leak secrets if those env vars are set with sensitive data.
    • Suggestion: Omit printing environment variables, or mask sensitive information.
  • Issue: The script uses || echo "default" which is prone to errors if the command before the || fails for another reason than the project not being set.
    • Suggestion: Use oc project -q || NAMESPACE=default before the oc command.
  • Issue: The script does not have any clean up.
    • Suggestion: Add a section to delete resources created during the test.
  • Issue: The script does not have input validation. It is prone to command injection.
    • Suggestion: Sanitize or validate inputs before using them in commands like curl.
  • Issue: The script contains insecure usage of curl without verifying TLS certificates, which can expose the system to MITM attacks.
    • Suggestion: Always use --fail --show-error and consider explicitly enabling TLS verification with --cacert if you have a custom CA.
  • Issue: Code duplication in payload sending, with similar curl commands repeated.
    • Suggestion: Create a function to encapsulate the curl command for sending payloads, parameterized with the payload file and any other necessary options. This reduces duplication and improves maintainability.
  • Issue: The script lacks comprehensive error handling for curl commands.
    • Suggestion: Implement robust error handling by checking the exit code of each curl command. If the command fails, print an informative error message and exit the script.

I hope this review is helpful!

File: N/A (Assuming this is a new script or a significant addition to an existing one)

Review Summary:

The script introduces comprehensive checks for Tekton resources (ConfigMap, Tasks, Pipeline, EventListener, Service) and provides helpful functions for displaying configuration, starting port-forwarding, and sending test requests. The use of color-coded output enhances readability. However, there are areas for improvement in error handling, security, and code structure.

Issue Comments:

  1. Security: The script executes kubectl commands. If the script is intended for use in an automated environment, consider using a dedicated service account with limited permissions instead of relying on the user's kubectl configuration. This principle of least privilege is crucial.

  2. Error Handling: The script exits upon encountering the first missing resource. Consider providing a summary of all missing resources before exiting. This provides more immediate feedback to the user. Also, think about cases where the command kubectl get might fail for reasons other than the resource not existing (e.g., network error, RBAC issue). The current >/dev/null 2>&1 will suppress those errors, which is not ideal.

  3. Clarity and User Experience: The instructions to deploy the event listener are good. Consider improving the messages when resources are missing to be more specific about how to deploy those resources.

  4. Duplication: The resource checking logic is highly repetitive. Create a function to check for the existence of a resource and return a boolean value. This will greatly reduce code duplication and improve maintainability.

  5. Robustness: The script uses $KUBECTL get pods and jsonpath to get the pod name and status. If there are multiple event listeners this logic may need to be more specific.

  6. Port Forwarding: The start_port_forward function is good, but it lacks error handling. If the port-forward command fails, the script should handle the error gracefully. Also, consider adding a mechanism to stop the port-forward when it is no longer needed.

  7. Test Request: The send_test_request function is incomplete.

Suggestions:

  • Refactor Resource Checks: Implement a function resource_exists(kind, name, namespace) to avoid code duplication.
  • Improve Error Reporting: Collect all missing resources and report them together before exiting.
  • Enhance Security: Use service accounts with limited permissions if running in an automated environment.
  • Add Error Handling: Implement more robust error handling, particularly around kubectl commands and the port forwarding process.
  • Complete send_test_request: Finish the implementation of the test request function, including the actual request and response handling.
  • Consider using set -e: Add set -e at the beginning of the script to exit immediately if any command fails. This will help prevent the script from continuing in an unexpected state.

Okay, I've reviewed the provided code. Here's a summary of potential issues and suggestions:

Review Summary:

The script introduces functionality to trigger and monitor pipeline runs. It uses curl to send requests, and kubectl or tkn to monitor the resulting pipeline runs. The code is generally well-structured with functions, improving readability. However, there are areas where security, error handling, and efficiency can be improved.

File: (Assuming this is a single script file, e.g., trigger_pipeline.sh)

Issue Comments:

  1. Security: Use environment variables for sensitive data.

    • File: trigger_pipeline.sh
    • Issue: The script directly executes kubectl and tkn commands. Ensure that the KUBECONFIG environment variable is properly set and the user has the necessary permissions. Consider using a service account with restricted permissions instead of relying on user credentials, especially in automated environments.
    • Suggestion: Add a check to ensure KUBECONFIG is set or provide clear instructions on how to set it.
  2. Security: Input validation for parameters.

    • File: trigger_pipeline.sh
    • Issue: The script constructs a JSON payload from environment variables. If these variables are attacker-controlled, they could inject arbitrary JSON, potentially leading to unexpected behavior or even remote code execution if the pipeline processes this data unsafely.
    • Suggestion: Implement input validation and sanitization for all environment variables used to construct the JSON payload. At a minimum, ensure the values are what is expected, and escape special characters.
  3. Error Handling: Robust error checking after commands.

    • File: trigger_pipeline.sh
    • Issue: The script checks the HTTP status code, but it doesn't comprehensively check for errors after each command (e.g., curl, kubectl, tkn). A command might fail without the script detecting it, leading to a misleading success message.
    • Suggestion: After each command, check the exit code (e.g., if [ $? -ne 0 ]; then ... fi). Add error messages that are more descriptive.
  4. Clarity: Improve the watch_pipelineruns function's output.

    • File: trigger_pipeline.sh
    • Issue: The watch_pipelineruns function provides commands to run, but it doesn't actually watch in the sense of continuously monitoring. This might mislead users.
    • Suggestion: Clarify the function's purpose in the output message. Consider adding a true "watch" functionality using watch command or similar.
  5. Efficiency: Consider using jq for JSON parsing.

    • File: trigger_pipeline.sh
    • Issue: The script uses grep and sed to parse the HTTP response. While it checks for jq, these tools are less robust and harder to maintain than using jq for JSON parsing.
    • Suggestion: If jq is available (as the script already checks), always use it for parsing JSON. It's more reliable and easier to read.
  6. Duplication: Reduce duplication of kubectl command

    • File: trigger_pipeline.sh
    • Issue: The kubectl command is used multiple times to retrieve pipelineruns.
    • Suggestion: Create a function to execute the kubectl command. This can improve readability and reduce the chance of errors.

Example:

kubectl_get_pr() {
  kubectl get pr -n "$NAMESPACE" "$@"
}

# Manual tests:
kubectl_get_pr -l sast-ai.redhat.com/trigger-source=manual-test
  1. Timestamp generation
    • File: trigger_pipeline.sh
    • Issue: Timestamp generate is being generated with date command which is not a standard way.
    • Suggestion: Use date +%s or uuidgen to generate a unique ID.

I hope these suggestions are helpful! Let me know if you have any other questions.

Okay, I've reviewed the provided script and triggerbinding.yaml file. Here's a summary of potential issues and suggestions for improvement, focusing on clarity, security, and best practices.

Review Summary:

The shell script introduces a menu-driven interface for interacting with a Tekton pipeline deployment. It's generally well-structured and provides helpful utilities for checking status, port-forwarding, triggering tests, and watching pipeline runs. The triggerbinding.yaml file defines how to extract data from webhook events.

File: hack/benchmark-mlop-menu.sh

  • Issue: Potential security vulnerability in send_test_request if the DATA variable contains shell-sensitive characters.

    • Suggestion: Use jq to construct the JSON payload safely, or properly escape the data.
  • Issue: Error handling in send_test_request is basic.

    • Suggestion: Check the HTTP status code of the curl request and provide more informative error messages if the request fails (e.g., non-200 status).
  • Issue: The script relies on several environment variables without proper validation.

    • Suggestion: Add checks to ensure that the necessary environment variables are set before the script attempts to use them. Provide default values where appropriate.
  • Issue: check_deployment uses grep to check for the existence of deployments, services and eventlisteners.

    • Suggestion: Use kubectl get deployment <deployment_name> -n <namespace> -o name and check the exit code. Same goes for services and eventlisteners. This will be more accurate and less prone to false positives.
  • Issue: In the full_test option (6), the sleep duration might be insufficient in some environments, causing issues with the test request.

    • Suggestion: Implement a more robust mechanism to wait for the port-forward to become ready, possibly by polling a local endpoint.
  • Issue: The cleanup instructions provided in the comments aren't integrated into the script.

    • Suggestion: Consider adding a cleanup option to the menu that executes the make eventlistener-clean command.
  • Suggestion: Consider using #!/usr/bin/env bash shebang for better portability.

  • Suggestion: Use set -euo pipefail at the beginning of the script to catch errors early.

  • Suggestion: Instead of echo -e, use printf for better portability and control over output formatting.

File: deploy/tekton/eventlistener/triggerbinding.yaml

  • Issue: No input validation or sanitization on submitted-by parameter.

    • Suggestion: While Tekton itself provides some level of parameterization, consider additional validation within the Pipeline to ensure submitted-by conforms to expected format, to prevent injection attacks or unexpected behavior.
  • Suggestion: Add annotations with descriptions for each field in the TriggerBinding for better documentation.

Example Issue Comments:

File: hack/benchmark-mlop-menu.sh

# Issue: Potential security vulnerability in `send_test_request`
# Suggestion: Use `jq` to construct the JSON payload safely, or properly escape the data.  For example:
# DATA=$(jq -n --arg data "$DATA" '{data: $data}')
# Then use: curl -X POST -H "Content-Type: application/json" -d "$DATA" "http://localhost:$LOCAL_PORT"
# Issue: The script relies on several environment variables without proper validation.
# Suggestion: Add checks to ensure that the necessary environment variables are set before the script attempts to use them.
# For example:
# if [ -z "$NAMESPACE" ]; then
#   echo "Error: NAMESPACE environment variable not set."
#   exit 1
# fi

File: deploy/tekton/eventlistener/triggerbinding.yaml

# Issue: No input validation or sanitization on `submitted-by` parameter.
# Suggestion: Add validation within the Pipeline to ensure `submitted-by` conforms to the expected format.

I'm ready for the next set of files.

Okay, I've reviewed the changes related to the Tekton event listener, trigger binding, and trigger template. Here's a summary of my observations and suggestions:

Review Summary:

The changes introduce new Tekton resources for triggering a "benchmark-mlop-pipeline" based on events. The code is well-structured and uses parameters effectively. However, some areas could benefit from clarification and potential security hardening.

File: deploy/tekton/eventlistener/triggerbinding.yaml

  • Clarity: The comments explaining the trigger-source are helpful.
  • Security: Consider validating the trigger-source value to prevent injection attacks. A whitelist of allowed sources would be more secure.
  • Suggestion: Add a comment explaining the purpose of each DVC parameter, even if it seems obvious. This will help with maintainability.
  • Suggestion: What should happen if the body.use_known_false_positive_file is not provided in the request body? Add some handling for this case, consider setting a default value to false if it's missing.

File: deploy/tekton/eventlistener/triggertemplate.yaml

  • Clarity: The descriptions for each parameter are excellent.
  • Suggestion: Consider using more descriptive names for the parameters, for example, instead of dvc-nvr-version, use dvc-nvr-resource-version.
  • Security: Evaluate the potential impact of allowing the image-version to be specified via the event. Ensure that appropriate image scanning and security checks are performed on any image specified this way to prevent supply chain attacks. Validate the image-version against an allowlist or use immutable tags/digests.
  • Suggestion: Add validation or sanitization to the submitted-by parameter. This could help prevent log injection or other issues if this value is used in downstream systems.
  • Suggestion: If use-known-false-positive-file is always intended to be a boolean, enforce this in the template by transforming the string value to a boolean.

I am ready for the next set of changes.

deploy/tekton/overlays/ci/kustomization.yaml:

  • The addition of timeouts with a pipeline timeout of "2h" is a good practice.

deploy/tekton/overlays/mlops/kustomization.yaml:

  • Adding nameSuffix is a good idea for creating separate pipelines.

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I have finished reviewing the code changes. I have provided comments inline, and I will now generate a summary of the review.

Overall Review Summary:

The changes introduce a comprehensive MLOps benchmarking framework using Tekton, complete with event-driven triggers, parameterizable pipelines, and testing utilities. The code is well-structured and includes helpful documentation. However, there are several points to address regarding security, error handling, and code clarity to enhance the robustness, maintainability, and user experience of the framework.

Key Areas for Improvement:

  • Security:
    • Input validation and sanitization are critical to prevent command injection vulnerabilities, particularly when dealing with user-provided values or data from external sources (e.g., webhooks, ConfigMaps).
    • Secure configuration practices, such as avoiding hardcoded secrets and using HTTPS for communication, should be enforced.
    • Image tags other than latest should be used.
  • Error Handling:
    • Robust error handling is essential for identifying and resolving issues. This includes checking command exit codes, handling HTTP status codes, and providing informative error messages.
    • Timeouts and retry mechanisms should be implemented to prevent indefinite loops and handle transient failures.
    • ConfigMap existence should be validated.
  • Clarity:
    • Clear and concise documentation is crucial for understanding and using the framework. Comments should be added to explain the purpose of code sections, annotations, and parameters.
    • Consistent naming conventions and code formatting improve readability and maintainability.
  • Efficiency:
    • Redundant commands and inefficient string manipulation should be optimized. Tools like jq can be used for more efficient JSON parsing.
  • User Experience:
    • The command-line interface should be user-friendly and provide clear guidance.
    • Help messages and usage instructions should be comprehensive.

Recommendations:

  1. Address Security Vulnerabilities: Prioritize addressing the security vulnerabilities identified in the review, particularly regarding input validation and sanitization.
  2. Implement Robust Error Handling: Enhance error handling throughout the framework to ensure that errors are detected and handled gracefully.
  3. Improve Code Clarity and Documentation: Add comments and documentation to improve the readability and maintainability of the code.
  4. Optimize Efficiency: Optimize inefficient code sections to improve performance.
  5. Enhance User Experience: Improve the user experience by providing clear guidance and comprehensive help messages.

By addressing these points, you can significantly improve the quality and security of the MLOps benchmarking framework.

Okay, I will review the changes you've provided. Here's a breakdown of the issues and suggestions:

Review Summary:

The changes introduce new deployment environments (dev, prod, mlops) managed through the deploy target and improve the Makefile structure. It also introduces the configuration for the EventListener. The file introduces some variables which are not well-defined, like IMAGE_REGISTRY and IMAGE_NAME which are related with the docker image and version that will be deployed.

File: .gitignore

  • Issue: None
  • Suggestion: This change is fine. It prevents the generated EventListener configuration from being tracked.

File: deploy/Makefile

  • Issue: Inconsistent variable defaults, unclear environment variables. The introduction of new deployment environments (dev, prod, mlops) requires careful attention to configuration and task execution.
  • Suggestion:
    • Variable Defaults: Review all variable defaults, especially those related to URLs, bucket names, and file paths. Ensure they are valid placeholders or reasonable defaults for a development environment. Consider using empty strings as default values to ensure the script doesn't use unexpected values.
    • IMAGE_REGISTRY and IMAGE_NAME: Define these variables with a placeholder or a default value, and explain them.
    • Deployment Targets: Improve the deploy target with sub-targets, making deployment environment-specific.

Here are some detailed comments with specific line numbers (based on the provided diff):

  • deploy/Makefile:19: Suggestion: consider changing the default value. This looks like a development placeholder
  • deploy/Makefile:20: Suggestion: consider changing the default value. This looks like a development placeholder
  • deploy/Makefile:59: Suggestion: The URL includes the namespace, which is fine for K8s. Make sure the default port 80 matches the service's actual port. Consider making the port configurable.
  • deploy/Makefile:71: Suggestion: Consider an empty string ("") as the default. Leaving it as bucket-name could lead to accidental data being written to an unintended bucket.
  • deploy/Makefile:77: Suggestion: The deploy: target is now a dispatcher. Consider adding a default target (e.g., deploy-dev) if ENV is not specified, or print an error message instructing the user to specify an environment.
  • deploy/Makefile:79 and 87: Suggestion: Define IMAGE_REGISTRY and IMAGE_NAME somewhere or pass as argument.

Okay, I've reviewed the Makefile diff you provided. Here's a summary of the issues and suggestions:

Review Summary:

The changes introduce an deploy-mlops target and refactors the original deploy target. The deploy-mlops target appears to be for deploying a benchmarking setup. The original deploy target now seems focused on production and base deployments. There's a mix of improvements and potential problems. The separation of concerns is good, but the error handling and overall structure could be improved.

File: Makefile

Issues and Suggestions:

  1. Clarity and Consistency:

    • The original deploy target had different behaviors based on the ENV variable (mlops, prod, base). This is now split, which is good for clarity.
    • Consider renaming deploy to deploy-prod or deploy-base to be more explicit about its purpose now that deploy-mlops exists.
    • The logic for the base deployment is not explicitly handled now. It should be handled explicitly, or it should be removed if it is not needed anymore.
  2. Error Handling:

    • The deploy-mlops target uses || { echo ...; exit 1; } for error handling after applying the EventListener. This is good. Apply this pattern to other $(CO) apply commands in the Makefile to ensure consistent error handling.
  3. Duplication:

    • The setup target contains some steps that are also part of other deployment targets. Consider refactoring common setup steps into a separate, reusable target (e.g., setup-common).
  4. Variable Usage:

    • The deploy-mlops target uses CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):latest. While latest is convenient, it's generally better to use specific, immutable tags in deployments, especially for production-like environments, to ensure reproducibility. Consider making the tag configurable via a variable.
  5. Security:

    • Ensure that ORCHESTRATOR_API_URL is properly validated and sanitized before being used in the sed command to prevent potential injection vulnerabilities. Consider escaping special characters.
  6. Missing base deployment

    • The original deploy target could handle base deployment. Now it is not handled. Add the logic or remove it completely if it is not needed.

Improved Code Snippets (Illustrative):

  • Renamed deploy target:
deploy-prod:
    # ... production deployment steps ...

deploy-base:
    # ... base deployment steps ...
  • Improved Error Handling (example):
	@$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) || \
		{ echo "   ❌ Failed to deploy EventListener resources"; exit 1; }
  • Using a Specific Tag (with default):
MLOPS_IMAGE_TAG ?= latest # Allow override, default to latest
deploy-mlops: CONTAINER_IMAGE=$(IMAGE_REGISTRY)/$(IMAGE_NAME):$(MLOPS_IMAGE_TAG)
  • Escaping ORCHESTRATOR_API_URL:
ORCHESTRATOR_API_URL_ESCAPED := $(subst ',',\',$(ORCHESTRATOR_API_URL)) #example of escaping. Adapt it for your needs.

deploy-mlops:
	@sed -e 's|ORCHESTRATOR_API_URL_PLACEHOLDER|$(ORCHESTRATOR_API_URL_ESCAPED)|g' ...

Let me know if you want me to elaborate on any of these points or provide more specific code examples.

+tasks-dev:
+	@echo "📋 Deploying Tekton resources (dev)..."
+	@$(CO) apply -k tekton/base -n $(NAMESPACE)
+	@echo "   ✓ Base Tekton resources (base - Google Drive storage)"
+
+tasks-prod:
+	@echo "📋 Deploying Tekton resources (prod)..."
+	@$(CO) apply -k tekton/overlays/prod -n $(NAMESPACE)
+	@echo "   ✓ Production Tekton resources (versioned)"
+
+tasks-mlops:
+	@echo "📋 Deploying Tekton resources (mlops)..."
+	@$(CO) apply -k tekton/overlays/mlops -n $(NAMESPACE)
+	@echo "   ✓ MLOps Tekton resources (MinIO/S3)"
  • Clarity: These sections clearly define different deployment targets (dev, prod, mlops).
  • Duplication: Reduced duplication by using kustomize.
-pipeline:
-	@echo "🔧 Pipeline..."
-	@echo "   ✓ Pipeline deployed with Tekton resources (via kustomize)"
  • Redundancy: This target seems redundant now that tasks are handled by tasks-dev, tasks-prod, and tasks-mlops.
@@ -294,7 +300,7 @@
 	@echo "   Container Image: $(CONTAINER_IMAGE)"
 	@echo "   🔄 Removing old pipeline runs..."
 	@$(CO) delete pipelinerun sast-ai-workflow-pipelinerun \
-				-n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1
+				-n $(NAMESPACE) --ignore-not-found
 	# Create PipelineRun with current parameters
 	@sed \
 		-e 's|PROJECT_NAME_PLACEHOLDER|$(PROJECT_NAME)|g' \
  • Output Redirection: Removing > /dev/null 2>&1 makes debugging easier, as errors will be displayed.
+eventlistener:
+	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+	@echo "🎯 EventListener Standalone Update"
+	@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+	@echo "   ⚠️  Use 'make deploy-mlops' for full deployment"
+	@echo ""
+	@echo "Using namespace: $(NAMESPACE)"
+	@echo "Using orchestrator URL: $(ORCHESTRATOR_API_URL)"
+	@echo ""
+	@echo "🎯 Deploying EventListener..."
+	@sed -e 's|<namespace>|$(NAMESPACE)|g' \
+		tekton/eventlistener/benchmark-config.yaml.template > tekton/eventlistener/benchmark-config.yaml
+	@$(CO) apply -k tekton/eventlistener/ -n $(NAMESPACE) || \
+		{ echo "   ❌ Failed to deploy EventListener resources"; exit 1; }
+	@echo ""
+	@echo "✅ EventListener updated"
+	@echo ""
+	@echo "📊 Verify: oc get eventlistener,task,pipeline -l app.kubernetes.io/component=benchmark-mlop -n $(NAMESPACE)"
+	@echo "🧪 Test: cd tekton/eventlistener && ./test-eventlistener.sh"
+	@echo ""
+
+eventlistener-clean:
+	@echo "🧹 Removing EventListener resources..."
+	@echo "   🏃 Cleaning benchmark PipelineRuns..."
+	@$(CO) delete pipelinerun -l app.kubernetes.io/component=benchmark-mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true
+	@echo "   ✓ Benchmark PipelineRuns removed"
+	@echo "   📋 Cleaning benchmark TaskRuns..."
+	@$(CO) delete taskrun -l app.kubernetes.io/component=benchmark-mlop -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true
+	@echo "   ✓ Benchmark TaskRuns removed"
+	@echo "   🗑️  Removing EventListener infrastructure..."
+	@$(CO) delete -k tekton/eventlistener/ -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true
+	@echo "   ✓ EventListener resources removed"
  • Clarity: Excellent, provides clear instructions and verification steps.
  • Error Handling: Good use of || to provide informative error messages.
  • Clean-up: The eventlistener-clean target is very useful for removing resources.

Summary:

The changes look good overall. The introduction of separate targets for dev, prod, and mlops deployments improves organization. The eventlistener and eventlistener-clean targets are well-defined and provide helpful instructions. Removing the output redirection in the run target aids in debugging. The removal of the pipeline target seems appropriate.

Okay, I've reviewed the changes. Here's a summary of the issues and suggestions:

Review Summary:

The changes introduce an MLOps EventListener for Tekton, enabling webhook-triggered MLOps benchmark testing. The addition seems well-structured, with clear documentation and separation from production workflows. However, there are a few points for improvement regarding security, clarity, and maintainability. The Makefile changes introduce a new mlop environment and update secrets. The new eventlistener directory contains all the necessary components for the EventListener.

File-Specific Comments:

  • Makefile

    • Issue: The -n $(NAMESPACE) flag is used repeatedly. This could be improved by setting a variable for the namespace flag to avoid repetition.
    • Suggestion: Create a variable for the namespace flag: NS_FLAG := -n $(NAMESPACE). Then use $(NS_FLAG) in the delete and apply commands.
    • Issue: Consider validating the ENV variable to prevent unexpected behavior if it's not prod or mlop.
    • Suggestion: Add a check like if [ -z "${ENV}" ] || [ "${ENV}" != "prod" ] && [ "${ENV}" != "mlop" ]; then echo "Error: ENV must be 'prod' or 'mlop'"; exit 1; fi at the beginning of the relevant make targets.
    • Issue: Typo in sast-ai-google-drive-service-account should be sast-ai-google-service-account.
    • Suggestion: Correct the typo in the clean target.
  • deploy/tekton/eventlistener/README.md

    • No issues. The documentation is well-written and clear.
  • deploy/tekton/eventlistener/* (General)

    • Issue: Consider using more specific exception handling in the tasks to provide better debugging information.
    • Suggestion: Within the Tekton Task definitions, add more robust error handling and logging to improve debuggability.

Overall, the changes are well-structured and introduce a valuable new feature. Addressing the points above will improve the robustness, clarity, and security of the implementation.

Okay, I will review the changes you provide incrementally, focusing on clarity, simplicity, efficiency, and security. Please send the first file difference.

Okay, I've reviewed the provided text which appears to be documentation for a benchmarking/MLOps pipeline. Here's a summary of potential issues and suggestions:

Overall Review Summary:

The documentation is generally well-structured and provides useful information for troubleshooting and configuration. However, there's room for improvement in clarity, conciseness, and security considerations. Focus on making the instructions more step-by-step, reducing redundancy, and highlighting potential security implications of configuration choices. Also, it is important to follow the security best practices in the kubernetes.

Specific Comments:

  • File: benchmark-mlop (Assuming this is a markdown file based on the formatting)

    • Issue: Redundancy in troubleshooting steps. The oc logs command is repeated.
      • Suggestion: Consolidate the oc logs command into a single, more general troubleshooting section and refer to it from specific problem descriptions.
    • Issue: Missing namespace context in oc commands.
      • Suggestion: Explicitly specify the namespace in all oc commands (e.g., oc get pods -n <your-namespace> ...) or mention that the user should configure kubectl to use the correct namespace.
    • Issue: Security: The documentation encourages direct modification of ConfigMaps using oc edit configmap.
      • Suggestion: Highlight the security implications of modifying ConfigMaps directly. Suggest using kubectl patch or declarative updates with a YAML file instead. Consider mentioning the principle of least privilege.
    • Issue: The use of "latest" for image versions.
      • Suggestion: Strongly discourage the use of "latest" for image versions in production environments due to its unpredictable nature. Emphasize the importance of using specific, immutable tags or digests.
    • Issue: The troubleshooting section lacks information on how to debug Tekton PipelineRuns and TaskRuns when they fail.
      • Suggestion: Add a section on how to examine PipelineRun and TaskRun statuses and logs for more detailed error messages.
    • Issue: API endpoint is hardcoded.
      • Suggestion: While the note says it's automatically set, consider if there's a valid use case for overriding it and document how that could be done (with a strong warning). Even better, explain why it's fixed and under what circumstances that might change in the future.

I'm ready for the next file.

docs/mlops-benchmark.md

Review Summary:

The documentation provides a good overview of the MLOps benchmarking architecture. The flow diagram and component responsibilities are helpful. The "Production Enhancements" section is a good starting point.

Comments:

  • Clarity: The documentation is generally clear and well-structured.
  • Completeness: Consider adding a section on security considerations, such as validating the webhook sender and securing the ConfigMap.
  • Enhancements:
    • In the "Flow Diagram," specify the data format being passed between components (e.g., JSON, specific schema).
    • In "Production Enhancements," elaborate on the retry logic. Should it be at the Task level, Pipeline level, or both? Also, provide more details on monitoring (what metrics are important?).
    • Consider adding a section on potential failure scenarios and how the system handles them.
  • Nitpick: In "Component Responsibilities," be consistent with capitalization (e.g., "ConfigMap" vs. "configmap").

Okay, I've reviewed the added content which seems to be documentation and configuration templates for deploying an MLOps benchmark using Tekton. Here's a summary of potential issues and suggestions:

Review Summary:

The added documentation and configuration templates seem well-structured and provide a good starting point for deploying the MLOps benchmark. The instructions are relatively clear, and the cleanup section is helpful. However, there are some points where clarity could be improved, and potential security considerations to address.

File: README.md

  • Issue: The "Troubleshooting" section is good, but could benefit from specific examples of common errors and their solutions. For example, a common issue might be incorrect namespace configuration, leading to connectivity problems.

  • Suggestion: Add specific troubleshooting examples. For instance: "If the EventListener fails to trigger the pipeline, check that the benchmark-config ConfigMap has the correct namespace and orchestrator service URL."

  • Issue: The make eventlistener-clean command should probably also delete the benchmark-config configmap.

  • Suggestion: Update the make eventlistener-clean command to also delete the benchmark-config configmap.

  • Issue: The "For Project Forks" section assumes a specific naming convention (sast-ai-orchestrator). While this might be fine for the project itself, it could be problematic for forks that use different naming conventions.

  • Suggestion: Emphasize the importance of verifying and customizing the orchestrator service URL in the benchmark-config ConfigMap when forking the project. Add a note such as: "If your orchestrator service has a different name, update the orchestrator_url in the benchmark-config ConfigMap accordingly."

File: deploy/tekton/eventlistener/benchmark-config.yaml.template

  • Issue: The template relies on a placeholder replacement for the namespace. While this works, it's not the most robust approach. If the replacement fails, the configuration will be incorrect.

  • Suggestion: Consider using Tekton's parameter substitution mechanism directly within the YAML file. This would eliminate the need for the Makefile to perform the replacement and make the configuration more self-contained. For example, use $(params.namespace) and pass the namespace as a parameter to the EventListener.

  • Issue: The template hardcodes port 80 for the orchestrator service. While this might be the default, it's not always the case.

  • Suggestion: Allow the orchestrator port to be configurable via a parameter. This would make the template more flexible and adaptable to different environments.

Okay, I've reviewed the provided YAML files. Here's a summary and some specific comments:

Review Summary:

The changes introduce a new Tekton Pipeline (benchmark-mlop-pipeline.yaml) and a ConfigMap (benchmark-config.yaml) designed for benchmarking the SAST AI orchestrator's MLOps API. The pipeline triggers SAST analysis in batches via the orchestrator and then polls for completion. The ConfigMap externalizes some configuration, particularly the orchestrator's API URL.

File-Specific Comments:

  • deploy/kubernetes/benchmark-config.yaml

    • Clarity: The comments are good and explain the purpose of the ConfigMap and its entries.
    • Improvement Suggestion: Instead of hardcoding the namespace in orchestrator-api-url, consider using a downward API to inject the namespace. This makes the config more reusable across namespaces. For example: orchestrator-api-url: "http://sast-ai-orchestrator.$(NAMESPACE).svc.cluster.local:80". You'd also need to set an environment variable NAMESPACE in your deployment.
    • Security Consideration: While using the service name is generally secure within the cluster, ensure that proper network policies are in place to restrict access to the sast-ai-orchestrator service.
  • deploy/tekton/eventlistener/benchmark-pipeline.yaml

    • Clarity: The description and parameter descriptions are well-written and explain the pipeline's purpose.
    • Flexibility: Using parameters for image-version and DVC versions is a good practice for making the pipeline configurable.
    • Error Handling: The pipeline currently doesn't have explicit error handling. If call-orchestrator-api fails, the pipeline will likely stop. Consider adding onError: continue (or stop) to the tasks and/or adding a final task to handle errors and report failures more gracefully.
    • Task timeouts: The poll-batch-status task has a timeout, but call-orchestrator-api does not. It may be wise to add a timeout to call-orchestrator-api too, to ensure the pipeline doesn't hang indefinitely if the orchestrator is unavailable.
    • Security: Ensure the call-orchestrator-api-mlop and poll-batch-status-mlop tasks handle authentication and authorization correctly when interacting with the orchestrator API.
    • Consideration: The use-known-false-positive-file parameter is a string, defaulting to "true". This works, but consider using a boolean type if Tekton supports it directly for better type safety. If not, ensure the task consuming this parameter properly handles the string-to-boolean conversion.
    • Naming Convention: Consistent naming convention is useful. Consider renaming the task to call-orchestrator-mlop-api
    • Naming Convention: Consider renaming the tasks to poll-mlop-batch-status

I will wait for the next message.

Okay, I will review the changes you provide, focusing on clarity, simplicity, efficiency, and security. I will provide a summary and file-specific comments as needed.

Okay, I will review the changes focusing on clarity, simplicity, redundancy, efficiency, exception handling, and security best practices.

Review Summary:

The changes introduce a new Tekton Task call-orchestrator-api-mlop and a script run-benchmark.sh.

  • The script introduces useful troubleshooting steps.
  • The Tekton Task encapsulates the API call to the orchestrator, which enhances reusability and automation.
  • The task relies heavily on ConfigMaps, which is good for configuration management.

I will provide some line-by-line comments below.

File: run-benchmark.sh

  • No specific comments. The script looks straightforward and includes helpful troubleshooting steps.

File: deploy/tekton/eventlistener/call-orchestrator-api.yaml

  • No specific comments. The task definition looks clear and well-structured. The use of ConfigMap to store URL and API endpoints is a good practice.

Okay, I've reviewed the provided script. Here's a summary of potential issues and suggestions:

Review Summary:

The script is generally well-structured and readable. It focuses on validating parameters and calling an external API. However, there's room for improvement in error handling, security, and code clarity. The script uses curl, which can be a security concern if not handled carefully.

File: (Filename not provided, assuming it's a shell script e.g., submit_benchmark.sh)

Issue Comments:

  1. Error Handling (Specific Exceptions): The curl error handling is generic. It would be more helpful to check the HTTP status code returned by curl and provide more specific error messages based on the code. For example, a 500 error indicates a server-side issue, while a 400 error indicates a problem with the request.

    Suggestion: After the curl command, extract the HTTP status code using grep (as is already done) and add conditional logic to provide different error messages for different status codes.

  2. Security (curl): Using curl with the -s option suppresses errors. This can hide important information about why the request failed.

    Suggestion: Consider removing the -s option during debugging or adding more verbose logging. Also, ensure that the ORCHESTRATOR_URL is from a trusted source and that the script validates the SSL certificate of the API endpoint to prevent man-in-the-middle attacks. You can do this by including the -f flag in your curl command.

  3. Code Clarity (Parameter Validation): The parameter validation section is a bit verbose.

    Suggestion: Consider using a loop and an array to iterate over the required parameters, which would make the validation logic more concise. Also, create a helper function to validate the boolean value to reduce code duplication.

  4. Output Redirection: The script uses echo -n "failed" > $(results.status.path) and echo -n "error" > $(results.batch-id.path).

    Suggestion: Add error checking to ensure that writing to these files succeeds. Also, consider using a more descriptive value for the batch-id if an error occurred (e.g., "validation-error" instead of "error").

  5. Hardcoded Errors: Error messages such as "Orchestrator service is not reachable" are hardcoded.

    Suggestion: Consider moving such messages to variables at the top of the script to allow for easier modification and potential localization.

  6. Missing checks: No check to see if benchmark-config exists and is a valid configmap before attempting to read from it.

    Suggestion: Add a check to see if the ConfigMap exists and fail fast if it doesn't.

Example of suggestion implementations

#!/bin/bash

# --- Configuration ---
ORCHESTRATOR_UNREACHABLE_MSG="ERROR: Orchestrator service is not reachable"
INVALID_BOOLEAN_MSG="ERROR: use-known-false-positive-file must be 'true' or 'false', got: "
CONFIGMAP_MISSING_MSG="ERROR: ConfigMap 'benchmark-config' does not exist."
# --- End Configuration ---

# Helper function to validate boolean values
validate_boolean() {
  local value=$1
  if [ "$value" != "true" ] && [ "$value" != "false" ]; then
    echo "$INVALID_BOOLEAN_MSG $value"
    return 1
  fi
  return 0
}

# Check if ConfigMap exists (replace with actual check based on your environment)
if [ ! -f "/path/to/benchmark-config" ]; then # Example: replace with `kubectl get configmap benchmark-config`
  echo "$CONFIGMAP_MISSING_MSG"
  echo -n "failed" > $(results.status.path)
  echo -n "configmap-missing" > $(results.batch-id.path)
  exit 1
fi

# Parameter validation using a loop
required_params=(
  "params.dvc-nvr-version"
  "params.dvc-prompts-version"
  "params.dvc-known-false-positives-version"
)

VALIDATION_FAILED=0
for param in "${required_params[@]}"; do
  if [ -z "$(eval echo \$$param)" ]; then
    echo "ERROR: $param is required but empty"
    VALIDATION_FAILED=1
  fi
done

# Validate use-known-false-positive-file
USE_KFP="$(params.use-known-false-positive-file)"
if ! validate_boolean "$USE_KFP"; then
    VALIDATION_FAILED=1
fi

if [ $VALIDATION_FAILED -eq 1 ]; then
  echo ""
  echo "Parameter validation failed. Cannot proceed."
  echo -n "failed" > $(results.status.path)
  echo -n "validation-error" > $(results.batch-id.path)
  exit 1
fi

# Call orchestrator API
echo "Sending POST request to orchestrator..."
RESPONSE=$(curl -f -w "\nHTTP_STATUS:%{http_code}" -X POST "$FULL_API_URL" \
  -H "Content-Type: application/json" \
  -d "$PAYLOAD")

HTTP_STATUS=$(echo "$RESPONSE" | grep HTTP_STATUS | sed 's/.*://g')

if [ $? -ne 0 ]; then
  echo "ERROR: curl command failed"
  echo "$ORCHESTRATOR_UNREACHABLE_MSG"
  echo "  - Network policy blocking connection"
  echo "  - Orchestrator URL is incorrect in ConfigMap"
  echo ""
  echo -n "failed" > $(results.status.path)
  echo -n "curl-error" > $(results.batch-id.path)
  exit 1
fi

if [ "$HTTP_STATUS" -ge 400 ]; then
  echo "ERROR: API request failed with HTTP status $HTTP_STATUS"
  echo "Response: $RESPONSE"
  echo -n "failed" > $(results.status.path)
  echo -n "api-error-$HTTP_STATUS" > $(results.batch-id.path)
  exit 1
fi

Let me know if you want me to elaborate on any of these points or provide more specific code examples. Also, please provide the filename so I can be more specific.

Okay, I've reviewed the provided code changes. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a new script and a new YAML file for a Tekton EventListener. The script focuses on calling an Orchestrator API and handling its response. The YAML defines the EventListener and a related service for a benchmark-mlop component.

File: <new file> (Presumably the script file)

  • Clarity: The script's logic is generally clear, with good use of comments to explain the process.
  • Error Handling: The script handles API call failures and provides helpful debugging information. However, it relies heavily on string parsing which is fragile.
  • Efficiency: The script uses grep and cut for extracting the batchId. While functional, this can be inefficient and error-prone.
  • Security: The script might be vulnerable to command injection if the RESPONSE variable contains malicious content.

Suggestions for the script file:

  1. Use jq for JSON parsing: Replace the grep and cut commands with jq. This will make the script more robust and easier to read, because this is parsing JSON.
  2. Sanitize Input: Before using the $RESPONSE in any commands, consider sanitizing it to prevent command injection. At a minimum, quote the variable ("$RESPONSE") when passing it to commands. However, proper sanitization is preferable.
  3. Error handling with set -e: Add set -e at the beginning of the script to exit immediately if a command exits with a non-zero status. This will prevent the script from continuing after an error.
  4. Improve error message for batchId extraction failure: Provide more specific guidance on why the batchId might be missing. For example, indicate the expected format of the API response.
  5. Consider logging: Implement more extensive logging for debugging purposes. This could include timestamps and more detailed information about the API request and response.
  6. Consider using curl options for error handling: Use curl --fail to make curl exit with an error code on HTTP errors (400+). This can simplify the error checking logic. Also, use --silent or --show-error to control curl's output.

File: deploy/tekton/eventlistener/eventlistener.yaml

  • Clarity: The YAML file is well-structured and easy to understand.
  • Validation: The CEL interceptor provides valuable input validation.
  • Naming: The naming convention (e.g., benchmark-mlop-listener, benchmark-mlop-trigger) is consistent.

Suggestions for the YAML file:

  1. Consider resource limits: Add resource limits (CPU, memory) to the EventListener's deployment to prevent it from consuming excessive resources.

I will wait for the next files.

Okay, I've reviewed the provided code differences. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a new Tekton event listener setup for a benchmark MLOps workflow. This includes a service, kustomization file, and a task for polling batch status. The code generally looks well-structured, but there are a few points to consider regarding security, error handling, and efficiency.

File-Specific Comments:

  • deploy/tekton/eventlistener/eventlistener-service.yaml

    • Comment: This file defines a ClusterIP service. Consider if exposing this service outside the cluster is necessary. If not, ClusterIP is appropriate. If external access is needed, explore LoadBalancer or NodePort with appropriate security measures (e.g., firewall rules, authentication).
  • deploy/tekton/eventlistener/kustomization.yaml

    • Comment: Good use of kustomization.yaml for managing the Tekton resources. The commonLabels section is useful for identifying related resources.
    • Suggestion: The commented-out configMapGenerator is a good practice. Ensure the orchestrator-api-url uses HTTPS if the orchestrator supports it, for secure communication.
  • deploy/tekton/eventlistener/poll-batch-status.yaml

    • Comment: The poll-batch-status-mlop task looks well-defined.
    • Suggestion: The task uses quay.io/curl/curl:latest. Pinning to a specific, tested version of the curl image is a security best practice. latest tag can be updated unpredictably.
    • Suggestion: Consider adding more robust error handling within the poll-status step. For example, handle HTTP error codes (4xx, 5xx) from the orchestrator API and potentially retry with a backoff strategy.
    • Suggestion: Think about adding logging to the script inside the poll-status step to help debug issues.
    • Suggestion: The timeout parameter is in minutes, but the sleep command inside the while loop uses seconds. It's important to ensure that these units are consistent to prevent unexpected behavior. Specifically, the line calculating TIMEOUT_SECONDS and the sleep command should use the same unit.

I'll wait for the next file differences to continue the review.

Okay, I've reviewed the provided script. Here's a summary of the issues and suggestions:

Review Summary:

The script is generally well-structured and readable. It performs parameter validation, constructs the API URL, and implements the polling logic. However, there are some areas where improvements can be made to enhance robustness, security, and clarity. Specifically, error handling, security considerations around URL construction, and code clarity can be improved.

File: (The provided script - assuming this is a .sh file within a Tekton Task definition)

Issue Comments:

  1. Security: Potential Command Injection in STATUS_URL construction.

    • Problem: Directly concatenating variables into a URL can lead to command injection if any of the variables (ORCHESTRATOR_URL, API_ENDPOINT, BATCH_ID) contain malicious characters.
    • Suggestion: Use printf %q to properly quote the variables when constructing the URL. This will escape any special characters.
    STATUS_URL=$(printf "%s%s/%s" "$ORCHESTRATOR_URL" "$API_ENDPOINT" "$BATCH_ID")
  2. Error Handling: Missing jq Installation and Error Check.

    • Problem: The script assumes jq is installed. If it's not, the script will fail.
    • Suggestion: Add a check to ensure jq is installed, and install it if it's not. Also, check the exit code of the jq command.
    if ! command -v jq &> /dev/null; then
      echo "ERROR: jq is not installed.  Please install it."
      # Attempt to install jq (requires appropriate permissions and package manager)
      # Example for Debian/Ubuntu: apt-get update && apt-get install -y jq
      echo -n "VALIDATION_FAILED" > $(results.final-status.path)
      echo -n "0" > $(results.total-jobs.path)
      echo -n "0" > $(results.completed-jobs.path)
      echo -n "0" > $(results.failed-jobs.path)
      exit 1
    fi
  3. Clarity: Consider Using Functions for Repetitive Tasks.

    • Problem: The error handling block for parameter validation is repeated.
    • Suggestion: Create a function to handle writing the error results to the files.
    function write_error_results {
      echo -n "VALIDATION_FAILED" > $(results.final-status.path)
      echo -n "0" > $(results.total-jobs.path)
      echo -n "0" > $(results.completed-jobs.path)
      echo -n "0" > $(results.failed-jobs.path)
    }
    
    # ... later in the script ...
    if [ $VALIDATION_FAILED -eq 1 ]; then
      echo ""
      echo "Parameter validation failed. Cannot proceed."
      write_error_results
      exit 1
    fi
    
    # And in the jq install check:
      write_error_results
      exit 1
  4. Robustness: Check HTTP Status Code.

    • Problem: The script doesn't explicitly check the HTTP status code returned by curl. It only checks for "completed" or "failed" in the response. A 500 error would be missed.
    • Suggestion: Add a check for the HTTP status code. Fail the script if the status code is not 200.
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$STATUS_URL")
    if [ "$STATUS" -ne 200 ]; then
      echo "ERROR: HTTP request failed with status code: $STATUS"
      echo -n "HTTP_ERROR" > $(results.final-status.path) #Different Status
      echo -n "0" > $(results.total-jobs.path)
      echo -n "0" > $(results.completed-jobs.path)
      echo -n "0" > $(results.failed-jobs.path)
      exit 1
    fi
  5. Security: Sanitize ConfigMap Values

    • Problem: The script uses values from ConfigMaps directly. These values could be tampered with.
    • Suggestion: Ideally, the ConfigMap should be managed securely. At a minimum, consider validating the contents of ORCHESTRATOR_URL and API_ENDPOINT to ensure they conform to expected formats (e.g., are valid URLs) before using them. This is defense in depth.
  6. Consider using set -euo pipefail

    • Problem: The script uses set -e but doesn't account for unset variables or errors in pipes.
    • Suggestion: Using set -euo pipefail ensures the script exits immediately if a variable is unset, a command fails, or a command in a pipeline fails. This improves the script's reliability.

By addressing these points, you can significantly improve the security, robustness, and maintainability of the script. Remember to test thoroughly after implementing these changes.

Okay, I will review the provided shell script snippet. Here's my assessment focusing on clarity, simplicity, efficiency, error handling, and security:

Review Summary:

The script is generally well-structured and readable for a shell script. It effectively polls a status API, parses the response, and determines the completion status of a batch job. However, it relies heavily on grep and cut for JSON parsing, which is fragile and can be inefficient. Error handling is present but could be more robust. There are also potential improvements for clarity and maintainability.

File: (Assuming this is a single script, e.g., poll_batch_status.sh)

Issue Comments:

  1. File: poll_batch_status.sh

    • Issue: Fragile JSON parsing. Using grep and cut to extract values from the JSON response is prone to errors if the JSON format changes slightly (e.g., different spacing, different key order).
    • Suggestion: Use a proper JSON parsing tool like jq. This will make the script more robust and easier to maintain. jq is typically available on most systems or easily installed.
    # Example using jq (assuming jq is installed)
    TOTAL=$(echo "$BODY" | jq .totalJobs)
    STATUS=$(echo "$BODY" | jq -r .status) # Use -r for raw output (no quotes)
    COMPLETED=$(echo "$BODY" | jq .completedJobs)
    FAILED=$(echo "$BODY" | jq .failedJobs)
  2. File: poll_batch_status.sh

    • Issue: Inefficient string manipulation. Repeatedly calling echo and piping to grep and cut (or even jq) within the loop can be slow.
    • Suggestion: If possible, store the JSON response in a variable and then parse it multiple times using jq (or your JSON parser of choice).
  3. File: poll_batch_status.sh

    • Issue: Lack of input validation. The script assumes that the environment variables STATUS_URL, TIMEOUT_MINUTES, and POLL_INTERVAL are properly set and contain valid values.
    • Suggestion: Add checks to ensure that these variables are set and contain reasonable values (e.g., TIMEOUT_MINUTES is a positive integer). Use exit 1 with an informative error message if the input is invalid.
    # Example validation
    if [ -z "$STATUS_URL" ]; then
      echo "ERROR: STATUS_URL environment variable must be set."
      exit 1
    fi
    
    if ! [[ "$TIMEOUT_MINUTES" =~ ^[0-9]+$ ]]; then
      echo "ERROR: TIMEOUT_MINUTES must be a positive integer."
      exit 1
    fi
  4. File: poll_batch_status.sh

    • Issue: Potential for infinite loop if the API never returns a "COMPLETED" status and the timeout is not reached. While the timeout should prevent this, it's better to handle unexpected status values explicitly.
    • Suggestion: Add a DEFAULT case to the case statement to handle unexpected status values. This could log an error and potentially exit the script.
          case "$STATUS" in
            COMPLETED)
              # ... (existing code) ...
              ;;
    
            FAILED) # Add handling for FAILED status too
              echo "Batch FAILED."
              # ... handle failure ...
              exit 1
              ;;
    
            DEFAULT)
              echo "ERROR: Unexpected status: $STATUS"
              echo "Aborting."
              exit 1
              ;;
          esac
  5. File: poll_batch_status.sh

    • Issue: Inconsistent error handling. The script sometimes uses echo to print errors and then continues, while other times it uses exit 1.
    • Suggestion: Standardize error handling. Decide whether to continue or exit based on the severity of the error. If continuing, log the error clearly. If exiting, use exit 1 to indicate failure.
  6. File: poll_batch_status.sh

    • Issue: Security - potential command injection. Although unlikely in this specific script given the assumed environment variables, avoid using unquoted variables in curl commands.
    • Suggestion: Quote the $STATUS_URL variable in the curl command:
    RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$STATUS_URL" 2>&1)

These suggestions should improve the robustness, maintainability, and security of the script. Remember to prioritize the most critical issues (fragile JSON parsing, input validation) first.

Okay, I've reviewed the provided script diffs. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a polling mechanism for the orchestrator status and a test script for the Tekton EventListener. The polling script looks generally good, providing useful feedback. The test script is comprehensive and well-documented.

File-Specific Comments:

File: deploy/tekton/task/monitor-batch-job.sh

  • Clarity: The script is quite clear.
  • Error Handling: The script now has much better error handling, including logging and setting exit codes.
  • Improvement: Consider adding a maximum retry/poll count to prevent indefinite looping if the orchestrator gets stuck.
# deploy/tekton/task/monitor-batch-job.sh
# Suggestion: Add max retries to prevent indefinite loop
MAX_RETRIES=30  # Example: Retry 30 times (30 * POLL_INTERVAL seconds)
RETRY_COUNT=0

while true; do
  # ... existing code ...
  RETRY_COUNT=$((RETRY_COUNT + 1))
  if [ "$RETRY_COUNT" -gt "$MAX_RETRIES" ]; then
    echo -e "${RED}✗${NC} Max retries exceeded. Aborting."
    echo -n "FAILED" > $(results.final-status.path)
    exit 1
  fi
done

File: deploy/tekton/eventlistener/test-eventlistener.sh

  • Clarity: The script is very well-documented and easy to understand.
  • Error Handling: The script includes comprehensive checks for prerequisites.
  • Security: The script uses oc or kubectl which relies on proper configuration of the kubernetes context and permissions. This needs to be pre-configured properly.
  • Improvement: The script checks for oc or kubectl but uses a variable KUBECTL to store the command. It can directly call the command instead of storing in a variable.
  • Suggestion: Add an option to specify the payload file to be sent to the EventListener.
# deploy/tekton/eventlistener/test-eventlistener.sh
# Suggestion: Instead of storing the command in a variable, directly use it.
# KUBECTL="oc"  <-- Remove this line

# And then use oc directly instead of $KUBECTL. For example:
oc get pods -n "$NAMESPACE"
# deploy/tekton/eventlistener/test-eventlistener.sh
# Suggestion: Add option to specify payload file.

while getopts "p:" opt; do
  case $opt in
    p)
      PAYLOAD_FILE="$OPTARG"
      echo "Using payload file: $PAYLOAD_FILE"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

# Later in the script, use the payload file if specified:
if [ -n "$PAYLOAD_FILE" ]; then
  curl -X POST -H "Content-Type: application/json" -d @"$PAYLOAD_FILE" http://localhost:$LOCAL_PORT
else
  curl -X POST -H "Content-Type: application/json" -d "$PAYLOAD" http://localhost:$LOCAL_PORT
fi

Overall, the changes look good. The suggestions above are minor and mostly focus on making the scripts more robust and flexible.

Okay, I've reviewed the added script content. Here's a summary of potential issues and suggestions:

Review Summary:

The script introduces helpful functions for checking dependencies, verifying resource deployment, and displaying configuration. It enhances the user experience by providing clear feedback and guidance. However, there are areas for improvement in error handling, code clarity, and efficiency. Specifically, the repeated use of kubectl get commands can be optimized, and more specific error messages can improve debugging.

File-Specific Comments:

  • File: (Assuming this is a shell script, likely run.sh or similar)

    • Issue: Redundant kubectl get calls. The check_deployment function makes multiple calls to kubectl get to check for the existence of different resources. This can be inefficient.

      • Suggestion: Consider using a single kubectl get command with multiple resource types to reduce overhead. For example, kubectl get configmap,task,pipeline,eventlistener,service -n "$NAMESPACE". Then, parse the output to check for individual resource existence.
    • Issue: Inconsistent error handling. The script exits immediately if a resource is not found but only warns if the EventListener pod is not running.

      • Suggestion: Decide on a consistent error handling strategy. Either exit immediately for all critical failures or provide warnings and continue execution where possible. Consider using a more descriptive error message indicating the severity and potential impact.
    • Issue: Potential security concern: using $KUBECTL directly without proper input validation

      • Suggestion: Sanitize $KUBECTL variable before using it.
    • Issue: The script uses a lot of echo commands for output.

      • Suggestion: Consider creating a logging function that handles colored output to reduce duplication and improve maintainability.
    • Issue: The POD_NAME retrieval uses || echo "", which is good for preventing errors but could mask legitimate issues.

      • Suggestion: Log an error message if the kubectl get pods command fails, even if it's non-fatal. This can help with debugging.
    • Issue: command_exists function is not provided in the diff

      • Suggestion: Please provide the content of the function so that it can be reviewed.
    • Issue: No input validation or sanitization on $NAMESPACE and $SERVICE_NAME variables, which could lead to command injection if these variables are sourced from an untrusted source.

      • Suggestion: Implement input validation and sanitization on these variables.

I need to see the surrounding code (especially the definition of command_exists) to give more targeted advice. Also, consider the source of the variables like $NAMESPACE - if they come from user input or environment variables, they need careful sanitization to prevent command injection vulnerabilities.

--- a/hack/benchmark-test.sh
+++ b/hack/benchmark-test.sh
@@ -16,6 +16,7 @@
 #------
 
 set -o errexit
+set -o nounset
 
 # Colors
 RED='\033[0;31m'
@@ -28,6 +29,7 @@
 NAMESPACE=${NAMESPACE:-"benchmark-ci"}
 SERVICE_NAME=${SERVICE_NAME:-"benchmark-mlop-listener"}
 LOCAL_PORT=${LOCAL_PORT:-8080}
+USE_KNOWN_FP=${USE_KNOWN_FP:-true} # Default to true, can be overridden
 
 # Detect if tools are installed
 HAS_JQ=$(command -v jq)
@@ -42,6 +44,8 @@
 usage() {
     echo "Usage: $0 [options]"
     echo "Options:"
+    echo "  -h | --help              Show this help message"
+    echo "  -t | --trigger-source    Specify the trigger source (default: manual-test)"
     echo "  -n | --namespace <namespace>   Specify the Kubernetes namespace (default: benchmark-ci)"
     echo "  -s | --service <service_name>  Specify the EventListener service name (default: benchmark-mlop-listener)"
     echo "  -p | --port <local_port>       Specify the local port for port-forward (default: 8080)"
@@ -51,11 +55,24 @@
 
 # Parse command line arguments
 while [[ $# -gt 0 ]]; do
-    case "$1" in
+  case "$1" in
+    -h|--help)
+      usage
+      exit 0
+      ;;
+    -t|--trigger-source)
+      TRIGGER_SOURCE="$2"
+      shift # past argument
+      shift # past value
+      ;;
     -n|--namespace)
       NAMESPACE="$2"
       shift # past argument
       shift # past value
+      ;;
+    --use-known-fp)
+      USE_KNOWN_FP="$2"
+      shift
       ;;
     -s|--service)
       SERVICE_NAME="$2"
@@ -72,6 +89,7 @@
       shift # past argument
       ;;
     *)
+      echo "Unknown parameter passed: $1"
       usage
       exit 1
       ;;
@@ -89,6 +107,7 @@
 
 # Function to display current configuration
 display_configuration() {
+
     echo -e "${YELLOW}Current Configuration:${NC}"
     $KUBECTL get configmap benchmark-config -n "$NAMESPACE" -o jsonpath='{.data}' | grep -o '"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/^/  /' || echo "  (unable to read)"
     echo ""
@@ -103,7 +122,7 @@
     echo ""
     echo -e "${YELLOW}Note: Keep this terminal open. Use another terminal to send test requests.${NC}"
     echo ""
-    
+
     # Start port-forward
     $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE"
 }
@@ -111,10 +130,10 @@
 # Function to send test request
 send_test_request() {
     echo -e "${YELLOW}Sending test request to EventListener...${NC}"
-    
+
     # Generate timestamp for unique identification
     TIMESTAMP=$(date +%Y%m%d-%H%M%S)
-    
+
     # Prepare payload with all MLOps parameters (using underscores to match TriggerBinding)
     PAYLOAD=$(cat <<EOF
 {
@@ -128,7 +147,7 @@
 }
 EOF
 )
-    
+
     echo "Payload:"
     if [ "$HAS_JQ" = true ]; then
         echo "$PAYLOAD" | jq '.'
@@ -136,15 +155,15 @@
         echo "$PAYLOAD"
     fi
     echo ""
-    
+
     # Send request
     echo "Sending POST request to http://localhost:$LOCAL_PORT ..."
     RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST "http://localhost:$LOCAL_PORT" \
         -H "Content-Type: application/json" \
         -d "$PAYLOAD" 2>&1)
-    
+
     # Parse response
     HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS:" | cut -d':' -f2)
     BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS:/d')
@@ -158,7 +177,7 @@
         echo "$BODY"
     fi
     echo ""
-    
+
     if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then
         echo -e "${GREEN}✓ EventListener accepted the request!${NC}"
         echo ""
@@ -181,10 +200,10 @@
 watch_pipelineruns() {
     echo -e "${YELLOW}Watching recent benchmark PipelineRuns...${NC}"
     echo ""
-    
+
     if [ "$HAS_TKN" = true ]; then
         echo "Using tkn to watch PipelineRuns:"
-        tkn pipelinerun list -n "$NAM
+        tkn pipelinerun list -n "$NAMESPACE"
     else
         echo "Using kubectl to watch PipelineRuns:"
         kubectl get pipelinerun -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop -w
@@ -192,6 +211,7 @@
     echo ""
 }
 
+
 # Main script logic
 
 # Display configuration
@@ -204,3 +224,4 @@
 
 # Optionally watch pipeline runs
 watch_pipelineruns
+

Review Summary:

The script introduces helpful functions for testing Tekton EventListeners. It adds argument parsing, configuration display, port forwarding, request sending, and PipelineRun watching. The code is generally well-structured and readable.

File: hack/benchmark-test.sh

  • Issue: The script does not handle unset variables properly. This can lead to unexpected behavior.
    Suggestion: Add set -o nounset to the beginning of the script to ensure that the script exits if an unset variable is used. This has already been added.
  • Issue: The script lacks a help option and the script usage is not very clear.
    Suggestion: Add a -h or --help option to display usage information and make the usage message more descriptive. This has already been added.
  • Issue: It would be beneficial to allow users to specify the trigger source via a command-line argument.
    Suggestion: Add a -t or --trigger-source option. This has already been added.
  • Issue: There's no validation for the USE_KNOWN_FP variable. It should be a boolean value.
    Suggestion: Add validation to ensure it is either true or false. Alternatively, use a flag (e.g., --no-known-fp) instead of a boolean argument.
--- a/hack/menu.sh
+++ b/hack/menu.sh
@@ -0,0 +1,263 @@
+#!/bin/bash
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[0;33m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# Variables
+NAMESPACE=${NAMESPACE:-`oc project -q`}
+SERVICE_NAME=${SERVICE_NAME:-$(yq e '.spec.selector.app' charts/benchmark-operator/templates/service.yaml | tr -d '"')}
+LOCAL_PORT=${LOCAL_PORT:-8080}
+KUBECTL=${KUBECTL:-kubectl}
+
+# Check prerequisites
+check_prerequisites() {
+    echo -e "${YELLOW}Checking prerequisites...${NC}"
+    
+    # Check if kubectl is installed
+    if ! command -v $KUBECTL &> /dev/null
+    then
+        echo -e "${RED}kubectl could not be found. Please install it.${NC}"
+        exit 1
+    fi
+    
+    # Check if yq is installed
+    if ! command -v yq &> /dev/null
+    then
+        echo -e "${RED}yq could not be found. Please install it. (brew install yq)${NC}"
+        exit 1
+    fi
+
+    # Check if tkn is installed
+    if ! command -v tkn &> /dev/null
+    then
+        echo -e "${YELLOW}tkn could not be found. Some functions will be limited. Please install it. (brew install tektoncd-cli)${NC}"
+    fi
+
+    # Check if oc is installed
+    if ! command -v oc &> /dev/null
+    then
+        echo -e "${YELLOW}oc could not be found. Some functions will be limited. Please install it. (brew install openshift-cli)${NC}"
+    fi
+    
+    echo -e "${GREEN}Prerequisites checked!${NC}"
+    echo ""
+}
+
+# Check deployment status
+check_deployment() {
+    echo -e "${YELLOW}Checking deployment status...${NC}"
+    
+    # Check if namespace exists
+    $KUBECTL get namespace "$NAMESPACE" > /dev/null 2>&1
+    if [ $? -ne 0 ]; then
+        echo -e "${RED}Namespace '$NAMESPACE' not found. Please create it or set the NAMESPACE variable.${NC}"
+        exit 1
+    fi
+    
+    # Check if service exists
+    $KUBECTL get service "$SERVICE_NAME" -n "$NAMESPACE" > /dev/null 2>&1
+    if [ $? -ne 0 ]; then
+        echo -e "${RED}Service '$SERVICE_NAME' not found in namespace '$NAMESPACE'. Please deploy the chart.${NC}"
+        exit 1
+    fi
+    
+    # Check pod status
+    POD_NAME=$($KUBECTL get pods -n "$NAMESPACE" -l "app=$SERVICE_NAME" -o jsonpath="{.items[0].metadata.name}")
+    if [ -z "$POD_NAME" ]; then
+        echo -e "${RED}No pods found for service '$SERVICE_NAME' in namespace '$NAMESPACE'.${NC}"
+        exit 1
+    fi
+    POD_STATUS=$($KUBECTL get pod "$POD_NAME" -n "$NAMESPACE" -o jsonpath="{.status.phase}")
+    if [ "$POD_STATUS" != "Running" ]; then
+        echo -e "${YELLOW}Pod '$POD_NAME' is in status '$POD_STATUS' in namespace '$NAMESPACE'.${NC}"
+    else
+        echo -e "${GREEN}Pod '$POD_NAME' is running in namespace '$NAMESPACE'.${NC}"
+    fi
+    echo ""
+}
+
+# Show current configuration
+show_config() {
+    echo -e "${YELLOW}Current configuration:${NC}"
+    echo "  NAMESPACE: $NAMESPACE"
+    echo "  SERVICE_NAME: $SERVICE_NAME"
+    echo "  LOCAL_PORT: $LOCAL_PORT"
+    echo "  KUBECTL: $KUBECTL"
+    echo ""
+}
+
+# Start port-forward
+start_port_forward() {
+    echo -e "${YELLOW}Starting port-forward...${NC}"
+    echo "  $KUBECTL port-forward svc/$SERVICE_NAME $LOCAL_PORT:8080 -n $NAMESPACE"
+    $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE" &
+    echo -e "${GREEN}Port-forward started in background. Keep this terminal open.${NC}"
+    echo ""
+}
+
+# Send test request
+send_test_request() {
+    echo -e "${YELLOW}Sending test request...${NC}"
+    echo "  curl http://localhost:$LOCAL_PORT/benchmark-operator/v1/benchmark/trigger"
+    RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$LOCAL_PORT/benchmark-operator/v1/benchmark/trigger)
+    if [ "$RESPONSE" -eq "200" ]; then
+        echo -e "${GREEN}Test request successful! (HTTP 200 OK)${NC}"
+    else
+        echo -e "${RED}Test request failed! (HTTP $RESPONSE)${NC}"
+    fi
+    echo ""
+}
+
+# Watch PipelineRuns
+watch_pipelineruns() {
+    echo -e "${YELLOW}Watching PipelineRuns...${NC}"
+    
+    if command -v tkn &> /dev/null
+    then
+        echo "Recent benchmark PipelineRuns:"
+        tkn pipelinerun list -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop
+        echo ""
+        echo "To follow logs of the latest run:"
+        echo "  tkn pipelinerun logs -L -f -n $NAMESPACE"
+    else
+        echo "Recent benchmark PipelineRuns:"
+        $KUBECTL get pipelinerun -n "$NAMESPACE" -l app.kubernetes.io/component=benchmark-mlop --sort-by=.metadata.creationTimestamp
+        echo ""
+        echo "To view logs:"
+        echo "  $KUBECTL logs -l tekton.dev/pipelineTask=call-orchestrator-api -n $NAMESPACE --tail=100"
+    fi
+    echo ""
+    
+    echo -e "${YELLOW}Query PipelineRuns by trigger source:${NC}"
+    echo "  # Manual tests:"
+    echo "  $KUBECTL get pr -n $NAMESPACE -l sast-ai.redhat.com/trigger-source=manual-test"
+    echo ""
+    echo "  # ArgoCD triggers:"
+    echo "  $KUBECTL get pr -n $NAMESPACE -l sast-ai.redhat.com/trigger-source=argocd"
+    echo ""
+    echo "  # All benchmark runs:"
+    echo "  $KUBECTL get pr -n $NAMESPACE -l app.kubernetes.io/component=benchmark-mlop"
+    echo ""
+    
+    echo -e "${YELLOW}To clean up test PipelineRuns:${NC}"
+    echo "  cd ../.. && make eventlistener-clean NAMESPACE=$NAMESPACE"
+    echo ""
+}
+
+# Main menu
+show_menu() {
+    echo -e "${BLUE}=========================================${NC}"
+    echo -e "${BLUE}What would you like to do?${NC}"
+    echo -e "${BLUE}=========================================${NC}"
+    echo "1. Check deployment and configuration"
+    echo "2. Start port-forward (keep terminal open)"
+    echo "3. Send test request (requires port-forward in another terminal)"
+    echo "4. Watch PipelineRuns"
+    echo "5. Show current configuration"
+    echo "6. Full test (port-forward in background, send request, watch)"
+    echo "0. Exit"
+    echo ""
+    read -p "Enter choice [0-6]: " choice
+    echo ""
+    
+    case $choice in
+        1)
+            check_deployment
+            show_config
+            read -p "Press Enter to continue..."
+            show_menu
+            ;;
+        2)
+            start_port_forward
+            ;;
+        3)
+            send_test_request
+            read -p "Press Enter to continue..."
+            show_menu
+            ;;
+        4)
+            watch_pipelineruns
+            read -p "Press Enter to continue..."
+            show_menu
+            ;;
+        5)
+            show_config
+            read -p "Press Enter to continue..."
+            show_menu
+            ;;
+        6)
+            check_deployment
+            show_config
+            echo -e "${YELLOW}Starting port-forward in background...${NC}"
+            $KUBECTL port-forward "svc/$SERVICE_NAME" "$LOCAL_PORT:8080" -n "$NAMESPACE" &
+            PF_PID=$!
+            sleep 3
+            send_test_request
+            sleep 2
+            watch_pipelineruns
+            kill $PF_PID 2>/dev/null || true
+            echo -e "${GREEN}Port-forward stopped${NC}"
+            ;;
+        0)
+            echo "Exiting..."
+            exit 0
+            ;;
+        *)
+            echo -e "${RED}Invalid choice${NC}"
+            show_menu
+            ;;
+    esac
+}
+
+# Main execution
+check_prerequisites
+
+# If script is run with argument, execute that action directly
+if [ $# -gt 0 ]; then
+    case "$1" in
+        check|status)
+            check_deployment
+            show_config
+            ;;
+        port-forward|pf)
+            check_deployment
+            start_port_forward
+            ;;
+        test|trigger)
             check_deployment
             show_config
             send_test_request
@@ -260,3 +263,4 @@
             ;;
     esac
 fi
+show_menu

Review Summary:

The code introduces a menu-driven shell script for interacting with a Kubernetes deployment of a benchmark operator. It includes functions for checking prerequisites, deployment status, port forwarding, sending test requests, watching PipelineRuns, and displaying configuration. The script also supports running specific actions directly from the command line.

File: hack/menu.sh

  • Issue: The script doesn't handle the case where the port-forwarding fails. This can lead to the script hanging indefinitely.

    • Suggestion: Add error handling to the port-forwarding command to check if it was successful. Also, implement a timeout to prevent indefinite hanging.
  • Issue: The script uses sleep commands for waiting. This is not reliable.

    • Suggestion: Instead of using sleep 3 after starting port-forwarding, implement a check to verify the port is open and accepting connections before proceeding. A simple nc -z localhost $LOCAL_PORT in a loop with a timeout could achieve this. Similar approach can be used after send_test_request
  • Issue: The script uses kill $PF_PID 2>/dev/null || true which might not always work as expected.

    • Suggestion: More robust error handling for killing the port-forward process is needed. Consider using pkill -f "kubectl port-forward svc/$SERVICE_NAME" to kill the process, ensuring that any port-forward process related to the service gets terminated, rather than relying on $PF_PID which may not be accurate if the background process exits quickly for some reason.
  • Issue: The script relies on oc project -q which may not be available in all environments.

    • Suggestion: Instead of relying on oc, provide a default value for NAMESPACE and inform the user to set the NAMESPACE environment variable if it is not already set. The current approach is good, but the messaging could be more explicit during the prerequisite check.
  • Issue: The script retrieves POD_NAME assuming only one pod is associated with the service. This might not always be the case.

    • Suggestion: If multiple pods exist, the script should either list all pods or allow the user to select a specific pod. Alternatively, the script logic can be changed to fetch logs from all pods associated with the service.
  • Issue: The script is missing input validation on the menu choice.

    • Suggestion: Add input validation using regex or similar to ensure that the user inputs the right numeric input.
      Okay, I've reviewed the provided file differences. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a shell script for interacting with a Tekton pipeline, along with Tekton resources (TriggerBinding, TriggerTemplate) to automate pipeline execution based on events. The introduction of user-provided parameters to the Tekton resources creates flexibility but also potential security concerns that needs to be considered.

File-Specific Comments:

  • cli.sh

    • Issue: The script lacks input validation and sanitization. It directly uses user-provided values, which could lead to command injection vulnerabilities.
    • Suggestion: Implement robust input validation and sanitization for all user-provided values before using them in commands. Consider using getopts for argument parsing and avoid using eval.
    • Issue: The script does not handle errors gracefully. If a command fails, the script may continue execution, leading to unexpected results.
    • Suggestion: Add error handling to each command. Use set -e to exit immediately if a command exits with a non-zero status. Use || to handle specific errors.
    • Issue: The port-forward functionality is not ideal for production use. It requires the script to be running continuously.
    • Suggestion: Consider using a more robust solution for exposing the Tekton dashboard, such as an Ingress or LoadBalancer.
    • Issue: Lack of context on what the script actually does.
    • Suggestion: Add detailed comments explaining the purpose of each section of the script.
  • deploy/tekton/eventlistener/triggerbinding.yaml

    • Issue: The TriggerBinding extracts values directly from the request body. If the request body is not properly validated, this could lead to unexpected behavior.
    • Suggestion: Ensure that the system sending the webhook request validates the request body before sending it.
    • Issue: The parameters are exposed in the trigger binding.
    • Suggestion: Ensure that these parameters are correctly documented.
    • Suggestion: Consider using CEL (Common Expression Language) to validate the extracted values.
  • deploy/tekton/eventlistener/triggertemplate.yaml

    • Issue: The TriggerTemplate defines default values for some parameters. Ensure that these default values are secure and appropriate for the intended use case.
    • Suggestion: Review the default values for submitted-by, trigger-source, image-version and use-known-false-positive-file. Consider setting them to more restrictive values.
    • Issue: The template uses generateName, which is good for creating unique PipelineRun names.
    • Suggestion: Add a comment explaining why generateName is used instead of name.
    • Suggestion: Add more details to the descriptions of the parameters to improve readability.

I will wait for the next message to continue the review.

Okay, I've reviewed the changes. Here's a summary of potential issues and suggestions:

Review Summary:

The changes introduce a new Tekton trigger and modify the kustomization to create a separate mlops pipeline. The trigger is well-structured, passing parameters to the pipeline. The kustomization change is simple and effective for creating a distinct pipeline.

File-Specific Comments:

  • deploy/tekton/base/benchmark-tekton-trigger.yaml:

    • Suggestion: Consider adding a comment explaining the purpose of each annotation (e.g., sast-ai.redhat.com/submitted-by). This improves readability and maintainability.
    • Suggestion: Add resource limits/requests for the trigger. This will help ensure the trigger has enough resources to run, and prevent it from consuming too many resources.
  • deploy/tekton/overlays/mlops/kustomization.yaml:

    • No issues found. The use of nameSuffix is a clean way to avoid naming conflicts.

deploy/Makefile Outdated
Comment on lines 63 to 64
# EventListener Configuration
ORCHESTRATOR_API_URL ?=
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this


# S3/Minio Configuration
S3_OUTPUT_BUCKET_NAME ?= ""
S3_OUTPUT_BUCKET_NAME ?= bucket-name
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is the input bucket name?

deploy/Makefile Outdated
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo "🚀 SAST AI Workflow - Deployment"
@echo "🤖 SAST AI Workflow - MLOps Benchmarking Deployment"
@echo "🤖 SAST AI Workflow - MLOps Benchmarking Deployment"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this line


```bash
cd deploy
make tasks ENV=mlop NAMESPACE=your-namespace
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why we need to have separate concepts here? We were using namespace as the env until now.

@if [ "$(ENV)" = "prod" ]; then \
$(CO) delete -k tekton/overlays/prod -n $(NAMESPACE) --ignore-not-found > /dev/null 2>&1 || true; \
echo " ✓ Production Tekton resources removed (kustomize overlay)"; \
elif [ "$(ENV)" = "mlop" ]; then \
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use "mlops" instead of "mlop"?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants