Skip to content

add haggit's migration script to scripts directory#720

Open
haggit-eliyahu wants to merge 2 commits intomainfrom
add-haggit-migration-script
Open

add haggit's migration script to scripts directory#720
haggit-eliyahu wants to merge 2 commits intomainfrom
add-haggit-migration-script

Conversation

@haggit-eliyahu
Copy link
Copy Markdown
Contributor

No description provided.

@haggit-eliyahu haggit-eliyahu requested a review from a team as a code owner April 26, 2026 15:04
@github-actions
Copy link
Copy Markdown

Marketplace Validation Failed

Click to view the full report

Validation Report

🧩 Integrations
Pre-Build Stage

f5_big_iq

Validation Name Details
⚠️ SSL Integration Validation The default value of the 'Verify SSL' param in F5 Big IQ must be a boolean true

observe_it

Validation Name Details
⚠️ Mapping Rules Validation 'observe_it' has connectors but doesn't have default mapping rules
⚠️ SSL Connectors Validation - ObserveIT - Alerts Connector is missing a 'Verify SSL' parameter

websense

Validation Name Details
⚠️ SSL Integration Validation The default value of the 'Verify SSL' param in Websense must be a boolean true

outpost24

Validation Name Details
⚠️ Mapping Rules Validation 'outpost24' has connectors but doesn't have default mapping rules

fire_eye_ex

Validation Name Details
⚠️ SSL Integration Validation The default value of the 'Verify SSL' param in FireEye EX must be a boolean true
⚠️ Connectors Documentation Link Validation Integration 'fire_eye_ex' contains connectors with missing documentation link: - FireEye EX - Alerts Connector

mc_afee_active_response

Validation Name Details
⚠️ SSL Integration Validation McAfee Active Response is missing a 'Verify SSL' parameter

mc_afee_atd

Validation Name Details
⚠️ SSL Integration Validation The default value of the 'Verify SSL' param in McAfee ATD must be a boolean true

lastline

Validation Name Details
⚠️ Fields Validation Action Parameter name: Wait for the report? does not match the regex: ^[a-zA-Z0-9-'\s]+$|Verify SSL Ceritifcate?|Git Password/Token/SSH Key|EML/MSG Base64 String|Country(For multiple countries, provide comma-separated values)|Entity Identifier(s)|logzio_security_token|logzio_region|minimum_score|api_token|eyeglass_ip|API_Key|Alert_ID|Queue_State|logzio_operations_token|logzio_custom_endpoint|api_key|fields_to_search|severity_threshold|Entity Identifier(s) Type|Target Entity Identifier(s)|IOC_Enrichment|SLA (in minutes)|raw_json|alert_event_id|Additional_Data|page_size|sort_by|Data_Range|Incident_Key|Team_IDS|User_IDS|Service_IDS|Entity_State|Incidents_Statuses|from_time|to_time|Incident_ID|from_date|logzio_token|search_term|Ingest\ only\ alerts\ that\ have\ “is_security”\ attribute\ set\ to\ True?|Ingest\ only\ alerts\ that\ have\ “is_incident”\ attribute\ set\ to\ True?|Fetch\ Backwards\ Time\ Interval\ (minutes)|Events\ Padding\ Period\ (hours)|Is\ Exchange\ On-Prem?|Is\ Office365\ (Exchange\ Online)?|Extract\ urls\ from\ HTML\ email\ part?|Create\ a\ Separate\ Siemplify\ Alert\ per\ Attached\ Mail\ File?|Email\ Padding\ Period\ (minutes)|Tenant\ (Directory)\ ID|Should\ ingest\ only\ starred\ threats?|Should\ ingest\ threats\ related\ to\ incidents?|Use\ the\ same\ approach\ with\ event\ creation\ for\ all\ alert\ types?|Enable\ Fallback\ Logic\ Debug?|Create\ Chronicle\ SOAR\ Alerts\ for\ Sentinel\ incidents\ that\ do\ not\ have\ entities?|Incidents\ Padding\ Period\ (minutes)|Wait\ For\ Scheduled/NRT\ Alert\ Object|Api_Key|Fetch\ Private\ Notes?|Offenses\ Creation\ Timer\ (minutes)|What\ Value\ to\ use\ for\ the\ Name\ Field\ of\ Siemplify\ Alert?|What\ Value\ to\ use\ for\ the\ Rule\ Generator\ Field\ of\ Siemplify\ Alert?|Mask\ findings?|Events\ Padding\ Period\ (minutes)|Track\ New\ Events\ Threshold\ (hours)|Token\ Timeout\ (in\ Seconds)|Script\ Timeout\ (Seconds) Action Parameter name: Create Insight? does not match the regex: ^[a-zA-Z0-9-'\s]+$|Verify SSL Ceritifcate?|Git Password/Token/SSH Key|EML/MSG Base64 String|Country(For multiple countries, provide comma-separated values)|Entity Identifier(s)|logzio_security_token|logzio_region|minimum_score|api_token|eyeglass_ip|API_Key|Alert_ID|Queue_State|logzio_operations_token|logzio_custom_endpoint|api_key|fields_to_search|severity_threshold|Entity Identifier(s) Type|Target Entity Identifier(s)|IOC_Enrichment|SLA (in minutes)|raw_json|alert_event_id|Additional_Data|page_size|sort_by|Data_Range|Incident_Key|Team_IDS|User_IDS|Service_IDS|Entity_State|Incidents_Statuses|from_time|to_time|Incident_ID|from_date|logzio_token|search_term|Ingest\ only\ alerts\ that\ have\ “is_security”\ attribute\ set\ to\ True?|Ingest\ only\ alerts\ that\ have\ “is_incident”\ attribute\ set\ to\ True?|Fetch\ Backwards\ Time\ Interval\ (minutes)|Events\ Padding\ Period\ (hours)|Is\ Exchange\ On-Prem?|Is\ Office365\ (Exchange\ Online)?|Extract\ urls\ from\ HTML\ email\ part?|Create\ a\ Separate\ Siemplify\ Alert\ per\ Attached\ Mail\ File?|Email\ Padding\ Period\ (minutes)|Tenant\ (Directory)\ ID|Should\ ingest\ only\ starred\ threats?|Should\ ingest\ threats\ related\ to\ incidents?|Use\ the\ same\ approach\ with\ event\ creation\ for\ all\ alert\ types?|Enable\ Fallback\ Logic\ Debug?|Create\ Chronicle\ SOAR\ Alerts\ for\ Sentinel\ incidents\ that\ do\ not\ have\ entities?|Incidents\ Padding\ Period\ (minutes)|Wait\ For\ Scheduled/NRT\ Alert\ Object|Api_Key|Fetch\ Private\ Notes?|Offenses\ Creation\ Timer\ (minutes)|What\ Value\ to\ use\ for\ the\ Name\ Field\ of\ Siemplify\ Alert?|What\ Value\ to\ use\ for\ the\ Rule\ Generator\ Field\ of\ Siemplify\ Alert?|Mask\ findings?|Events\ Padding\ Period\ (minutes)|Track\ New\ Events\ Threshold\ (hours)|Token\ Timeout\ (in\ Seconds)|Script\ Timeout\ (Seconds) Action Parameter name: Wait for the report? does not match the regex: ^[a-zA-Z0-9-'\s]+$|Verify SSL Ceritifcate?|Git Password/Token/SSH Key|EML/MSG Base64 String|Country(For multiple countries, provide comma-separated values)|Entity Identifier(s)|logzio_security_token|logzio_region|minimum_score|api_token|eyeglass_ip|API_Key|Alert_ID|Queue_State|logzio_operations_token|logzio_custom_endpoint|api_key|fields_to_search|severity_threshold|Entity Identifier(s) Type|Target Entity Identifier(s)|IOC_Enrichment|SLA (in minutes)|raw_json|alert_event_id|Additional_Data|page_size|sort_by|Data_Range|Incident_Key|Team_IDS|User_IDS|Service_IDS|Entity_State|Incidents_Statuses|from_time|to_time|Incident_ID|from_date|logzio_token|search_term|Ingest\ only\ alerts\ that\ have\ “is_security”\ attribute\ set\ to\ True?|Ingest\ only\ alerts\ that\ have\ “is_incident”\ attribute\ set\ to\ True?|Fetch\ Backwards\ Time\ Interval\ (minutes)|Events\ Padding\ Period\ (hours)|Is\ Exchange\ On-Prem?|Is\ Office365\ (Exchange\ Online)?|Extract\ urls\ from\ HTML\ email\ part?|Create\ a\ Separate\ Siemplify\ Alert\ per\ Attached\ Mail\ File?|Email\ Padding\ Period\ (minutes)|Tenant\ (Directory)\ ID|Should\ ingest\ only\ starred\ threats?|Should\ ingest\ threats\ related\ to\ incidents?|Use\ the\ same\ approach\ with\ event\ creation\ for\ all\ alert\ types?|Enable\ Fallback\ Logic\ Debug?|Create\ Chronicle\ SOAR\ Alerts\ for\ Sentinel\ incidents\ that\ do\ not\ have\ entities?|Incidents\ Padding\ Period\ (minutes)|Wait\ For\ Scheduled/NRT\ Alert\ Object|Api_Key|Fetch\ Private\ Notes?|Offenses\ Creation\ Timer\ (minutes)|What\ Value\ to\ use\ for\ the\ Name\ Field\ of\ Siemplify\ Alert?|What\ Value\ to\ use\ for\ the\ Rule\ Generator\ Field\ of\ Siemplify\ Alert?|Mask\ findings?|Events\ Padding\ Period\ (minutes)|Track\ New\ Events\ Threshold\ (hours)|Token\ Timeout\ (in\ Seconds)|Script\ Timeout\ (Seconds)

site24x7

Validation Name Details
⚠️ Mapping Rules Validation 'site24x7' has connectors but doesn't have default mapping rules

illusive_networks

Validation Name Details
⚠️ Mapping Rules Validation 'illusive_networks' has connectors but doesn't have default mapping rules
⚠️ SSL Integration Validation The default value of the 'Verify SSL' param in Illusive Networks must be a boolean true
⚠️ SSL Connectors Validation - The default value of the 'Verify SSL' param in Illusive Networks - Incidents Connector must be a boolean true

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new automation tool designed to streamline the migration and refactoring process for integrations. By leveraging LibCST for code manipulation and integrating with existing repository utilities, the script ensures consistency across migrated projects, handles complex dependency updates, and automates repetitive maintenance tasks like versioning and license management.

Highlights

  • New Migration Script: Added a comprehensive Python script to the scripts directory to automate the refactoring and migration of integrations.
  • Automated Refactoring: The script handles widget conversion, test migration, dependency management, and code transformations using LibCST.
  • Project Maintenance: Includes automated version bumping, release note generation, license header application, and Ruff configuration updates.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces scripts/refactor_integration.py, a utility for automating the refactoring of integrations, including widget conversion, code deconstruction, and test migration. The review feedback identifies several style guide violations, specifically recommending the use of the pipe operator for type unions and the consistent use of pathlib.Path methods for file system operations.

class SDKInstanceTransformer(cst.CSTTransformer):
"""Replaces strict isinstance checks on SDK objects with hasattr checks."""

def leave_Call(self, original_node: cst.Call, updated_node: cst.Call) -> Union[cst.Call, cst.BaseExpression]:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

According to the style guide, the pipe operator (|) should be used for unions instead of Union for Python 3.10+.

Suggested change
def leave_Call(self, original_node: cst.Call, updated_node: cst.Call) -> Union[cst.Call, cst.BaseExpression]:
def leave_Call(self, original_node: cst.Call, updated_node: cst.Call) -> cst.Call | cst.BaseExpression:
References
  1. Use the pipe operator for unions (e.g., str | None) instead of Optional ( Python 3.10+). (link)


def leave_ImportFrom(
self, original_node: cst.ImportFrom, updated_node: cst.ImportFrom
) -> Union[cst.ImportFrom, cst.RemovalSentinel]:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

According to the style guide, the pipe operator (|) should be used for unions instead of Union for Python 3.10+.

Suggested change
) -> Union[cst.ImportFrom, cst.RemovalSentinel]:
) -> cst.ImportFrom | cst.RemovalSentinel:
References
  1. Use the pipe operator for unions (e.g., str | None) instead of Optional ( Python 3.10+). (link)

"""The core engine for refactoring integrations."""

def __init__(
self, integrations_root: Path, dst_path: Path, tests_dir: Path, integrations_list: Optional[str] = None
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

According to the style guide, the pipe operator (|) should be used for unions instead of Optional for Python 3.10+.

Suggested change
self, integrations_root: Path, dst_path: Path, tests_dir: Path, integrations_list: Optional[str] = None
self, integrations_root: Path, dst_path: Path, tests_dir: Path, integrations_list: str | None = None
References
  1. Use the pipe operator for unions (e.g., str | None) instead of Optional ( Python 3.10+). (link)

for json_file in widgets_dir.glob("*.json"):
logger.debug(f"Processing widget file: {json_file.name}")
try:
with open(json_file, "r", encoding="utf-8") as f:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. Please use Path.open() or Path.read_text() instead of the built-in open() function.

Suggested change
with open(json_file, "r", encoding="utf-8") as f:
with json_file.open("r", encoding="utf-8") as f:
References
  1. Always use pathlib.Path for file system operations. (link)

with open(json_file, "r", encoding="utf-8") as f:
data = json.load(f)
converted = self._transform_widget_data(data)
with open(json_file, "w", encoding="utf-8") as f:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. Please use Path.open() or Path.write_text() instead of the built-in open() function.

Suggested change
with open(json_file, "w", encoding="utf-8") as f:
with json_file.open("w", encoding="utf-8") as f:
References
  1. Always use pathlib.Path for file system operations. (link)

Comment on lines +632 to +633
for root, _, _ in os.walk(tests_dest_path):
(Path(root) / "__init__.py").touch(exist_ok=True)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. os.walk should be replaced with a pathlib-based iteration.

Suggested change
for root, _, _ in os.walk(tests_dest_path):
(Path(root) / "__init__.py").touch(exist_ok=True)
for path in [tests_dest_path, *tests_dest_path.rglob("*")]:
if path.is_dir():
(path / "__init__.py").touch(exist_ok=True)
References
  1. Always use pathlib.Path for file system operations. (link)

def _add_local_deps(path: Path):
local_path = get_local_packages_path()

def find_latest_whl(package_name: str, subfolder: str) -> Optional[str]:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

According to the style guide, the pipe operator (|) should be used for unions instead of Optional for Python 3.10+.

Suggested change
def find_latest_whl(package_name: str, subfolder: str) -> Optional[str]:
def find_latest_whl(package_name: str, subfolder: str) -> str | None:
References
  1. Use the pipe operator for unions (e.g., str | None) instead of Optional ( Python 3.10+). (link)

if not pyproject_path.is_file():
return

with open(pyproject_path, "r", encoding="utf-8") as f:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. Please use Path.open() instead of the built-in open() function.

Suggested change
with open(pyproject_path, "r", encoding="utf-8") as f:
with pyproject_path.open("r", encoding="utf-8") as f:
References
  1. Always use pathlib.Path for file system operations. (link)

logger.debug(f"Bumping version from {data['project']['version']} to {new_v}")
data["project"]["version"] = new_v

with open(pyproject_path, "w", encoding="utf-8") as f:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. Please use Path.open() instead of the built-in open() function.

Suggested change
with open(pyproject_path, "w", encoding="utf-8") as f:
with pyproject_path.open("w", encoding="utf-8") as f:
References
  1. Always use pathlib.Path for file system operations. (link)

"item_name": name,
"publish_time": datetime.now().strftime("%Y-%m-%d"),
})
with open(rn_path, "a", encoding="utf-8") as f:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The style guide mandates the use of pathlib.Path for all file system operations. Please use Path.open() instead of the built-in open() function.

Suggested change
with open(rn_path, "a", encoding="utf-8") as f:
with rn_path.open("a", encoding="utf-8") as f:
References
  1. Always use pathlib.Path for file system operations. (link)

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.

1 participant