%global _empty_manifest_terminate_build 0 Name: python-azure-eventgrid Version: 4.10.0 Release: 1 Summary: Microsoft Azure Event Grid Client Library for Python License: MIT License URL: https://github.com/Azure/azure-sdk-for-python Source0: https://mirrors.nju.edu.cn/pypi/web/packages/7d/c1/ab6b641dd8b5617b6425ee43474b1e15a8a9fca8413627202ec7c25097f3/azure-eventgrid-4.10.0.zip BuildArch: noarch %description # Azure Event Grid client library for Python Azure Event Grid is a fully-managed intelligent event routing service that allows for uniform event consumption using a publish-subscribe model. [Source code][python-eg-src] | [Package (PyPI)][python-eg-pypi] | [Package (Conda)](https://anaconda.org/microsoft/azure-eventgrid/) | [API reference documentation][python-eg-ref-docs] | [Product documentation][python-eg-product-docs] | [Samples][python-eg-samples] | [Changelog][python-eg-changelog] ## _Disclaimer_ _Azure SDK Python packages support for Python 2.7 has ended on 01 January 2022. For more information and questions, please refer to https://github.com/Azure/azure-sdk-for-python/issues/20691_ ## Getting started ### Prerequisites * Python 3.7 or later is required to use this package. * You must have an [Azure subscription][azure_subscription] and an Event Grid Topic resource to use this package. Follow this [step-by-step tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart-portal) to register the Event Grid resource provider and create Event Grid topics using the [Azure portal](https://portal.azure.com/). There is a [similar tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart) using [Azure CLI](https://docs.microsoft.com/cli/azure). ### Install the package Install the Azure Event Grid client library for Python with [pip][pip]: ```bash pip install azure-eventgrid ``` * An existing Event Grid topic or domain is required. You can create the resource using [Azure Portal][azure_portal_create_EG_resource] or [Azure CLI][azure_cli_link] If you use Azure CLI, replace `` and `` with your own unique names. #### Create an Event Grid Topic ``` az eventgrid topic --create --location --resource-group --name ``` #### Create an Event Grid Domain ``` az eventgrid domain --create --location --resource-group --name ``` ### Authenticate the client In order to interact with the Event Grid service, you will need to create an instance of a client. An **endpoint** and **credential** are necessary to instantiate the client object. #### Using Azure Active Directory (AAD) Azure Event Grid provides integration with Azure Active Directory (Azure AD) for identity-based authentication of requests. With Azure AD, you can use role-based access control (RBAC) to grant access to your Azure Event Grid resources to users, groups, or applications. To send events to a topic or domain with a `TokenCredential`, the authenticated identity should have the "EventGrid Data Sender" role assigned. With the `azure-identity` package, you can seamlessly authorize requests in both development and production environments. To learn more about Azure Active Directory, see the [`azure-identity` README](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/identity/azure-identity/README.md). For example, you can use `DefaultAzureCredential` to construct a client which will authenticate using Azure Active Directory: ```python from azure.identity import DefaultAzureCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent credential = DefaultAzureCredential() endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] client = EventGridPublisherClient(endpoint, credential) ``` #### Looking up the endpoint You can find the topic endpoint within the Event Grid Topic resource on the Azure portal. This will look like: `"https://..eventgrid.azure.net/api/events"` #### Create the client with AzureKeyCredential To use an Access key as the `credential` parameter, pass the key as a string into an instance of [AzureKeyCredential][azure-key-credential]. > **Note:** The Access Key may be found in the azure portal in the "Access Keys" menu of the Event Grid Topic resource. They may also be obtained via the azure CLI, or the `azure-mgmt-eventgrid` library. A guide for getting access keys can be found [here](https://docs.microsoft.com/azure/event-grid/get-access-keys). ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.credentials import AzureKeyCredential topic_key = os.environ["EVENTGRID_TOPIC_KEY"] endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] credential = AzureKeyCredential(topic_key) client = EventGridPublisherClient(endpoint, credential) ``` > **Note:** A client may also be authenticated via SAS signature, using the `AzureSasCredential`. A sample demonstrating this, is available [here][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]). > **Note:** The `generate_sas` method can be used to generate a shared access signature. A sample demonstrating this can be seen [here][python-eg-generate-sas]. ## Key concepts ### Topic A **[topic](https://docs.microsoft.com/azure/event-grid/concepts#topics)** is a channel within the EventGrid service to send events. The event schema that a topic accepts is decided at topic creation time. If events of a schema type are sent to a topic that requires a different schema type, errors will be raised. ### Domain An event **[domain](https://docs.microsoft.com/azure/event-grid/event-domains)** is a management tool for large numbers of Event Grid topics related to the same application. They allow you to publish events to thousands of topics. Domains also give you authorization and authentication control over each topic. For more information, visit [Event domain overview](https://docs.microsoft.com/azure/event-grid/event-domains). When you create an event domain, a publishing endpoint for this domain is made available to you. This process is similar to creating an Event Grid Topic. The only difference is that, when publishing to a domain, you must specify the topic within the domain that you'd like the event to be delivered to. ### Event schemas An **[event](https://docs.microsoft.com/azure/event-grid/concepts#events)** is the smallest amount of information that fully describes something that happened in the system. When a custom topic or domain is created, you must specify the schema that will be used when publishing events. Event Grid supports multiple schemas for encoding events. #### Event Grid schema While you may configure your topic to use a [custom schema](https://docs.microsoft.com/azure/event-grid/input-mappings), it is more common to use the already-defined Event Grid schema. See the specifications and requirements [here](https://docs.microsoft.com/azure/event-grid/event-schema). #### CloudEvents v1.0 schema Another option is to use the CloudEvents v1.0 schema. [CloudEvents](https://cloudevents.io/) is a Cloud Native Computing Foundation project which produces a specification for describing event data in a common way. The service summary of CloudEvents can be found [here](https://docs.microsoft.com/azure/event-grid/cloud-event-schema). ### EventGridPublisherClient `EventGridPublisherClient` provides operations to send event data to a topic hostname specified during client initialization. Regardless of the schema that your topic or domain is configured to use, `EventGridPublisherClient` will be used to publish events to it. Use the `send` method publishing events. The following formats of events are allowed to be sent: - A list or a single instance of strongly typed EventGridEvents. - A dict representation of a serialized EventGridEvent object. - A list or a single instance of strongly typed CloudEvents. - A dict representation of a serialized CloudEvent object. - A dict representation of any Custom Schema. Please have a look at the [samples](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples) for detailed examples. **Note:** It is important to know if your topic supports CloudEvents or EventGridEvents before publishing. If you send to a topic that does not support the schema of the event you are sending, send() will throw an exception. ### System Topics A **[system topic](https://docs.microsoft.com/azure/event-grid/system-topics)** in Event Grid represents one or more events published by Azure services such as Azure Storage or Azure Event Hubs. For example, a system topic may represent all blob events or only blob creation and blob deletion events published for a specific storage account. The names of the various event types for the system events published to Azure Event Grid are available in `azure.eventgrid.SystemEventNames`. For complete list of recognizable system topics, visit [System Topics](https://docs.microsoft.com/azure/event-grid/system-topics). For more information about the key concepts on Event Grid, see [Concepts in Azure Event Grid][publisher-service-doc]. ## Event Grid on Kubernetes with Azure Arc Event Grid on Kubernetes with Azure Arc is an offering that allows you to run Event Grid on your own Kubernetes cluster. This capability is enabled by the use of Azure Arc enabled Kubernetes. Through Azure Arc enabled Kubernetes, a supported Kubernetes cluster connects to Azure. Once connected, you are able to install Event Grid on it. Learn more about it [here](https://docs.microsoft.com/azure/event-grid/kubernetes/overview). ### Support for CNCF Cloud Events Starting with v4.7.0, this package also supports publishing a CNCF cloud event from https://pypi.org/project/cloudevents/. You would be able to pass a CloudEvent object from this library to the `send` API. ```python from cloudevents.http import CloudEvent event = CloudEvent(...) client.send(event) ``` ## Examples The following sections provide several code snippets covering some of the most common Event Grid tasks, including: * [Send an Event Grid Event](#send-an-event-grid-event) * [Send a Cloud Event](#send-a-cloud-event) * [Send Multiple Events](#send-multiple-events) * [Send events as Dictionaries](#send-events-as-dictionaries) * [Consume a payload from storage queue](#consume-from-storage-queue) * [Consume from ServiceBus](#consume-from-servicebus) ### Send an Event Grid Event This example publishes an Event Grid event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent key = os.environ["EG_ACCESS_KEY"] endpoint = os.environ["EG_TOPIC_HOSTNAME"] event = EventGridEvent( data={"team": "azure-sdk"}, subject="Door1", event_type="Azure.Sdk.Demo", data_version="2.0" ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send a Cloud Event This example publishes a Cloud event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send Multiple events It is possible to send events as a batch when sending multiple events to a topic or a domain. This example sends a list of CloudEvents using the send method. **WARNING:** When sending a list of multiple events at one time, iterating over and sending each event will not result in optimal performance. For best performance, it is highly recommended to send a list of events. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event0 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) event1 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team2": "azure-eventgrid"} ) events = [event0, event1] credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(events) ``` ### Send events as dictionaries A dict representation of respective serialized models can also be used to publish CloudEvent(s) or EventGridEvent(s) apart from the strongly typed objects. Use a dict-like representation to send to a topic with custom schema as shown below. ```python import os import uuid import datetime as dt from msrest.serialization import UTC from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient key = os.environ["CUSTOM_SCHEMA_ACCESS_KEY"] endpoint = os.environ["CUSTOM_SCHEMA_TOPIC_HOSTNAME"] event = custom_schema_event = { "customSubject": "sample", "customEventType": "sample.event", "customDataVersion": "2.0", "customId": uuid.uuid4(), "customEventTime": dt.datetime.now(UTC()).isoformat(), "customData": "sample data" } credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Consume from storage queue This example consumes a message received from storage queue and deserializes it to a CloudEvent object. ```python from azure.core.messaging import CloudEvent from azure.storage.queue import QueueServiceClient, BinaryBase64DecodePolicy import os import json # all types of CloudEvents below produce same DeserializedEvent connection_str = os.environ['STORAGE_QUEUE_CONN_STR'] queue_name = os.environ['STORAGE_QUEUE_NAME'] with QueueServiceClient.from_connection_string(connection_str) as qsc: payload = qsc.get_queue_client( queue=queue_name, message_decode_policy=BinaryBase64DecodePolicy() ).peek_messages() ## deserialize payload into a list of typed Events events = [CloudEvent.from_dict(json.loads(msg.content)) for msg in payload] ``` ### Consume from servicebus This example consumes a payload message received from ServiceBus and deserializes it to an EventGridEvent object. ```python from azure.eventgrid import EventGridEvent from azure.servicebus import ServiceBusClient import os import json # all types of EventGridEvents below produce same DeserializedEvent connection_str = os.environ['SERVICE_BUS_CONN_STR'] queue_name = os.environ['SERVICE_BUS_QUEUE_NAME'] with ServiceBusClient.from_connection_string(connection_str) as sb_client: payload = sb_client.get_queue_receiver(queue_name).receive_messages() ## deserialize payload into a list of typed Events events = [EventGridEvent.from_dict(json.loads(next(msg.body).decode('utf-8'))) for msg in payload] ``` ## Distributed Tracing with EventGrid You can use OpenTelemetry for Python as usual with EventGrid since it's compatible with azure-core tracing integration. Here is an example of using OpenTelemetry to trace sending a CloudEvent. First, set OpenTelemetry as enabled tracing plugin for EventGrid. ```python from azure.core.settings import settings from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan settings.tracing_implementation = OpenTelemetrySpan ``` Regular open telemetry usage from here. See [OpenTelemetry](https://github.com/open-telemetry/opentelemetry-python) for details. This example uses a simple console exporter to export the traces. Any exporter can be used here including `azure-monitor-opentelemetry-exporter`, `jaeger`, `zipkin` etc. ```python from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor # this requires opentelemetry >= 1.0.0 # Simple console exporter exporter = ConsoleSpanExporter() trace.set_tracer_provider(TracerProvider()) tracer = trace.get_tracer(__name__) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(exporter) ) ``` Once the `tracer` and `exporter` are set, please follow the example below to start collecting traces while using the `send` method from the `EventGridPublisherClient` to send a CloudEvent object. ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.messaging import CloudEvent from azure.core.credentials import AzureKeyCredential hostname = os.environ['CLOUD_TOPIC_HOSTNAME'] key = AzureKeyCredential(os.environ['CLOUD_ACCESS_KEY']) cloud_event = CloudEvent( source = 'demo', type = 'sdk.demo', data = {'test': 'hello'}, ) with tracer.start_as_current_span(name="MyApplication"): client = EventGridPublisherClient(hostname, key) client.send(cloud_event) ``` ## Troubleshooting - Enable `azure.eventgrid` logger to collect traces from the library. ### General Event Grid client library will raise exceptions defined in [Azure Core][azure_core_exceptions]. ### Logging This library uses the standard [logging][python_logging] library for logging. Basic information about HTTP sessions (URLs, headers, etc.) is logged at INFO level. ### Optional Configuration Optional keyword arguments can be passed in at the client and per-operation level. The azure-core [reference documentation][azure_core_ref_docs] describes available configurations for retries, logging, transport protocols, and more. ## Next steps The following section provides several code snippets illustrating common patterns used in the Event Grid Python API. ### More sample code These code samples show common champion scenario operations with the Azure Event Grid client library. * Generate Shared Access Signature: [sample_generate_sas.py][python-eg-generate-sas] * Authenticate the client: [sample_authentication.py][python-eg-auth] ([async_version][python-eg-auth-async]) * Publish events to a topic using SAS: [sample_publish_events_to_a_topic_using_sas_credential_async.py][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]) * Publish Event Grid Events to a topic: [sample_publish_eg_events_to_a_topic.py][python-eg-sample-eg-event] ([async_version][python-eg-sample-eg-event-async]) * Publish EventGrid Events to a domain topic: [sample_publish_eg_events_to_a_domain_topic.py][python-eg-sample-eg-event-to-domain] ([async_version][python-eg-sample-eg-event-to-domain-async]) * Publish a Cloud Event: [sample_publish_events_using_cloud_events_1.0_schema.py][python-eg-sample-send-cloudevent] ([async_version][python-eg-sample-send-cloudevent-async]) * Publish a Custom Schema: [sample_publish_custom_schema_to_a_topic.py][python-eg-publish-custom-schema] ([async_version][python-eg-publish-custom-schema-async]) The following samples cover publishing and consuming `dict` representations of EventGridEvents and CloudEvents. * Publish EventGridEvent as dict like representation: [sample_publish_eg_event_using_dict.py][python-eg-sample-send-eg-as-dict] ([async_version][python-eg-sample-send-eg-as-dict-async]) * Publish CloudEvent as dict like representation: [sample_publish_cloud_event_using_dict.py][python-eg-sample-send-cloudevent-as-dict] ([async_version][python-eg-sample-send-cloudevent-as-dict-async]) * Consume a Custom Payload of raw cloudevent data: [sample_consume_custom_payload.py][python-eg-sample-consume-custom-payload] More samples can be found [here][python-eg-samples]. * More samples related to the send scenario can be seen [here][python-eg-publish-samples]. * To see more samples related to consuming a payload from different messaging services as a typed object, please visit [Consume Samples][python-eg-consume-samples] ### Additional documentation For more extensive documentation on Azure Event Grid, see the [Event Grid documentation][python-eg-product-docs] on docs.microsoft.com. ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [cla.microsoft.com][cla]. When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct][code_of_conduct]. For more information see the [Code of Conduct FAQ][coc_faq] or contact [opencode@microsoft.com][coc_contact] with any additional questions or comments. [azure_cli_link]: https://pypi.org/project/azure-cli/ [python-eg-src]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/ [python-eg-pypi]: https://pypi.org/project/azure-eventgrid [python-eg-product-docs]: https://docs.microsoft.com/azure/event-grid/overview [python-eg-ref-docs]: https://azuresdkdocs.blob.core.windows.net/$web/python/azure-eventgrid/latest/index.html [publisher-service-doc]: https://docs.microsoft.com/azure/event-grid/concepts [python-eg-samples]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples [python-eg-changelog]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/CHANGELOG.md [pip]: https://pypi.org/project/pip/ [azure_portal_create_EG_resource]: https://ms.portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.EventGrid%2Ftopics [azure-key-credential]: https://aka.ms/azsdk/python/core/azurekeycredential [azure_core_exceptions]: https://aka.ms/azsdk/python/core/docs#module-azure.core.exceptions [python_logging]: https://docs.python.org/3/library/logging.html [azure_core_ref_docs]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core#configurations [azure_subscription]: https://azure.microsoft.com/free/ [python-eg-auth]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_authentication.py [python-eg-generate-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_generate_sas.py [python-eg-sample-send-using-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_to_a_topic_using_sas_credential.py [python-eg-sample-eg-event]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_topic.py [python-eg-sample-eg-event-to-domain]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_domain.py [python-eg-sample-send-cloudevent]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_using_cloud_events_1.0_schema.py [python-eg-publish-custom-schema]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_custom_schema_to_a_topic.py [python-eg-sample-send-eg-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_event_using_dict.py [python-eg-sample-send-cloudevent-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_cloud_event_using_dict.py [python-eg-auth-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_authentication_async.py [python-eg-sample-send-using-sas-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_to_a_topic_using_sas_credential_async.py [python-eg-sample-eg-event-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_topic_async.py [python-eg-sample-eg-event-to-domain-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_domain_async.py [python-eg-sample-send-cloudevent-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_using_cloud_events_1.0_schema_async.py [python-eg-publish-custom-schema-async]:https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_custom_schema_to_a_topic_async.py [python-eg-sample-send-eg-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_event_using_dict_async.py [python-eg-sample-send-cloudevent-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_cloud_event_using_dict_async.py [python-eg-publish-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/publish_samples [python-eg-consume-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/consume_samples [python-eg-sample-consume-custom-payload]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_consume_custom_payload.py [cla]: https://cla.microsoft.com [code_of_conduct]: https://opensource.microsoft.com/codeofconduct/ [coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ [coc_contact]: mailto:opencode@microsoft.com # Release History ## 4.10.0 (2023-04-11) ### Features Added - Added new enum values to `SystemEventNames` related to Azure Communication Services, DataBox and ApiManagementGateway APIs. ### Bugs Fixed - `SystemEventNames` enums for APIManagement were incorrectly capitalized, changed `Api` to `API`. ### Other Changes - Removed `msrest` dependency and `six` dependency - Added `isodate` dependency ## 4.9.1 (2022-11-08) - This version and all future versions will require Python 3.7+. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.9.0 (2022-07-05) ### Features Added - Added support for publishing events to a channel. ## 4.9.0b1 (2022-04-07) ### Features Added - Added support for publishing events to a channel. ## 4.8.0 (2022-04-06) - This version and all future versions will require Python 3.6+. Python 2.7 is no longer supported. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.7.1 (2021-11-18) ### Bugs Fixed - The `send` API will raise on exceptions. ## 4.7.0 (2021-11-09) ### Features Added - Added support for publishing native CNCF cloudevents (https://pypi.org/project/cloudevents/). ## 4.6.0 (2021-10-05) ### Features Added - Added new enum values to `SystemEvents`. ## 4.5.0 (2021-08-10) ### Features Added - Added a new enum value `Microsoft.ContainerService.NewKubernetesVersionAvailable` to `SystemEvents`. - Added a `from_json` method which now accepts storage QueueMessage, eventhub's EventData or ServiceBusMessage or simply json bytes to return an `EventGridEvent` ## 4.4.0 (2021-07-19) - Bumped `msrest` dependency to `0.6.21` to align with mgmt package. ### Features Added - `EventGridPublisherClient` now supports Azure Active Directory (AAD) for authentication. ## 4.3.0 (2021-06-09) **New Features** - Added new event names related to blob inventory to the `SystemEventNames` enum. **Bug Fixes** - Replaced the `ServiceBusDeadletterMessagesAvailableWithNoListenerEventName` with the right value. ## 4.2.0 (2021-05-12) **New Features** - Added new event names to the `SystemEventNames` enum. ## 4.1.1 (2021-04-07) **Bug Fixes** - Improved the `repr` on `EventGridEvent` to show more meaningful text. ## 4.1.0 (2021-03-23) **New Features** - Added new SystemEventNames `AcsChatThreadParticipantRemovedEventName`, `AcsChatThreadParticipantAddedEventName` and `AcsRecordingFileStatusUpdatedEventName`. ## 4.0.0 (2021-03-09) **Note:** This is the first stable release of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. Users migrating from `v1.x` are advised to view the [migration guide](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/migration_guide.md). **New Features** - `azure-eventgrid` package now supports `azure.core.messaging.CloudEvent` which honors the CNCF CloudEvent spec. - `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping for system events. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and Custom schema events. **Breaking Changes** - `azure.eventgrid.models` namespace along with all the models in it are now removed.: - JSON documentation on the events is available here: https://docs.microsoft.com/azure/event-grid/system-topics - `azure.eventgrid.SystemEventNames` provides the list of available events name for easy switching. - `azure.eventgrid.event_grid_client.EventGridClient` is now removed in favor of `azure.eventgrid.EventGridPublisherClient`. - `azure.eventgrid.event_grid_client.EventGridClientConfiguration` is now removed. ## 2.0.0 (2021-03-09) **Disclaimer:** v2.0.0 is functionally equivalent to v4.0.0. Users are advised to use v4.0.0 instead of this. **Breaking Changes** - `~azure.eventgrid.CloudEvent` is now removed in favor of `~azure.core.messaging.CloudEvent`. - All the `SystemEventNames` related to Azure Communication Service starting with `ACS****` are renamed to `Acs***` to honor pascal case. **Features** - Added support for two new `SystemEvents` - `ServiceBusDeadletterMessagesAvailablePeriodicNotificationsEventData` and `ServiceBusActiveMessagesAvailablePeriodicNotificationsEventData` ## 2.0.0b5 (2021-02-10) **Breaking Changes** - `EventGridSharedAccessSignatureCredential` is deprecated in favor of `AzureSasCredential`. - `azure.eventgrid.models` namespace along with all the models in it are now removed. `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping. - `topic_hostname` is renamed to `endpoint` in the `EventGridPublisherClient`. - `azure.eventgrid.generate_shared_access_signature` method is now renamed to `generate_sas`. - `EventGridConsumer`is now removed. Please see the samples to see how events can be deserialized. - `CustomEvent` model is removed. Dictionaries must be used to send a custom schema. **Bug Fixes** - `EventGridEvent` has two additional required positional parameters namely, `data` and `data_version`. - `EventGridPublisherClient` now appropriately throws a `ValueError` if an invalid credential is passed during initialization. ## 2.0.0b4 (2020-11-11) **Bug Fixes** - `TypeError` is raised when bytes are passed to an `EventGridEvent`. ## 2.0.0b3 (2020-10-05) **Feature** - Added support for Keyvault Event Types - Added distributed tracing support for CloudEvents ## 2.0.0b2 (2020-09-24) **Features** - Added support for Azure Communication Services event types. ## 2.0.0b1 (2020-09-08) **Features** - Version (2.0.0b1) is the first preview of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. For more information about this, and preview releases of other Azure SDK libraries, please visit https://azure.github.io/azure-sdk/releases/latest/python.html. - Added Support for `CloudEvents`. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and CustomEvents. - Implements the `EventGridConsumer` for the consume flow of the events. ## 1.3.0 (2019-05-20) - Event Schemas for new event types from IotHub, Media Services, Container Registry, Maps, and AppConfiguration services. ## 1.2.0 (2018-08-28) - Event Schemas for new events (IotHub DeviceConnected and DeviceDisconnected events, Resource events related to actions), and breaking changes to the schema for IotHub DeviceCreated event and IotHub DeviceDeleted event. ## 1.1.0 (2018-05-24) - Event Schemas for EventGrid subscription validation event, Azure Media events, and ServiceBus events. ## 1.0.0 (2018-04-26) **General Breaking changes** This version uses a next-generation code generator that *might* introduce breaking changes. - Model signatures now use only keyword-argument syntax. All positional arguments must be re-written as keyword-arguments. To keep auto-completion in most cases, models are now generated for Python 2 and Python 3. Python 3 uses the "*" syntax for keyword-only arguments. - Enum types now use the "str" mixin (class AzureEnum(str, Enum)) to improve the behavior when unrecognized enum values are encountered. While this is not a breaking change, the distinctions are important, and are documented here: At a glance: - "is" should not be used at all. - "format" will return the string value, where "%s" string formatting will return `NameOfEnum.stringvalue`. Format syntax should be preferred. - New Long Running Operation: - Return type changes from `msrestazure.azure_operation.AzureOperationPoller` to `msrest.polling.LROPoller`. External API is the same. - Return type is now **always** a `msrest.polling.LROPoller`, regardless of the optional parameters used. - The behavior has changed when using `raw=True`. Instead of returning the initial call result as `ClientRawResponse`, without polling, now this returns an LROPoller. After polling, the final resource will be returned as a `ClientRawResponse`. - New `polling` parameter. The default behavior is `Polling=True` which will poll using ARM algorithm. When `Polling=False`, the response of the initial call will be returned without polling. - `polling` parameter accepts instances of subclasses of `msrest.polling.PollingMethod`. - `add_done_callback` will no longer raise if called after polling is finished, but will instead execute the callback right away. **Features** - Client class can be used as a context manager to keep the underlying HTTP session open for performance - Support for consuming Azure Container Registry events and Azure IoT Hub events published to Event Grid. ## 0.1.0 (2018-01-30) - Initial Release %package -n python3-azure-eventgrid Summary: Microsoft Azure Event Grid Client Library for Python Provides: python-azure-eventgrid BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-azure-eventgrid # Azure Event Grid client library for Python Azure Event Grid is a fully-managed intelligent event routing service that allows for uniform event consumption using a publish-subscribe model. [Source code][python-eg-src] | [Package (PyPI)][python-eg-pypi] | [Package (Conda)](https://anaconda.org/microsoft/azure-eventgrid/) | [API reference documentation][python-eg-ref-docs] | [Product documentation][python-eg-product-docs] | [Samples][python-eg-samples] | [Changelog][python-eg-changelog] ## _Disclaimer_ _Azure SDK Python packages support for Python 2.7 has ended on 01 January 2022. For more information and questions, please refer to https://github.com/Azure/azure-sdk-for-python/issues/20691_ ## Getting started ### Prerequisites * Python 3.7 or later is required to use this package. * You must have an [Azure subscription][azure_subscription] and an Event Grid Topic resource to use this package. Follow this [step-by-step tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart-portal) to register the Event Grid resource provider and create Event Grid topics using the [Azure portal](https://portal.azure.com/). There is a [similar tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart) using [Azure CLI](https://docs.microsoft.com/cli/azure). ### Install the package Install the Azure Event Grid client library for Python with [pip][pip]: ```bash pip install azure-eventgrid ``` * An existing Event Grid topic or domain is required. You can create the resource using [Azure Portal][azure_portal_create_EG_resource] or [Azure CLI][azure_cli_link] If you use Azure CLI, replace `` and `` with your own unique names. #### Create an Event Grid Topic ``` az eventgrid topic --create --location --resource-group --name ``` #### Create an Event Grid Domain ``` az eventgrid domain --create --location --resource-group --name ``` ### Authenticate the client In order to interact with the Event Grid service, you will need to create an instance of a client. An **endpoint** and **credential** are necessary to instantiate the client object. #### Using Azure Active Directory (AAD) Azure Event Grid provides integration with Azure Active Directory (Azure AD) for identity-based authentication of requests. With Azure AD, you can use role-based access control (RBAC) to grant access to your Azure Event Grid resources to users, groups, or applications. To send events to a topic or domain with a `TokenCredential`, the authenticated identity should have the "EventGrid Data Sender" role assigned. With the `azure-identity` package, you can seamlessly authorize requests in both development and production environments. To learn more about Azure Active Directory, see the [`azure-identity` README](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/identity/azure-identity/README.md). For example, you can use `DefaultAzureCredential` to construct a client which will authenticate using Azure Active Directory: ```python from azure.identity import DefaultAzureCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent credential = DefaultAzureCredential() endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] client = EventGridPublisherClient(endpoint, credential) ``` #### Looking up the endpoint You can find the topic endpoint within the Event Grid Topic resource on the Azure portal. This will look like: `"https://..eventgrid.azure.net/api/events"` #### Create the client with AzureKeyCredential To use an Access key as the `credential` parameter, pass the key as a string into an instance of [AzureKeyCredential][azure-key-credential]. > **Note:** The Access Key may be found in the azure portal in the "Access Keys" menu of the Event Grid Topic resource. They may also be obtained via the azure CLI, or the `azure-mgmt-eventgrid` library. A guide for getting access keys can be found [here](https://docs.microsoft.com/azure/event-grid/get-access-keys). ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.credentials import AzureKeyCredential topic_key = os.environ["EVENTGRID_TOPIC_KEY"] endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] credential = AzureKeyCredential(topic_key) client = EventGridPublisherClient(endpoint, credential) ``` > **Note:** A client may also be authenticated via SAS signature, using the `AzureSasCredential`. A sample demonstrating this, is available [here][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]). > **Note:** The `generate_sas` method can be used to generate a shared access signature. A sample demonstrating this can be seen [here][python-eg-generate-sas]. ## Key concepts ### Topic A **[topic](https://docs.microsoft.com/azure/event-grid/concepts#topics)** is a channel within the EventGrid service to send events. The event schema that a topic accepts is decided at topic creation time. If events of a schema type are sent to a topic that requires a different schema type, errors will be raised. ### Domain An event **[domain](https://docs.microsoft.com/azure/event-grid/event-domains)** is a management tool for large numbers of Event Grid topics related to the same application. They allow you to publish events to thousands of topics. Domains also give you authorization and authentication control over each topic. For more information, visit [Event domain overview](https://docs.microsoft.com/azure/event-grid/event-domains). When you create an event domain, a publishing endpoint for this domain is made available to you. This process is similar to creating an Event Grid Topic. The only difference is that, when publishing to a domain, you must specify the topic within the domain that you'd like the event to be delivered to. ### Event schemas An **[event](https://docs.microsoft.com/azure/event-grid/concepts#events)** is the smallest amount of information that fully describes something that happened in the system. When a custom topic or domain is created, you must specify the schema that will be used when publishing events. Event Grid supports multiple schemas for encoding events. #### Event Grid schema While you may configure your topic to use a [custom schema](https://docs.microsoft.com/azure/event-grid/input-mappings), it is more common to use the already-defined Event Grid schema. See the specifications and requirements [here](https://docs.microsoft.com/azure/event-grid/event-schema). #### CloudEvents v1.0 schema Another option is to use the CloudEvents v1.0 schema. [CloudEvents](https://cloudevents.io/) is a Cloud Native Computing Foundation project which produces a specification for describing event data in a common way. The service summary of CloudEvents can be found [here](https://docs.microsoft.com/azure/event-grid/cloud-event-schema). ### EventGridPublisherClient `EventGridPublisherClient` provides operations to send event data to a topic hostname specified during client initialization. Regardless of the schema that your topic or domain is configured to use, `EventGridPublisherClient` will be used to publish events to it. Use the `send` method publishing events. The following formats of events are allowed to be sent: - A list or a single instance of strongly typed EventGridEvents. - A dict representation of a serialized EventGridEvent object. - A list or a single instance of strongly typed CloudEvents. - A dict representation of a serialized CloudEvent object. - A dict representation of any Custom Schema. Please have a look at the [samples](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples) for detailed examples. **Note:** It is important to know if your topic supports CloudEvents or EventGridEvents before publishing. If you send to a topic that does not support the schema of the event you are sending, send() will throw an exception. ### System Topics A **[system topic](https://docs.microsoft.com/azure/event-grid/system-topics)** in Event Grid represents one or more events published by Azure services such as Azure Storage or Azure Event Hubs. For example, a system topic may represent all blob events or only blob creation and blob deletion events published for a specific storage account. The names of the various event types for the system events published to Azure Event Grid are available in `azure.eventgrid.SystemEventNames`. For complete list of recognizable system topics, visit [System Topics](https://docs.microsoft.com/azure/event-grid/system-topics). For more information about the key concepts on Event Grid, see [Concepts in Azure Event Grid][publisher-service-doc]. ## Event Grid on Kubernetes with Azure Arc Event Grid on Kubernetes with Azure Arc is an offering that allows you to run Event Grid on your own Kubernetes cluster. This capability is enabled by the use of Azure Arc enabled Kubernetes. Through Azure Arc enabled Kubernetes, a supported Kubernetes cluster connects to Azure. Once connected, you are able to install Event Grid on it. Learn more about it [here](https://docs.microsoft.com/azure/event-grid/kubernetes/overview). ### Support for CNCF Cloud Events Starting with v4.7.0, this package also supports publishing a CNCF cloud event from https://pypi.org/project/cloudevents/. You would be able to pass a CloudEvent object from this library to the `send` API. ```python from cloudevents.http import CloudEvent event = CloudEvent(...) client.send(event) ``` ## Examples The following sections provide several code snippets covering some of the most common Event Grid tasks, including: * [Send an Event Grid Event](#send-an-event-grid-event) * [Send a Cloud Event](#send-a-cloud-event) * [Send Multiple Events](#send-multiple-events) * [Send events as Dictionaries](#send-events-as-dictionaries) * [Consume a payload from storage queue](#consume-from-storage-queue) * [Consume from ServiceBus](#consume-from-servicebus) ### Send an Event Grid Event This example publishes an Event Grid event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent key = os.environ["EG_ACCESS_KEY"] endpoint = os.environ["EG_TOPIC_HOSTNAME"] event = EventGridEvent( data={"team": "azure-sdk"}, subject="Door1", event_type="Azure.Sdk.Demo", data_version="2.0" ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send a Cloud Event This example publishes a Cloud event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send Multiple events It is possible to send events as a batch when sending multiple events to a topic or a domain. This example sends a list of CloudEvents using the send method. **WARNING:** When sending a list of multiple events at one time, iterating over and sending each event will not result in optimal performance. For best performance, it is highly recommended to send a list of events. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event0 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) event1 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team2": "azure-eventgrid"} ) events = [event0, event1] credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(events) ``` ### Send events as dictionaries A dict representation of respective serialized models can also be used to publish CloudEvent(s) or EventGridEvent(s) apart from the strongly typed objects. Use a dict-like representation to send to a topic with custom schema as shown below. ```python import os import uuid import datetime as dt from msrest.serialization import UTC from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient key = os.environ["CUSTOM_SCHEMA_ACCESS_KEY"] endpoint = os.environ["CUSTOM_SCHEMA_TOPIC_HOSTNAME"] event = custom_schema_event = { "customSubject": "sample", "customEventType": "sample.event", "customDataVersion": "2.0", "customId": uuid.uuid4(), "customEventTime": dt.datetime.now(UTC()).isoformat(), "customData": "sample data" } credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Consume from storage queue This example consumes a message received from storage queue and deserializes it to a CloudEvent object. ```python from azure.core.messaging import CloudEvent from azure.storage.queue import QueueServiceClient, BinaryBase64DecodePolicy import os import json # all types of CloudEvents below produce same DeserializedEvent connection_str = os.environ['STORAGE_QUEUE_CONN_STR'] queue_name = os.environ['STORAGE_QUEUE_NAME'] with QueueServiceClient.from_connection_string(connection_str) as qsc: payload = qsc.get_queue_client( queue=queue_name, message_decode_policy=BinaryBase64DecodePolicy() ).peek_messages() ## deserialize payload into a list of typed Events events = [CloudEvent.from_dict(json.loads(msg.content)) for msg in payload] ``` ### Consume from servicebus This example consumes a payload message received from ServiceBus and deserializes it to an EventGridEvent object. ```python from azure.eventgrid import EventGridEvent from azure.servicebus import ServiceBusClient import os import json # all types of EventGridEvents below produce same DeserializedEvent connection_str = os.environ['SERVICE_BUS_CONN_STR'] queue_name = os.environ['SERVICE_BUS_QUEUE_NAME'] with ServiceBusClient.from_connection_string(connection_str) as sb_client: payload = sb_client.get_queue_receiver(queue_name).receive_messages() ## deserialize payload into a list of typed Events events = [EventGridEvent.from_dict(json.loads(next(msg.body).decode('utf-8'))) for msg in payload] ``` ## Distributed Tracing with EventGrid You can use OpenTelemetry for Python as usual with EventGrid since it's compatible with azure-core tracing integration. Here is an example of using OpenTelemetry to trace sending a CloudEvent. First, set OpenTelemetry as enabled tracing plugin for EventGrid. ```python from azure.core.settings import settings from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan settings.tracing_implementation = OpenTelemetrySpan ``` Regular open telemetry usage from here. See [OpenTelemetry](https://github.com/open-telemetry/opentelemetry-python) for details. This example uses a simple console exporter to export the traces. Any exporter can be used here including `azure-monitor-opentelemetry-exporter`, `jaeger`, `zipkin` etc. ```python from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor # this requires opentelemetry >= 1.0.0 # Simple console exporter exporter = ConsoleSpanExporter() trace.set_tracer_provider(TracerProvider()) tracer = trace.get_tracer(__name__) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(exporter) ) ``` Once the `tracer` and `exporter` are set, please follow the example below to start collecting traces while using the `send` method from the `EventGridPublisherClient` to send a CloudEvent object. ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.messaging import CloudEvent from azure.core.credentials import AzureKeyCredential hostname = os.environ['CLOUD_TOPIC_HOSTNAME'] key = AzureKeyCredential(os.environ['CLOUD_ACCESS_KEY']) cloud_event = CloudEvent( source = 'demo', type = 'sdk.demo', data = {'test': 'hello'}, ) with tracer.start_as_current_span(name="MyApplication"): client = EventGridPublisherClient(hostname, key) client.send(cloud_event) ``` ## Troubleshooting - Enable `azure.eventgrid` logger to collect traces from the library. ### General Event Grid client library will raise exceptions defined in [Azure Core][azure_core_exceptions]. ### Logging This library uses the standard [logging][python_logging] library for logging. Basic information about HTTP sessions (URLs, headers, etc.) is logged at INFO level. ### Optional Configuration Optional keyword arguments can be passed in at the client and per-operation level. The azure-core [reference documentation][azure_core_ref_docs] describes available configurations for retries, logging, transport protocols, and more. ## Next steps The following section provides several code snippets illustrating common patterns used in the Event Grid Python API. ### More sample code These code samples show common champion scenario operations with the Azure Event Grid client library. * Generate Shared Access Signature: [sample_generate_sas.py][python-eg-generate-sas] * Authenticate the client: [sample_authentication.py][python-eg-auth] ([async_version][python-eg-auth-async]) * Publish events to a topic using SAS: [sample_publish_events_to_a_topic_using_sas_credential_async.py][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]) * Publish Event Grid Events to a topic: [sample_publish_eg_events_to_a_topic.py][python-eg-sample-eg-event] ([async_version][python-eg-sample-eg-event-async]) * Publish EventGrid Events to a domain topic: [sample_publish_eg_events_to_a_domain_topic.py][python-eg-sample-eg-event-to-domain] ([async_version][python-eg-sample-eg-event-to-domain-async]) * Publish a Cloud Event: [sample_publish_events_using_cloud_events_1.0_schema.py][python-eg-sample-send-cloudevent] ([async_version][python-eg-sample-send-cloudevent-async]) * Publish a Custom Schema: [sample_publish_custom_schema_to_a_topic.py][python-eg-publish-custom-schema] ([async_version][python-eg-publish-custom-schema-async]) The following samples cover publishing and consuming `dict` representations of EventGridEvents and CloudEvents. * Publish EventGridEvent as dict like representation: [sample_publish_eg_event_using_dict.py][python-eg-sample-send-eg-as-dict] ([async_version][python-eg-sample-send-eg-as-dict-async]) * Publish CloudEvent as dict like representation: [sample_publish_cloud_event_using_dict.py][python-eg-sample-send-cloudevent-as-dict] ([async_version][python-eg-sample-send-cloudevent-as-dict-async]) * Consume a Custom Payload of raw cloudevent data: [sample_consume_custom_payload.py][python-eg-sample-consume-custom-payload] More samples can be found [here][python-eg-samples]. * More samples related to the send scenario can be seen [here][python-eg-publish-samples]. * To see more samples related to consuming a payload from different messaging services as a typed object, please visit [Consume Samples][python-eg-consume-samples] ### Additional documentation For more extensive documentation on Azure Event Grid, see the [Event Grid documentation][python-eg-product-docs] on docs.microsoft.com. ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [cla.microsoft.com][cla]. When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct][code_of_conduct]. For more information see the [Code of Conduct FAQ][coc_faq] or contact [opencode@microsoft.com][coc_contact] with any additional questions or comments. [azure_cli_link]: https://pypi.org/project/azure-cli/ [python-eg-src]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/ [python-eg-pypi]: https://pypi.org/project/azure-eventgrid [python-eg-product-docs]: https://docs.microsoft.com/azure/event-grid/overview [python-eg-ref-docs]: https://azuresdkdocs.blob.core.windows.net/$web/python/azure-eventgrid/latest/index.html [publisher-service-doc]: https://docs.microsoft.com/azure/event-grid/concepts [python-eg-samples]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples [python-eg-changelog]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/CHANGELOG.md [pip]: https://pypi.org/project/pip/ [azure_portal_create_EG_resource]: https://ms.portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.EventGrid%2Ftopics [azure-key-credential]: https://aka.ms/azsdk/python/core/azurekeycredential [azure_core_exceptions]: https://aka.ms/azsdk/python/core/docs#module-azure.core.exceptions [python_logging]: https://docs.python.org/3/library/logging.html [azure_core_ref_docs]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core#configurations [azure_subscription]: https://azure.microsoft.com/free/ [python-eg-auth]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_authentication.py [python-eg-generate-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_generate_sas.py [python-eg-sample-send-using-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_to_a_topic_using_sas_credential.py [python-eg-sample-eg-event]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_topic.py [python-eg-sample-eg-event-to-domain]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_domain.py [python-eg-sample-send-cloudevent]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_using_cloud_events_1.0_schema.py [python-eg-publish-custom-schema]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_custom_schema_to_a_topic.py [python-eg-sample-send-eg-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_event_using_dict.py [python-eg-sample-send-cloudevent-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_cloud_event_using_dict.py [python-eg-auth-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_authentication_async.py [python-eg-sample-send-using-sas-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_to_a_topic_using_sas_credential_async.py [python-eg-sample-eg-event-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_topic_async.py [python-eg-sample-eg-event-to-domain-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_domain_async.py [python-eg-sample-send-cloudevent-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_using_cloud_events_1.0_schema_async.py [python-eg-publish-custom-schema-async]:https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_custom_schema_to_a_topic_async.py [python-eg-sample-send-eg-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_event_using_dict_async.py [python-eg-sample-send-cloudevent-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_cloud_event_using_dict_async.py [python-eg-publish-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/publish_samples [python-eg-consume-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/consume_samples [python-eg-sample-consume-custom-payload]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_consume_custom_payload.py [cla]: https://cla.microsoft.com [code_of_conduct]: https://opensource.microsoft.com/codeofconduct/ [coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ [coc_contact]: mailto:opencode@microsoft.com # Release History ## 4.10.0 (2023-04-11) ### Features Added - Added new enum values to `SystemEventNames` related to Azure Communication Services, DataBox and ApiManagementGateway APIs. ### Bugs Fixed - `SystemEventNames` enums for APIManagement were incorrectly capitalized, changed `Api` to `API`. ### Other Changes - Removed `msrest` dependency and `six` dependency - Added `isodate` dependency ## 4.9.1 (2022-11-08) - This version and all future versions will require Python 3.7+. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.9.0 (2022-07-05) ### Features Added - Added support for publishing events to a channel. ## 4.9.0b1 (2022-04-07) ### Features Added - Added support for publishing events to a channel. ## 4.8.0 (2022-04-06) - This version and all future versions will require Python 3.6+. Python 2.7 is no longer supported. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.7.1 (2021-11-18) ### Bugs Fixed - The `send` API will raise on exceptions. ## 4.7.0 (2021-11-09) ### Features Added - Added support for publishing native CNCF cloudevents (https://pypi.org/project/cloudevents/). ## 4.6.0 (2021-10-05) ### Features Added - Added new enum values to `SystemEvents`. ## 4.5.0 (2021-08-10) ### Features Added - Added a new enum value `Microsoft.ContainerService.NewKubernetesVersionAvailable` to `SystemEvents`. - Added a `from_json` method which now accepts storage QueueMessage, eventhub's EventData or ServiceBusMessage or simply json bytes to return an `EventGridEvent` ## 4.4.0 (2021-07-19) - Bumped `msrest` dependency to `0.6.21` to align with mgmt package. ### Features Added - `EventGridPublisherClient` now supports Azure Active Directory (AAD) for authentication. ## 4.3.0 (2021-06-09) **New Features** - Added new event names related to blob inventory to the `SystemEventNames` enum. **Bug Fixes** - Replaced the `ServiceBusDeadletterMessagesAvailableWithNoListenerEventName` with the right value. ## 4.2.0 (2021-05-12) **New Features** - Added new event names to the `SystemEventNames` enum. ## 4.1.1 (2021-04-07) **Bug Fixes** - Improved the `repr` on `EventGridEvent` to show more meaningful text. ## 4.1.0 (2021-03-23) **New Features** - Added new SystemEventNames `AcsChatThreadParticipantRemovedEventName`, `AcsChatThreadParticipantAddedEventName` and `AcsRecordingFileStatusUpdatedEventName`. ## 4.0.0 (2021-03-09) **Note:** This is the first stable release of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. Users migrating from `v1.x` are advised to view the [migration guide](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/migration_guide.md). **New Features** - `azure-eventgrid` package now supports `azure.core.messaging.CloudEvent` which honors the CNCF CloudEvent spec. - `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping for system events. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and Custom schema events. **Breaking Changes** - `azure.eventgrid.models` namespace along with all the models in it are now removed.: - JSON documentation on the events is available here: https://docs.microsoft.com/azure/event-grid/system-topics - `azure.eventgrid.SystemEventNames` provides the list of available events name for easy switching. - `azure.eventgrid.event_grid_client.EventGridClient` is now removed in favor of `azure.eventgrid.EventGridPublisherClient`. - `azure.eventgrid.event_grid_client.EventGridClientConfiguration` is now removed. ## 2.0.0 (2021-03-09) **Disclaimer:** v2.0.0 is functionally equivalent to v4.0.0. Users are advised to use v4.0.0 instead of this. **Breaking Changes** - `~azure.eventgrid.CloudEvent` is now removed in favor of `~azure.core.messaging.CloudEvent`. - All the `SystemEventNames` related to Azure Communication Service starting with `ACS****` are renamed to `Acs***` to honor pascal case. **Features** - Added support for two new `SystemEvents` - `ServiceBusDeadletterMessagesAvailablePeriodicNotificationsEventData` and `ServiceBusActiveMessagesAvailablePeriodicNotificationsEventData` ## 2.0.0b5 (2021-02-10) **Breaking Changes** - `EventGridSharedAccessSignatureCredential` is deprecated in favor of `AzureSasCredential`. - `azure.eventgrid.models` namespace along with all the models in it are now removed. `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping. - `topic_hostname` is renamed to `endpoint` in the `EventGridPublisherClient`. - `azure.eventgrid.generate_shared_access_signature` method is now renamed to `generate_sas`. - `EventGridConsumer`is now removed. Please see the samples to see how events can be deserialized. - `CustomEvent` model is removed. Dictionaries must be used to send a custom schema. **Bug Fixes** - `EventGridEvent` has two additional required positional parameters namely, `data` and `data_version`. - `EventGridPublisherClient` now appropriately throws a `ValueError` if an invalid credential is passed during initialization. ## 2.0.0b4 (2020-11-11) **Bug Fixes** - `TypeError` is raised when bytes are passed to an `EventGridEvent`. ## 2.0.0b3 (2020-10-05) **Feature** - Added support for Keyvault Event Types - Added distributed tracing support for CloudEvents ## 2.0.0b2 (2020-09-24) **Features** - Added support for Azure Communication Services event types. ## 2.0.0b1 (2020-09-08) **Features** - Version (2.0.0b1) is the first preview of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. For more information about this, and preview releases of other Azure SDK libraries, please visit https://azure.github.io/azure-sdk/releases/latest/python.html. - Added Support for `CloudEvents`. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and CustomEvents. - Implements the `EventGridConsumer` for the consume flow of the events. ## 1.3.0 (2019-05-20) - Event Schemas for new event types from IotHub, Media Services, Container Registry, Maps, and AppConfiguration services. ## 1.2.0 (2018-08-28) - Event Schemas for new events (IotHub DeviceConnected and DeviceDisconnected events, Resource events related to actions), and breaking changes to the schema for IotHub DeviceCreated event and IotHub DeviceDeleted event. ## 1.1.0 (2018-05-24) - Event Schemas for EventGrid subscription validation event, Azure Media events, and ServiceBus events. ## 1.0.0 (2018-04-26) **General Breaking changes** This version uses a next-generation code generator that *might* introduce breaking changes. - Model signatures now use only keyword-argument syntax. All positional arguments must be re-written as keyword-arguments. To keep auto-completion in most cases, models are now generated for Python 2 and Python 3. Python 3 uses the "*" syntax for keyword-only arguments. - Enum types now use the "str" mixin (class AzureEnum(str, Enum)) to improve the behavior when unrecognized enum values are encountered. While this is not a breaking change, the distinctions are important, and are documented here: At a glance: - "is" should not be used at all. - "format" will return the string value, where "%s" string formatting will return `NameOfEnum.stringvalue`. Format syntax should be preferred. - New Long Running Operation: - Return type changes from `msrestazure.azure_operation.AzureOperationPoller` to `msrest.polling.LROPoller`. External API is the same. - Return type is now **always** a `msrest.polling.LROPoller`, regardless of the optional parameters used. - The behavior has changed when using `raw=True`. Instead of returning the initial call result as `ClientRawResponse`, without polling, now this returns an LROPoller. After polling, the final resource will be returned as a `ClientRawResponse`. - New `polling` parameter. The default behavior is `Polling=True` which will poll using ARM algorithm. When `Polling=False`, the response of the initial call will be returned without polling. - `polling` parameter accepts instances of subclasses of `msrest.polling.PollingMethod`. - `add_done_callback` will no longer raise if called after polling is finished, but will instead execute the callback right away. **Features** - Client class can be used as a context manager to keep the underlying HTTP session open for performance - Support for consuming Azure Container Registry events and Azure IoT Hub events published to Event Grid. ## 0.1.0 (2018-01-30) - Initial Release %package help Summary: Development documents and examples for azure-eventgrid Provides: python3-azure-eventgrid-doc %description help # Azure Event Grid client library for Python Azure Event Grid is a fully-managed intelligent event routing service that allows for uniform event consumption using a publish-subscribe model. [Source code][python-eg-src] | [Package (PyPI)][python-eg-pypi] | [Package (Conda)](https://anaconda.org/microsoft/azure-eventgrid/) | [API reference documentation][python-eg-ref-docs] | [Product documentation][python-eg-product-docs] | [Samples][python-eg-samples] | [Changelog][python-eg-changelog] ## _Disclaimer_ _Azure SDK Python packages support for Python 2.7 has ended on 01 January 2022. For more information and questions, please refer to https://github.com/Azure/azure-sdk-for-python/issues/20691_ ## Getting started ### Prerequisites * Python 3.7 or later is required to use this package. * You must have an [Azure subscription][azure_subscription] and an Event Grid Topic resource to use this package. Follow this [step-by-step tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart-portal) to register the Event Grid resource provider and create Event Grid topics using the [Azure portal](https://portal.azure.com/). There is a [similar tutorial](https://docs.microsoft.com/azure/event-grid/custom-event-quickstart) using [Azure CLI](https://docs.microsoft.com/cli/azure). ### Install the package Install the Azure Event Grid client library for Python with [pip][pip]: ```bash pip install azure-eventgrid ``` * An existing Event Grid topic or domain is required. You can create the resource using [Azure Portal][azure_portal_create_EG_resource] or [Azure CLI][azure_cli_link] If you use Azure CLI, replace `` and `` with your own unique names. #### Create an Event Grid Topic ``` az eventgrid topic --create --location --resource-group --name ``` #### Create an Event Grid Domain ``` az eventgrid domain --create --location --resource-group --name ``` ### Authenticate the client In order to interact with the Event Grid service, you will need to create an instance of a client. An **endpoint** and **credential** are necessary to instantiate the client object. #### Using Azure Active Directory (AAD) Azure Event Grid provides integration with Azure Active Directory (Azure AD) for identity-based authentication of requests. With Azure AD, you can use role-based access control (RBAC) to grant access to your Azure Event Grid resources to users, groups, or applications. To send events to a topic or domain with a `TokenCredential`, the authenticated identity should have the "EventGrid Data Sender" role assigned. With the `azure-identity` package, you can seamlessly authorize requests in both development and production environments. To learn more about Azure Active Directory, see the [`azure-identity` README](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/identity/azure-identity/README.md). For example, you can use `DefaultAzureCredential` to construct a client which will authenticate using Azure Active Directory: ```python from azure.identity import DefaultAzureCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent credential = DefaultAzureCredential() endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] client = EventGridPublisherClient(endpoint, credential) ``` #### Looking up the endpoint You can find the topic endpoint within the Event Grid Topic resource on the Azure portal. This will look like: `"https://..eventgrid.azure.net/api/events"` #### Create the client with AzureKeyCredential To use an Access key as the `credential` parameter, pass the key as a string into an instance of [AzureKeyCredential][azure-key-credential]. > **Note:** The Access Key may be found in the azure portal in the "Access Keys" menu of the Event Grid Topic resource. They may also be obtained via the azure CLI, or the `azure-mgmt-eventgrid` library. A guide for getting access keys can be found [here](https://docs.microsoft.com/azure/event-grid/get-access-keys). ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.credentials import AzureKeyCredential topic_key = os.environ["EVENTGRID_TOPIC_KEY"] endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"] credential = AzureKeyCredential(topic_key) client = EventGridPublisherClient(endpoint, credential) ``` > **Note:** A client may also be authenticated via SAS signature, using the `AzureSasCredential`. A sample demonstrating this, is available [here][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]). > **Note:** The `generate_sas` method can be used to generate a shared access signature. A sample demonstrating this can be seen [here][python-eg-generate-sas]. ## Key concepts ### Topic A **[topic](https://docs.microsoft.com/azure/event-grid/concepts#topics)** is a channel within the EventGrid service to send events. The event schema that a topic accepts is decided at topic creation time. If events of a schema type are sent to a topic that requires a different schema type, errors will be raised. ### Domain An event **[domain](https://docs.microsoft.com/azure/event-grid/event-domains)** is a management tool for large numbers of Event Grid topics related to the same application. They allow you to publish events to thousands of topics. Domains also give you authorization and authentication control over each topic. For more information, visit [Event domain overview](https://docs.microsoft.com/azure/event-grid/event-domains). When you create an event domain, a publishing endpoint for this domain is made available to you. This process is similar to creating an Event Grid Topic. The only difference is that, when publishing to a domain, you must specify the topic within the domain that you'd like the event to be delivered to. ### Event schemas An **[event](https://docs.microsoft.com/azure/event-grid/concepts#events)** is the smallest amount of information that fully describes something that happened in the system. When a custom topic or domain is created, you must specify the schema that will be used when publishing events. Event Grid supports multiple schemas for encoding events. #### Event Grid schema While you may configure your topic to use a [custom schema](https://docs.microsoft.com/azure/event-grid/input-mappings), it is more common to use the already-defined Event Grid schema. See the specifications and requirements [here](https://docs.microsoft.com/azure/event-grid/event-schema). #### CloudEvents v1.0 schema Another option is to use the CloudEvents v1.0 schema. [CloudEvents](https://cloudevents.io/) is a Cloud Native Computing Foundation project which produces a specification for describing event data in a common way. The service summary of CloudEvents can be found [here](https://docs.microsoft.com/azure/event-grid/cloud-event-schema). ### EventGridPublisherClient `EventGridPublisherClient` provides operations to send event data to a topic hostname specified during client initialization. Regardless of the schema that your topic or domain is configured to use, `EventGridPublisherClient` will be used to publish events to it. Use the `send` method publishing events. The following formats of events are allowed to be sent: - A list or a single instance of strongly typed EventGridEvents. - A dict representation of a serialized EventGridEvent object. - A list or a single instance of strongly typed CloudEvents. - A dict representation of a serialized CloudEvent object. - A dict representation of any Custom Schema. Please have a look at the [samples](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples) for detailed examples. **Note:** It is important to know if your topic supports CloudEvents or EventGridEvents before publishing. If you send to a topic that does not support the schema of the event you are sending, send() will throw an exception. ### System Topics A **[system topic](https://docs.microsoft.com/azure/event-grid/system-topics)** in Event Grid represents one or more events published by Azure services such as Azure Storage or Azure Event Hubs. For example, a system topic may represent all blob events or only blob creation and blob deletion events published for a specific storage account. The names of the various event types for the system events published to Azure Event Grid are available in `azure.eventgrid.SystemEventNames`. For complete list of recognizable system topics, visit [System Topics](https://docs.microsoft.com/azure/event-grid/system-topics). For more information about the key concepts on Event Grid, see [Concepts in Azure Event Grid][publisher-service-doc]. ## Event Grid on Kubernetes with Azure Arc Event Grid on Kubernetes with Azure Arc is an offering that allows you to run Event Grid on your own Kubernetes cluster. This capability is enabled by the use of Azure Arc enabled Kubernetes. Through Azure Arc enabled Kubernetes, a supported Kubernetes cluster connects to Azure. Once connected, you are able to install Event Grid on it. Learn more about it [here](https://docs.microsoft.com/azure/event-grid/kubernetes/overview). ### Support for CNCF Cloud Events Starting with v4.7.0, this package also supports publishing a CNCF cloud event from https://pypi.org/project/cloudevents/. You would be able to pass a CloudEvent object from this library to the `send` API. ```python from cloudevents.http import CloudEvent event = CloudEvent(...) client.send(event) ``` ## Examples The following sections provide several code snippets covering some of the most common Event Grid tasks, including: * [Send an Event Grid Event](#send-an-event-grid-event) * [Send a Cloud Event](#send-a-cloud-event) * [Send Multiple Events](#send-multiple-events) * [Send events as Dictionaries](#send-events-as-dictionaries) * [Consume a payload from storage queue](#consume-from-storage-queue) * [Consume from ServiceBus](#consume-from-servicebus) ### Send an Event Grid Event This example publishes an Event Grid event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient, EventGridEvent key = os.environ["EG_ACCESS_KEY"] endpoint = os.environ["EG_TOPIC_HOSTNAME"] event = EventGridEvent( data={"team": "azure-sdk"}, subject="Door1", event_type="Azure.Sdk.Demo", data_version="2.0" ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send a Cloud Event This example publishes a Cloud event. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Send Multiple events It is possible to send events as a batch when sending multiple events to a topic or a domain. This example sends a list of CloudEvents using the send method. **WARNING:** When sending a list of multiple events at one time, iterating over and sending each event will not result in optimal performance. For best performance, it is highly recommended to send a list of events. ```python import os from azure.core.credentials import AzureKeyCredential from azure.core.messaging import CloudEvent from azure.eventgrid import EventGridPublisherClient key = os.environ["CLOUD_ACCESS_KEY"] endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"] event0 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team": "azure-sdk"} ) event1 = CloudEvent( type="Azure.Sdk.Sample", source="https://egsample.dev/sampleevent", data={"team2": "azure-eventgrid"} ) events = [event0, event1] credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(events) ``` ### Send events as dictionaries A dict representation of respective serialized models can also be used to publish CloudEvent(s) or EventGridEvent(s) apart from the strongly typed objects. Use a dict-like representation to send to a topic with custom schema as shown below. ```python import os import uuid import datetime as dt from msrest.serialization import UTC from azure.core.credentials import AzureKeyCredential from azure.eventgrid import EventGridPublisherClient key = os.environ["CUSTOM_SCHEMA_ACCESS_KEY"] endpoint = os.environ["CUSTOM_SCHEMA_TOPIC_HOSTNAME"] event = custom_schema_event = { "customSubject": "sample", "customEventType": "sample.event", "customDataVersion": "2.0", "customId": uuid.uuid4(), "customEventTime": dt.datetime.now(UTC()).isoformat(), "customData": "sample data" } credential = AzureKeyCredential(key) client = EventGridPublisherClient(endpoint, credential) client.send(event) ``` ### Consume from storage queue This example consumes a message received from storage queue and deserializes it to a CloudEvent object. ```python from azure.core.messaging import CloudEvent from azure.storage.queue import QueueServiceClient, BinaryBase64DecodePolicy import os import json # all types of CloudEvents below produce same DeserializedEvent connection_str = os.environ['STORAGE_QUEUE_CONN_STR'] queue_name = os.environ['STORAGE_QUEUE_NAME'] with QueueServiceClient.from_connection_string(connection_str) as qsc: payload = qsc.get_queue_client( queue=queue_name, message_decode_policy=BinaryBase64DecodePolicy() ).peek_messages() ## deserialize payload into a list of typed Events events = [CloudEvent.from_dict(json.loads(msg.content)) for msg in payload] ``` ### Consume from servicebus This example consumes a payload message received from ServiceBus and deserializes it to an EventGridEvent object. ```python from azure.eventgrid import EventGridEvent from azure.servicebus import ServiceBusClient import os import json # all types of EventGridEvents below produce same DeserializedEvent connection_str = os.environ['SERVICE_BUS_CONN_STR'] queue_name = os.environ['SERVICE_BUS_QUEUE_NAME'] with ServiceBusClient.from_connection_string(connection_str) as sb_client: payload = sb_client.get_queue_receiver(queue_name).receive_messages() ## deserialize payload into a list of typed Events events = [EventGridEvent.from_dict(json.loads(next(msg.body).decode('utf-8'))) for msg in payload] ``` ## Distributed Tracing with EventGrid You can use OpenTelemetry for Python as usual with EventGrid since it's compatible with azure-core tracing integration. Here is an example of using OpenTelemetry to trace sending a CloudEvent. First, set OpenTelemetry as enabled tracing plugin for EventGrid. ```python from azure.core.settings import settings from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan settings.tracing_implementation = OpenTelemetrySpan ``` Regular open telemetry usage from here. See [OpenTelemetry](https://github.com/open-telemetry/opentelemetry-python) for details. This example uses a simple console exporter to export the traces. Any exporter can be used here including `azure-monitor-opentelemetry-exporter`, `jaeger`, `zipkin` etc. ```python from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor # this requires opentelemetry >= 1.0.0 # Simple console exporter exporter = ConsoleSpanExporter() trace.set_tracer_provider(TracerProvider()) tracer = trace.get_tracer(__name__) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(exporter) ) ``` Once the `tracer` and `exporter` are set, please follow the example below to start collecting traces while using the `send` method from the `EventGridPublisherClient` to send a CloudEvent object. ```python import os from azure.eventgrid import EventGridPublisherClient from azure.core.messaging import CloudEvent from azure.core.credentials import AzureKeyCredential hostname = os.environ['CLOUD_TOPIC_HOSTNAME'] key = AzureKeyCredential(os.environ['CLOUD_ACCESS_KEY']) cloud_event = CloudEvent( source = 'demo', type = 'sdk.demo', data = {'test': 'hello'}, ) with tracer.start_as_current_span(name="MyApplication"): client = EventGridPublisherClient(hostname, key) client.send(cloud_event) ``` ## Troubleshooting - Enable `azure.eventgrid` logger to collect traces from the library. ### General Event Grid client library will raise exceptions defined in [Azure Core][azure_core_exceptions]. ### Logging This library uses the standard [logging][python_logging] library for logging. Basic information about HTTP sessions (URLs, headers, etc.) is logged at INFO level. ### Optional Configuration Optional keyword arguments can be passed in at the client and per-operation level. The azure-core [reference documentation][azure_core_ref_docs] describes available configurations for retries, logging, transport protocols, and more. ## Next steps The following section provides several code snippets illustrating common patterns used in the Event Grid Python API. ### More sample code These code samples show common champion scenario operations with the Azure Event Grid client library. * Generate Shared Access Signature: [sample_generate_sas.py][python-eg-generate-sas] * Authenticate the client: [sample_authentication.py][python-eg-auth] ([async_version][python-eg-auth-async]) * Publish events to a topic using SAS: [sample_publish_events_to_a_topic_using_sas_credential_async.py][python-eg-sample-send-using-sas] ([async_version][python-eg-sample-send-using-sas-async]) * Publish Event Grid Events to a topic: [sample_publish_eg_events_to_a_topic.py][python-eg-sample-eg-event] ([async_version][python-eg-sample-eg-event-async]) * Publish EventGrid Events to a domain topic: [sample_publish_eg_events_to_a_domain_topic.py][python-eg-sample-eg-event-to-domain] ([async_version][python-eg-sample-eg-event-to-domain-async]) * Publish a Cloud Event: [sample_publish_events_using_cloud_events_1.0_schema.py][python-eg-sample-send-cloudevent] ([async_version][python-eg-sample-send-cloudevent-async]) * Publish a Custom Schema: [sample_publish_custom_schema_to_a_topic.py][python-eg-publish-custom-schema] ([async_version][python-eg-publish-custom-schema-async]) The following samples cover publishing and consuming `dict` representations of EventGridEvents and CloudEvents. * Publish EventGridEvent as dict like representation: [sample_publish_eg_event_using_dict.py][python-eg-sample-send-eg-as-dict] ([async_version][python-eg-sample-send-eg-as-dict-async]) * Publish CloudEvent as dict like representation: [sample_publish_cloud_event_using_dict.py][python-eg-sample-send-cloudevent-as-dict] ([async_version][python-eg-sample-send-cloudevent-as-dict-async]) * Consume a Custom Payload of raw cloudevent data: [sample_consume_custom_payload.py][python-eg-sample-consume-custom-payload] More samples can be found [here][python-eg-samples]. * More samples related to the send scenario can be seen [here][python-eg-publish-samples]. * To see more samples related to consuming a payload from different messaging services as a typed object, please visit [Consume Samples][python-eg-consume-samples] ### Additional documentation For more extensive documentation on Azure Event Grid, see the [Event Grid documentation][python-eg-product-docs] on docs.microsoft.com. ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [cla.microsoft.com][cla]. When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct][code_of_conduct]. For more information see the [Code of Conduct FAQ][coc_faq] or contact [opencode@microsoft.com][coc_contact] with any additional questions or comments. [azure_cli_link]: https://pypi.org/project/azure-cli/ [python-eg-src]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/ [python-eg-pypi]: https://pypi.org/project/azure-eventgrid [python-eg-product-docs]: https://docs.microsoft.com/azure/event-grid/overview [python-eg-ref-docs]: https://azuresdkdocs.blob.core.windows.net/$web/python/azure-eventgrid/latest/index.html [publisher-service-doc]: https://docs.microsoft.com/azure/event-grid/concepts [python-eg-samples]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/samples [python-eg-changelog]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/eventgrid/azure-eventgrid/CHANGELOG.md [pip]: https://pypi.org/project/pip/ [azure_portal_create_EG_resource]: https://ms.portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.EventGrid%2Ftopics [azure-key-credential]: https://aka.ms/azsdk/python/core/azurekeycredential [azure_core_exceptions]: https://aka.ms/azsdk/python/core/docs#module-azure.core.exceptions [python_logging]: https://docs.python.org/3/library/logging.html [azure_core_ref_docs]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core#configurations [azure_subscription]: https://azure.microsoft.com/free/ [python-eg-auth]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_authentication.py [python-eg-generate-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_generate_sas.py [python-eg-sample-send-using-sas]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_to_a_topic_using_sas_credential.py [python-eg-sample-eg-event]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_topic.py [python-eg-sample-eg-event-to-domain]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_events_to_a_domain.py [python-eg-sample-send-cloudevent]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_events_using_cloud_events_1.0_schema.py [python-eg-publish-custom-schema]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_custom_schema_to_a_topic.py [python-eg-sample-send-eg-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_eg_event_using_dict.py [python-eg-sample-send-cloudevent-as-dict]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_publish_cloud_event_using_dict.py [python-eg-auth-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_authentication_async.py [python-eg-sample-send-using-sas-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_to_a_topic_using_sas_credential_async.py [python-eg-sample-eg-event-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_topic_async.py [python-eg-sample-eg-event-to-domain-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_events_to_a_domain_async.py [python-eg-sample-send-cloudevent-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_events_using_cloud_events_1.0_schema_async.py [python-eg-publish-custom-schema-async]:https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_custom_schema_to_a_topic_async.py [python-eg-sample-send-eg-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_eg_event_using_dict_async.py [python-eg-sample-send-cloudevent-as-dict-async]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/async_samples/sample_publish_cloud_event_using_dict_async.py [python-eg-publish-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/publish_samples [python-eg-consume-samples]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/consume_samples [python-eg-sample-consume-custom-payload]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/samples/sync_samples/sample_consume_custom_payload.py [cla]: https://cla.microsoft.com [code_of_conduct]: https://opensource.microsoft.com/codeofconduct/ [coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ [coc_contact]: mailto:opencode@microsoft.com # Release History ## 4.10.0 (2023-04-11) ### Features Added - Added new enum values to `SystemEventNames` related to Azure Communication Services, DataBox and ApiManagementGateway APIs. ### Bugs Fixed - `SystemEventNames` enums for APIManagement were incorrectly capitalized, changed `Api` to `API`. ### Other Changes - Removed `msrest` dependency and `six` dependency - Added `isodate` dependency ## 4.9.1 (2022-11-08) - This version and all future versions will require Python 3.7+. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.9.0 (2022-07-05) ### Features Added - Added support for publishing events to a channel. ## 4.9.0b1 (2022-04-07) ### Features Added - Added support for publishing events to a channel. ## 4.8.0 (2022-04-06) - This version and all future versions will require Python 3.6+. Python 2.7 is no longer supported. ### Features Added - Added new enum values to `SystemEventNames` related to health care APIs. ## 4.7.1 (2021-11-18) ### Bugs Fixed - The `send` API will raise on exceptions. ## 4.7.0 (2021-11-09) ### Features Added - Added support for publishing native CNCF cloudevents (https://pypi.org/project/cloudevents/). ## 4.6.0 (2021-10-05) ### Features Added - Added new enum values to `SystemEvents`. ## 4.5.0 (2021-08-10) ### Features Added - Added a new enum value `Microsoft.ContainerService.NewKubernetesVersionAvailable` to `SystemEvents`. - Added a `from_json` method which now accepts storage QueueMessage, eventhub's EventData or ServiceBusMessage or simply json bytes to return an `EventGridEvent` ## 4.4.0 (2021-07-19) - Bumped `msrest` dependency to `0.6.21` to align with mgmt package. ### Features Added - `EventGridPublisherClient` now supports Azure Active Directory (AAD) for authentication. ## 4.3.0 (2021-06-09) **New Features** - Added new event names related to blob inventory to the `SystemEventNames` enum. **Bug Fixes** - Replaced the `ServiceBusDeadletterMessagesAvailableWithNoListenerEventName` with the right value. ## 4.2.0 (2021-05-12) **New Features** - Added new event names to the `SystemEventNames` enum. ## 4.1.1 (2021-04-07) **Bug Fixes** - Improved the `repr` on `EventGridEvent` to show more meaningful text. ## 4.1.0 (2021-03-23) **New Features** - Added new SystemEventNames `AcsChatThreadParticipantRemovedEventName`, `AcsChatThreadParticipantAddedEventName` and `AcsRecordingFileStatusUpdatedEventName`. ## 4.0.0 (2021-03-09) **Note:** This is the first stable release of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. Users migrating from `v1.x` are advised to view the [migration guide](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/eventgrid/azure-eventgrid/migration_guide.md). **New Features** - `azure-eventgrid` package now supports `azure.core.messaging.CloudEvent` which honors the CNCF CloudEvent spec. - `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping for system events. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and Custom schema events. **Breaking Changes** - `azure.eventgrid.models` namespace along with all the models in it are now removed.: - JSON documentation on the events is available here: https://docs.microsoft.com/azure/event-grid/system-topics - `azure.eventgrid.SystemEventNames` provides the list of available events name for easy switching. - `azure.eventgrid.event_grid_client.EventGridClient` is now removed in favor of `azure.eventgrid.EventGridPublisherClient`. - `azure.eventgrid.event_grid_client.EventGridClientConfiguration` is now removed. ## 2.0.0 (2021-03-09) **Disclaimer:** v2.0.0 is functionally equivalent to v4.0.0. Users are advised to use v4.0.0 instead of this. **Breaking Changes** - `~azure.eventgrid.CloudEvent` is now removed in favor of `~azure.core.messaging.CloudEvent`. - All the `SystemEventNames` related to Azure Communication Service starting with `ACS****` are renamed to `Acs***` to honor pascal case. **Features** - Added support for two new `SystemEvents` - `ServiceBusDeadletterMessagesAvailablePeriodicNotificationsEventData` and `ServiceBusActiveMessagesAvailablePeriodicNotificationsEventData` ## 2.0.0b5 (2021-02-10) **Breaking Changes** - `EventGridSharedAccessSignatureCredential` is deprecated in favor of `AzureSasCredential`. - `azure.eventgrid.models` namespace along with all the models in it are now removed. `azure.eventgrid.SystemEventNames` can be used to get the event model type mapping. - `topic_hostname` is renamed to `endpoint` in the `EventGridPublisherClient`. - `azure.eventgrid.generate_shared_access_signature` method is now renamed to `generate_sas`. - `EventGridConsumer`is now removed. Please see the samples to see how events can be deserialized. - `CustomEvent` model is removed. Dictionaries must be used to send a custom schema. **Bug Fixes** - `EventGridEvent` has two additional required positional parameters namely, `data` and `data_version`. - `EventGridPublisherClient` now appropriately throws a `ValueError` if an invalid credential is passed during initialization. ## 2.0.0b4 (2020-11-11) **Bug Fixes** - `TypeError` is raised when bytes are passed to an `EventGridEvent`. ## 2.0.0b3 (2020-10-05) **Feature** - Added support for Keyvault Event Types - Added distributed tracing support for CloudEvents ## 2.0.0b2 (2020-09-24) **Features** - Added support for Azure Communication Services event types. ## 2.0.0b1 (2020-09-08) **Features** - Version (2.0.0b1) is the first preview of our efforts to create a user-friendly and Pythonic client library for Azure EventGrid. For more information about this, and preview releases of other Azure SDK libraries, please visit https://azure.github.io/azure-sdk/releases/latest/python.html. - Added Support for `CloudEvents`. - Implements the `EventGridPublisherClient` for the publish flow for EventGrid Events, CloudEvents and CustomEvents. - Implements the `EventGridConsumer` for the consume flow of the events. ## 1.3.0 (2019-05-20) - Event Schemas for new event types from IotHub, Media Services, Container Registry, Maps, and AppConfiguration services. ## 1.2.0 (2018-08-28) - Event Schemas for new events (IotHub DeviceConnected and DeviceDisconnected events, Resource events related to actions), and breaking changes to the schema for IotHub DeviceCreated event and IotHub DeviceDeleted event. ## 1.1.0 (2018-05-24) - Event Schemas for EventGrid subscription validation event, Azure Media events, and ServiceBus events. ## 1.0.0 (2018-04-26) **General Breaking changes** This version uses a next-generation code generator that *might* introduce breaking changes. - Model signatures now use only keyword-argument syntax. All positional arguments must be re-written as keyword-arguments. To keep auto-completion in most cases, models are now generated for Python 2 and Python 3. Python 3 uses the "*" syntax for keyword-only arguments. - Enum types now use the "str" mixin (class AzureEnum(str, Enum)) to improve the behavior when unrecognized enum values are encountered. While this is not a breaking change, the distinctions are important, and are documented here: At a glance: - "is" should not be used at all. - "format" will return the string value, where "%s" string formatting will return `NameOfEnum.stringvalue`. Format syntax should be preferred. - New Long Running Operation: - Return type changes from `msrestazure.azure_operation.AzureOperationPoller` to `msrest.polling.LROPoller`. External API is the same. - Return type is now **always** a `msrest.polling.LROPoller`, regardless of the optional parameters used. - The behavior has changed when using `raw=True`. Instead of returning the initial call result as `ClientRawResponse`, without polling, now this returns an LROPoller. After polling, the final resource will be returned as a `ClientRawResponse`. - New `polling` parameter. The default behavior is `Polling=True` which will poll using ARM algorithm. When `Polling=False`, the response of the initial call will be returned without polling. - `polling` parameter accepts instances of subclasses of `msrest.polling.PollingMethod`. - `add_done_callback` will no longer raise if called after polling is finished, but will instead execute the callback right away. **Features** - Client class can be used as a context manager to keep the underlying HTTP session open for performance - Support for consuming Azure Container Registry events and Azure IoT Hub events published to Event Grid. ## 0.1.0 (2018-01-30) - Initial Release %prep %autosetup -n azure-eventgrid-4.10.0 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-azure-eventgrid -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Fri Apr 21 2023 Python_Bot - 4.10.0-1 - Package Spec generated