MicroFocusSMAX

Fetch SMAX cases and automate differen SMAX case management actions.

Case Management · MicroFocus SMAX

Details

IDMicroFocusSMAX
ProviderOpenText
CategoryCase Management
From Version6.0.0
Docker Imagedemisto/python3:3.12.8.3296088
Supported ModulesAgentix XSIAM

README

Fetch SMAX incidents, requests and automate different SMAX case management actions
This integration was integrated and tested with version 2021.08 of MicroFocus SMAX

Configure MicroFocus SMAX in Cortex

Parameter Description Required
Object To Fetch   False
Your SMAX Management URL   True
Tenant ID The tenant ID is the number following TENANTID= in your management URL False
Username The admin credentials used to integration with SMAX True
Password   True
Fetch Filter Fetch filter , example: Status = ‘Ready’” for Incident queries, see “REST API collection query protocol” in SMAX documentation to know how to use the filter False
Fields To Fetch Fields to return, for example: “Priority,Category” for an entity of type “Incident False
Fetch Limit The maximum number of incidents to fetch per fetch command False
Fetch Start Fetch start in days False
Trust any certificate (not secure)   False
Use system proxy settings   False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

microfocus-smax-get-entity


Get any entity details

Base Command

microfocus-smax-get-entity

Input

Argument Name Description Required
entity_type Entity type, for example: “Incident”, the type is case-sensitive. Possible values are: . Required
entity_id Entity Id . Required
entity_fields Fields to return, for example: “Priority,Category” for an entity of type “Incident”. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name

Command Example

!microfocus-smax-get-entity entity_type="Incident" entity_id="16989" entity_fields="Description,Urgency,Status,RegisteredForActualService"

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "entity_type": "Incident",
                "properties": {
                    "Description": "Test Description",
                    "DisplayLabel": "test66122",
                    "Id": "16989",
                    "LastUpdateTime": 1635339214960,
                    "RegisteredForActualService": "11639",
                    "Status": "Ready",
                    "Urgency": "SlightDisruption"
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Entity Details

Description DisplayLabel Id LastUpdateTime RegisteredForActualService Status Type Urgency
Test Description test66122 16989 1635339214960 11639 Ready Incident SlightDisruption

microfocus-smax-query-entities


Query entities’ details using a collection query filter

Base Command

microfocus-smax-query-entities

Input

Argument Name Description Required
entity_type Entity type, for example: “Incident”, the type is case-sensitive. Required
query_filter Query filter , example: Status = ‘Ready’” for Incident queries, see “REST API collection query protocol” in SMAX documentation to know how to use the filter. Optional
entity_fields Fields to return, for example: “Priority,Category” for an entity of type “Incident”. Optional
order_by The order query parameter specifies the order in which the returned resources are placed, example: “Id desc”. Optional
size Specify the maximum number of resources requested to be returned. Optional
skip Specify how many resources should be skipped by specifying the starting index of the returned result. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Query.query_time String Query time
MicroFocus.SMAX.Query.total_count String Query results total count
MicroFocus.SMAX.Query.completion_status String Query result status

Command Example

!microfocus-smax-query-entities entity_type="Incident" query_filter="Status = 'Ready'" entity_fields="Status,Urgency" order_by="Id desc" size="5"

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": [
                {
                    "entity_type": "Incident",
                    "properties": {
                        "Id": "17658",
                        "LastUpdateTime": 1635338444483,
                        "Status": "Ready",
                        "Urgency": "NoDisruption"
                    },
                    "related_properties": {}
                },
                {
                    "entity_type": "Incident",
                    "properties": {
                        "Id": "17656",
                        "LastUpdateTime": 1635331698499,
                        "Status": "Ready",
                        "Urgency": "SlightDisruption"
                    },
                    "related_properties": {}
                },
                {
                    "entity_type": "Incident",
                    "properties": {
                        "Id": "17652",
                        "LastUpdateTime": 1635256251981,
                        "Status": "Ready",
                        "Urgency": "NoDisruption"
                    },
                    "related_properties": {}
                },
                {
                    "entity_type": "Incident",
                    "properties": {
                        "Id": "17650",
                        "LastUpdateTime": 1635247508242,
                        "Status": "Ready",
                        "Urgency": "SlightDisruption"
                    },
                    "related_properties": {}
                },
                {
                    "entity_type": "Incident",
                    "properties": {
                        "Id": "17647",
                        "LastUpdateTime": 1635247121852,
                        "Status": "Ready",
                        "Urgency": "NoDisruption"
                    },
                    "related_properties": {}
                }
            ],
            "Query": {
                "completion_status": "OK",
                "errorDetailsList": [],
                "errorDetailsMetaList": [],
                "query_time": 1635341363698808,
                "total_count": 47
            }
        }
    }
}

Human Readable Output

Result Details

Id LastUpdateTime Status Type Urgency
17658 1635338444483 Ready Incident NoDisruption
17656 1635331698499 Ready Incident SlightDisruption
17652 1635256251981 Ready Incident NoDisruption
17650 1635247508242 Ready Incident SlightDisruption
17647 1635247121852 Ready Incident NoDisruption

microfocus-smax-create-entities


Create new entities

Base Command

microfocus-smax-create-entities

Input

Argument Name Description Required
entities A list of new entity objects to creates, please review the Bulk API documentation for more information. Required

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-create-entities entities=`[ { "entity_type": "Incident", "properties": { "DisplayLabel": "Test incident", "Description": "Test incident description", "RegisteredForActualService": "11639", "Urgency": "NoDisruption" } } ]`

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Incident",
                "properties": {
                    "Id": "17013",
                    "LastUpdateTime": 1635341339329
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Entities Creation Details

CompletionStatus Id LastUpdateTime Type
OK 17013 1635341339329 Incident

microfocus-smax-update-entities


Update entities

Base Command

microfocus-smax-update-entities

Input

Argument Name Description Required
entities A list of updated entity objects, please review the Bulk API documentation for more information. Required

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-update-entities entities=`[ { "entity_type": "Incident", "properties": { "Id": "16989", "Description": "Test Description" } } ]`

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Incident",
                "properties": {
                    "Id": "16989",
                    "LastUpdateTime": 1635339214960
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Entities Update Details

CompletionStatus Id LastUpdateTime Type
OK 16989 1635339214960 Incident

microfocus-smax-create-incident


Create a new incident

Base Command

microfocus-smax-create-incident

Input

Argument Name Description Required
incident_name Incident name. Required
incident_description Incident description. Required
impacted_service Impacted service by the incident, you must provide a service id. Required
requested_by Incident requested by, you must provide a user id. Optional
incident_urgency Incident urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. Optional
impact_scope Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. Optional
service_desk_group Service desk group, you have to provide a group id. Optional
other_properities An object of other properities. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-create-incident incident_name="Test incident" incident_description="Test incident description" impacted_service="11639" other_properities=`{"Status": "Ready","Urgency": "NoDisruption"}`

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Incident",
                "properties": {
                    "Id": "17015",
                    "LastUpdateTime": 1635341345342
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Incident Creation Results

CompletionStatus Id LastUpdateTime Type
OK 17015 1635341345342 Incident

microfocus-smax-update-incident


Update an incident

Base Command

microfocus-smax-update-incident

Input

Argument Name Description Required
incident_id Incident Id. Required
incident_description Incident description. Optional
incident_urgency Incident urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. Optional
impact_scope Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. Optional
incident_status Incident status. Possible values are: Ready, InProgress, Pending, Suspended, Complete. Optional
incident_closure_category Incident closure category, you have to provide a category Id. Optional
incident_completion_code Incident completion code. Optional
incident_solution Incident solution details. Optional
other_properities An object of other properities. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-update-incident incident_id="17007" incident_description="Test Description" incident_status="Complete" incident_solution="Test Solution"

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Incident",
                "properties": {
                    "Id": "17007",
                    "LastUpdateTime": 1635339537768
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Incident Update Results

CompletionStatus Id LastUpdateTime Type
OK 17007 1635339537768 Incident

microfocus-smax-create-request


Create a new request

Base Command

microfocus-smax-create-request

Input

Argument Name Description Required
request_name Request name. Required
request_description Request description. Required
requested_by Requested by, you must provide a user id. Required
requested_for Requested for, you must provide a user id. Required
request_urgency Request urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. Optional
impact_scope Request impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. Optional
other_properities An object of other properities. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-create-request request_name="Test Request" request_description="Test Request Description" requested_by="10388" requested_for="10388"

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Request",
                "properties": {
                    "Id": "17549",
                    "LastUpdateTime": 1635341351250
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Request Creation Results

CompletionStatus Id LastUpdateTime Type
OK 17549 1635341351250 Request

microfocus-smax-update-request


Update a request

Base Command

microfocus-smax-update-request

Input

Argument Name Description Required
request_id Request Id. Required
request_description Request description. Optional
request_urgency Request urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. Optional
impact_scope Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. Optional
request_status Request status. Possible values are: RequestStatusReady, RequestStatusInProgress, RequestStatusPending, RequestStatusSuspended, RequestStatusComplete, RequestStatusPendingParent, RequestStatusRejected, RequestStatusPendingVendor, RequestStatusPendingExternalServiceDesk, RequestStatusPendingSpecialOperation. Optional
request_note Request update note. Optional
other_properities An object of other properities. Optional

Context Output

Path Type Description
MicroFocus.SMAX.Entities.properties.Id String Entity Id
MicroFocus.SMAX.Entities.properties.Name String Entity name
MicroFocus.SMAX.Entities.properties.completion_status String Query result status

Command Example

!microfocus-smax-update-request request_id="17009" request_description="Test Description" request_status="RequestStatusPendingSpecialOperation"

Context Example

{
    "MicroFocus": {
        "SMAX": {
            "Entities": {
                "completion_status": "OK",
                "entity_type": "Request",
                "properties": {
                    "Id": "17009",
                    "LastUpdateTime": 1635339631068
                },
                "related_properties": {}
            }
        }
    }
}

Human Readable Output

Request Update Results

CompletionStatus Id LastUpdateTime Type
OK 17009 1635339631068 Request

Configuration parameters

  • object_to_fetch — Object To Fetch
  • url — Your SMAX Management URL (required)
  • tenant_id — Tenant ID
  • credentials — Username (required)
  • fetch_query_filter — Fetch Filter
  • fetch_fields — Fields To Fetch
  • fetch_limit — Fetch Limit
  • fetch_start — Fetch Start
  • insecure — Trust any certificate (not secure)
  • proxy — Use system proxy settings
  • incidentType — Incident type
  • incidentFetchInterval — Incidents Fetch Interval
  • isFetch — Fetch incidents

Commands (8)

  • microfocus-smax-create-entities

    Create new entities.

  • microfocus-smax-create-incident

    Create a new incident.

  • microfocus-smax-create-request

    Create a new request.

  • microfocus-smax-get-entity

    Get any entity details.

  • microfocus-smax-query-entities

    Query entities' details using a collection query filter.

  • microfocus-smax-update-entities

    Update entities.

  • microfocus-smax-update-incident

    Update an incident.

  • microfocus-smax-update-request

    Update a request.

import traceback
from typing import Any

import requests
import urllib3
from CommonServerPython import *

urllib3.disable_warnings()  # pylint: disable=no-member


""" CONSTANTS """

DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"

""" CLIENT CLASS """


class Client(BaseClient):
    def __init__(self, base_url: str, token: object, tenant_id: str, use_ssl: bool, use_proxy: bool, **kwargs):
        super().__init__(base_url, verify=use_ssl, proxy=use_proxy, **kwargs)
        self.headers = {"Cookie": f"SMAX_AUTH_TOKEN={token}"}
        self.tenant_id = tenant_id

    def get_entity(self, entity_type, entity_id, entity_fields):
        url_suffix = f"rest/{self.tenant_id}/ems/{entity_type}/{entity_id}"
        params = {"layout": entity_fields}
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params=params)
        return response

    def query_entities(self, entity_type, query_filter, entity_fields, order_by, size, skip):
        url_suffix = f"rest/{self.tenant_id}/ems/{entity_type}"
        params = {"layout": entity_fields, "meta": "TotalCount,Count"}
        if query_filter:
            params.update({"filter": query_filter})
        if order_by:
            params.update({"order": order_by})
        if size:
            params.update({"size": size})
        if skip:
            params.update({"skip": skip})
        response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params=params)
        return response

    def bulk_action(self, action_type, entities):
        if type(entities) is str:
            entities = json.loads(entities)
        url_suffix = f"rest/{self.tenant_id}/ems/bulk"
        payload = {"entities": entities, "operation": action_type}
        response = self._http_request(method="POST", url_suffix=url_suffix, headers=self.headers, json_data=payload)
        return response


""" HELPER FUNCTIONS """


def login(server: str, tenant: str, username: str, password: str, verify_certificate: bool):
    response = requests.post(
        f"{server}/auth/authentication-endpoint/authenticate/token?TENANTID={tenant}",
        verify=verify_certificate,
        json={"Login": username, "Password": password},
    )
    token = response.text
    if not token:
        raise DemistoException(f"Authorization Error: please check your credentials. \n\nError:\n{response}")
    return token


def validate_fetch_params(fetch_limit, fetch_start):
    try:
        fetch_limit = int(fetch_limit)
    except Exception as e:
        raise DemistoException(f"Fetch limit has to be a number, Error Details: {e}")
    if not fetch_limit or fetch_limit > 200:
        raise DemistoException("Fetch limit has to be in a range between 1 and 200")

    try:
        fetch_start = int(fetch_start)
    except Exception as e:
        raise DemistoException(f"Fetch start has to be a number, Error Details: {e}")
    if not fetch_start:
        raise DemistoException("Fetch start is not specified")


""" COMMAND FUNCTIONS """


def test_module(client: Client, username, fetch_limit, fetch_start) -> str:
    client.query_entities(
        entity_type="Person",
        query_filter=f"Name startswith ('{username}')",
        order_by=None,
        entity_fields="Id",
        size=None,
        skip=None,
    )
    validate_fetch_params(fetch_limit=fetch_limit, fetch_start=fetch_start)
    return "ok"


def fetch_incidents_command(
    client: Client, object_to_fetch="Incident", fetch_query_filter=None, fetch_fields=None, fetch_limit="100", fetch_start="1"
):
    incidents = []
    validate_fetch_params(fetch_limit=fetch_limit, fetch_start=fetch_start)
    if fetch_fields:
        fetch_fields = "DisplayLabel,Id,EmsCreationTime" + fetch_fields
    else:
        fetch_fields = "DisplayLabel,Id,EmsCreationTime"

    last_run = demisto.getLastRun()
    if last_run and "start_time" in last_run:
        start_time = last_run.get("start_time") + 1
    else:
        start_time = round((datetime.now() - timedelta(days=int(fetch_start))).timestamp() * 1000)
    if fetch_query_filter:
        fetch_query_filter = f"EmsCreationTime btw ({start_time},{round(datetime.now().timestamp() * 1000)})" + fetch_query_filter
    else:
        fetch_query_filter = f"EmsCreationTime btw ({start_time},{round(datetime.now().timestamp() * 1000)})"

    results = client.query_entities(
        entity_type=object_to_fetch,
        query_filter=fetch_query_filter,
        order_by="Id desc",
        entity_fields=fetch_fields,
        size=fetch_limit,
        skip=None,
    )
    for entity in results.get("entities"):
        properties = entity.get("properties")
        created_at_epoch = int(properties.get("EmsCreationTime"))
        created_at_date = datetime.fromtimestamp(round(created_at_epoch / 1000), timezone.utc)
        entity_id = properties.get("Id")
        raw_json = {"Type": entity.get("entity_type")}
        raw_json.update(properties)
        inc = {
            "name": f"SMAX {object_to_fetch}: {entity_id}",
            "occurred": created_at_date.isoformat(),
            "rawJSON": json.dumps(raw_json),
        }
        incidents.append(inc)
        if created_at_epoch > start_time:
            start_time = created_at_epoch
    incidents.reverse()
    demisto.setLastRun({"start_time": start_time})
    demisto.incidents(incidents)


def get_entity_command(client: Client, args: dict[str, Any]) -> CommandResults:
    entity_type = args.get("entity_type", None)
    entity_id = args.get("entity_id", None)
    entity_fields = args.get("entity_fields", None)

    readable_entity = {}

    if not (entity_type and entity_id):
        raise ValueError("Entity Type and ID are not specified")

    if entity_fields:
        entity_fields = "DisplayLabel,Id," + entity_fields
    else:
        entity_fields = "DisplayLabel,Id"

    result = client.get_entity(entity_type=entity_type, entity_id=entity_id, entity_fields=entity_fields)

    if result.get("entities"):
        entity = result.get("entities")[0]

        readable_entity["Type"] = entity.get("entity_type")
        readable_entity.update(entity.get("properties"))

        readable_output = tableToMarkdown("Entity Details:", readable_entity)

        return CommandResults(
            outputs_prefix="MicroFocus.SMAX.Entities",
            outputs_key_field="properties.Id",
            readable_output=readable_output,
            outputs=entity,
        )
    else:
        return CommandResults(readable_output="The entity is not found")


def query_entities_command(client: Client, args: dict[str, Any]):
    entity_type = args.get("entity_type", None)
    entity_fields = args.get("entity_fields", None)
    query_filter = args.get("query_filter", None)
    order_by = args.get("order_by", None)
    size = args.get("size", None)
    skip = args.get("skip", None)

    readable_entities = []

    if not entity_type:
        raise ValueError("Entity Type is not specified")

    if entity_fields:
        entity_fields = "Name,Id," + entity_fields
    else:
        entity_fields = "Name,Id"

    results = client.query_entities(
        entity_type=entity_type, entity_fields=entity_fields, query_filter=query_filter, order_by=order_by, size=size, skip=skip
    )
    if results.get("entities"):
        for entity in results.get("entities"):
            readable_entity = {"Type": entity.get("entity_type")}
            readable_entity.update(entity.get("properties"))
            readable_entities.append(readable_entity)
        meta_data = results.get("meta")
        count_readable_output = tableToMarkdown(
            "Result Total Count:", {"Query Time": meta_data.get("query_time"), "Total Count": meta_data.get("total_count")}
        )

        results_readable_output = tableToMarkdown("Result Details:", readable_entities)

        return [
            CommandResults(
                outputs_prefix="MicroFocus.SMAX.Query",
                outputs_key_field="query_time",
                readable_output=count_readable_output,
                outputs=results.get("meta"),
            ),
            CommandResults(
                outputs_prefix="MicroFocus.SMAX.Entities",
                outputs_key_field="properties.Id",
                readable_output=results_readable_output,
                outputs=results.get("entities"),
            ),
        ]
    else:
        return CommandResults(readable_output="No entities found")


def create_entities_command(client: Client, args: dict[str, Any]) -> CommandResults:
    entities = args.get("entities", None)

    readable_entities = []
    context_entities = []

    if not entities:
        raise ValueError("Entities are not specified")

    result = client.bulk_action(action_type="CREATE", entities=entities)
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Entities Creation Details:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


def update_entities_command(client: Client, args: dict[str, Any]) -> CommandResults:
    entities = args.get("entities", None)

    readable_entities = []
    context_entities = []

    if not entities:
        raise ValueError("Entities are not specified")

    result = client.bulk_action(action_type="UPDATE", entities=entities)
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Entities Update Details:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


def create_incident_command(client: Client, args: dict[str, Any]) -> CommandResults:
    readable_entities = []
    context_entities = []

    incident_name = args.get("incident_name")
    incident_description = args.get("incident_description")
    impacted_service = args.get("impacted_service")
    requested_by = args.get("requested_by", None)
    incident_urgency = args.get("incident_urgency", None)
    impact_scope = args.get("impact_scope", None)
    service_desk_group = args.get("service_desk_group", None)
    other_properities = args.get("other_properities", None)

    incident_properities = {
        "DisplayLabel": incident_name,
        "Description": incident_description,
        "RegisteredForActualService": impacted_service,
    }

    if requested_by:
        incident_properities["RequestedByPerson"] = requested_by
    if incident_urgency:
        incident_properities["Urgency"] = incident_urgency
    if impact_scope:
        incident_properities["ImpactScope"] = impact_scope
    if service_desk_group:
        incident_properities["ServiceDeskGroup"] = service_desk_group
    if other_properities:
        incident_properities.update(json.loads(other_properities))

    incident_object = {"entity_type": "Incident", "properties": incident_properities}

    result = client.bulk_action(action_type="CREATE", entities=[incident_object])
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Incident Creation Results:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


def update_incident_command(client: Client, args: dict[str, Any]) -> CommandResults:
    readable_entities = []
    context_entities = []

    incident_id = args.get("incident_id")
    incident_description = args.get("incident_description", None)
    incident_urgency = args.get("incident_urgency", None)
    incident_scope = args.get("incident_scope", None)
    incident_status = args.get("incident_status", None)
    incident_closure_category = args.get("incident_closure_category", None)
    incident_completion_code = args.get("incident_completion_code", None)
    incident_solution = args.get("incident_solution", None)
    other_properities = args.get("other_properities", None)

    incident_properities = {"Id": incident_id}

    if incident_description:
        incident_properities["Description"] = incident_description
    if incident_urgency:
        incident_properities["Urgency"] = incident_urgency
    if incident_scope:
        incident_properities["ImpactScope"] = incident_scope
    if incident_status:
        incident_properities["Status"] = incident_status
    if incident_closure_category:
        incident_properities["ClosureCategory"] = incident_closure_category
    if incident_completion_code:
        incident_properities["CompletionCode"] = incident_completion_code
    if incident_solution:
        incident_properities["Solution"] = incident_solution
    if other_properities:
        incident_properities.update(json.loads(other_properities))

    request_object = {"entity_type": "Incident", "properties": incident_properities}

    result = client.bulk_action(action_type="UPDATE", entities=[request_object])
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Incident Update Results:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


def create_request_command(client: Client, args: dict[str, Any]) -> CommandResults:
    readable_entities = []
    context_entities = []

    request_name = args.get("request_name")
    request_description = args.get("request_description")
    requested_by = args.get("requested_by")
    requested_for = args.get("requested_for")
    request_urgency = args.get("request_urgency", None)
    impact_scope = args.get("impact_scope", None)
    other_properities = args.get("other_properities", None)

    request_properities = {
        "DisplayLabel": request_name,
        "Description": request_description,
        "RequestedByPerson": requested_by,
        "RequestedForPerson": requested_for,
    }

    if request_urgency:
        request_properities["Urgency"] = request_urgency
    if impact_scope:
        request_properities["ImpactScope"] = impact_scope
    if other_properities:
        request_properities.update(json.loads(other_properities))

    request_object = {"entity_type": "Request", "properties": request_properities}

    result = client.bulk_action(action_type="CREATE", entities=[request_object])
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Request Creation Results:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


def update_request_command(client: Client, args: dict[str, Any]) -> CommandResults:
    readable_entities = []
    context_entities = []

    request_id = args.get("request_id")
    request_description = args.get("request_description", None)
    request_urgency = args.get("request_urgency", None)
    impact_scope = args.get("impact_scope", None)
    request_status = args.get("request_status", None)
    request_note = args.get("request_note", None)
    other_properities = args.get("other_properities", None)

    request_properities = {"Id": request_id}

    if request_description:
        request_properities["Description"] = request_description
    if request_urgency:
        request_properities["Urgency"] = request_urgency
    if impact_scope:
        request_properities["ImpactScope"] = impact_scope
    if request_status:
        request_properities["Status"] = request_status
    if request_note:
        request_properities["ClosureCategory"] = request_note
    if other_properities:
        request_properities.update(json.loads(other_properities))

    request_object = {"entity_type": "Request", "properties": request_properities}

    result = client.bulk_action(action_type="UPDATE", entities=[request_object])
    bulk_results = result.get("entity_result_list")
    for entity in bulk_results:
        entity_object = entity.get("entity")
        completion_status = entity.get("completion_status")
        context_entity = {"completion_status": completion_status}
        context_entity.update(entity_object)
        context_entities.append(context_entity)
        readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status}
        readable_entity.update(entity_object.get("properties"))
        readable_entities.append(readable_entity)

    results_readable_output = tableToMarkdown("Request Update Results:", readable_entities)

    return CommandResults(
        outputs_prefix="MicroFocus.SMAX.Entities",
        outputs_key_field="properties.Id",
        readable_output=results_readable_output,
        outputs=context_entities,
    )


""" MAIN FUNCTION """


def main() -> None:
    args = demisto.args()
    params = demisto.params()
    base_url = params.get("url")
    tenant_id = params.get("tenant_id")
    object_to_fetch = params.get("object_to_fetch")
    fetch_query_filter = params.get("fetch_query_filter")
    fetch_fields = params.get("fetch_fields")
    fetch_start = params.get("fetch_start")
    fetch_limit = params.get("fetch_limit")
    verify_certificate = not params.get("insecure", False)
    proxy = not params.get("insecure", False)
    username = params.get("credentials", {}).get("identifier")
    password = params.get("credentials", {}).get("password")

    handle_proxy()

    token = login(base_url, tenant_id, username, password, verify_certificate)

    demisto.debug(f"Command being called is {demisto.command()}")
    try:
        client = Client(base_url=base_url, token=token, tenant_id=tenant_id, use_ssl=verify_certificate, use_proxy=proxy)

        if demisto.command() == "test-module":
            result = test_module(client, username, fetch_start=fetch_start, fetch_limit=fetch_limit)
            return_results(result)

        if demisto.command() == "fetch-incidents":
            fetch_incidents_command(
                client,
                object_to_fetch=object_to_fetch,
                fetch_query_filter=fetch_query_filter,
                fetch_fields=fetch_fields,
                fetch_limit=fetch_limit,
                fetch_start=fetch_start,
            )

        elif demisto.command() == "microfocus-smax-get-entity":
            return_results(get_entity_command(client, args))

        elif demisto.command() == "microfocus-smax-query-entities":
            return_results(query_entities_command(client, args))

        elif demisto.command() == "microfocus-smax-create-entities":
            return_results(create_entities_command(client, args))

        elif demisto.command() == "microfocus-smax-update-entities":
            return_results(update_entities_command(client, args))

        elif demisto.command() == "microfocus-smax-create-incident":
            return_results(create_incident_command(client, args))

        elif demisto.command() == "microfocus-smax-update-incident":
            return_results(update_incident_command(client, args))

        elif demisto.command() == "microfocus-smax-create-request":
            return_results(create_request_command(client, args))

        elif demisto.command() == "microfocus-smax-update-request":
            return_results(update_request_command(client, args))

    except Exception as e:
        demisto.error(traceback.format_exc())
        return_error(f"Failed to execute {demisto.command()} command.\nError:\n{e!s}")


""" ENTRY POINT """


if __name__ in ("__main__", "__builtin__", "builtins"):
    main()