From 52f89f5309704729ec251ebdca3c6a7093f8bcab Mon Sep 17 00:00:00 2001 From: Dominic Betts <1454644+dominicbetts@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:04:01 +0000 Subject: [PATCH] Media connector updates (#112) Updates to media connector sample including those from #111 --------- Co-authored-by: Sam Chang --- .../.config_aio_connectors_namespace | 1 + .../.config_aio_namespace | 1 + .../.config_resources_path | 1 + .../Install-ResourceFile.ps1 | 34 ++++++ ...oke-ResourceInstallMonitorAndUninstall.ps1 | 60 ++++++++++ .../Invoke-TestClipToFsAutostart.ps1 | 20 ++++ .../Invoke-TestSnapshotToFsAutostart.ps1 | 20 ++++ .../Invoke-TestSnapshotToMqttAutostart.ps1 | 20 ++++ .../Invoke-TestStreamToRtspAutostart.ps1 | 21 ++++ .../media-connector-invoke-test/Overview.md | 29 +++++ samples/media-connector-invoke-test/README.md | 104 +++++++++++++++++- .../Start-FileSystemMonitor.ps1 | 50 +++++++++ .../Start-MqttListener.ps1 | 46 ++++++++ .../Start-RtspStreamViewer.ps1 | 63 +++++++++++ .../Test-Prerequisites.ps1 | 52 +++++++++ .../Uninstall-ResourceFile.ps1 | 34 ++++++ .../Update-AioBrokerEndpointFile.ps1 | 78 +++++++++++++ .../Update-MediaServerConfigFiles.ps1 | 32 ++++++ .../Install-BrokerListener.ps1 | 19 ++++ .../Uninstall-BrokerListener.ps1 | 19 ++++ .../broker-listener/broker-listener.yaml | 24 ++++ .../media-connector-demo.png | Bin 0 -> 132512 bytes .../media-connector-demo.svg | 1 + .../media-server/Install-MediaServer.ps1 | 28 +++++ .../media-server/README.md | 17 +++ .../media-server/Test-MediaServer.ps1 | 24 ++++ .../media-server/Test-Prerequisites.ps1 | 11 ++ .../media-server/Uninstall-MediaServer.ps1 | 24 ++++ .../aep-public-http-anonymous-1.yaml | 2 +- .../aep-public-https-anonymous-1.yaml | 2 +- ...http-anonymous-1-clip-to-fs-autostart.yaml | 1 + ...tp-anonymous-1-clip-to-fs-noautostart.yaml | 1 + ...tp-anonymous-1-clip-to-mqtt-autostart.yaml | 1 + ...-anonymous-1-clip-to-mqtt-noautostart.yaml | 1 + ...-http-anonymous-1-hls-to-fs-autostart.yaml | 20 ++++ ...-anonymous-1-snapshot-to-fs-autostart.yaml | 1 + ...nonymous-1-snapshot-to-fs-noautostart.yaml | 1 + ...nonymous-1-snapshot-to-mqtt-autostart.yaml | 1 + ...nymous-1-snapshot-to-mqtt-noautostart.yaml | 1 + ...-anonymous-1-stream-to-rtsp-autostart.yaml | 1 + ...nonymous-1-stream-to-rtsp-noautostart.yaml | 1 + ...ttps-anonymous-1-clip-to-fs-autostart.yaml | 1 + ...ps-anonymous-1-clip-to-fs-noautostart.yaml | 1 + ...ps-anonymous-1-clip-to-mqtt-autostart.yaml | 1 + ...-anonymous-1-clip-to-mqtt-noautostart.yaml | 1 + ...-anonymous-1-snapshot-to-fs-autostart.yaml | 1 + ...nonymous-1-snapshot-to-fs-noautostart.yaml | 1 + ...nonymous-1-snapshot-to-mqtt-autostart.yaml | 1 + ...nymous-1-snapshot-to-mqtt-noautostart.yaml | 1 + ...-anonymous-1-stream-to-rtsp-autostart.yaml | 1 + ...nonymous-1-stream-to-rtsp-noautostart.yaml | 1 + .../update-aio/Update-AioMediaConnector.ps1 | 38 +++++++ 52 files changed, 908 insertions(+), 7 deletions(-) create mode 100644 samples/media-connector-invoke-test/.config_aio_connectors_namespace create mode 100644 samples/media-connector-invoke-test/.config_aio_namespace create mode 100644 samples/media-connector-invoke-test/.config_resources_path create mode 100644 samples/media-connector-invoke-test/Install-ResourceFile.ps1 create mode 100644 samples/media-connector-invoke-test/Invoke-ResourceInstallMonitorAndUninstall.ps1 create mode 100644 samples/media-connector-invoke-test/Invoke-TestClipToFsAutostart.ps1 create mode 100644 samples/media-connector-invoke-test/Invoke-TestSnapshotToFsAutostart.ps1 create mode 100644 samples/media-connector-invoke-test/Invoke-TestSnapshotToMqttAutostart.ps1 create mode 100644 samples/media-connector-invoke-test/Invoke-TestStreamToRtspAutostart.ps1 create mode 100644 samples/media-connector-invoke-test/Overview.md create mode 100644 samples/media-connector-invoke-test/Start-FileSystemMonitor.ps1 create mode 100644 samples/media-connector-invoke-test/Start-MqttListener.ps1 create mode 100644 samples/media-connector-invoke-test/Start-RtspStreamViewer.ps1 create mode 100644 samples/media-connector-invoke-test/Test-Prerequisites.ps1 create mode 100644 samples/media-connector-invoke-test/Uninstall-ResourceFile.ps1 create mode 100644 samples/media-connector-invoke-test/Update-AioBrokerEndpointFile.ps1 create mode 100644 samples/media-connector-invoke-test/Update-MediaServerConfigFiles.ps1 create mode 100644 samples/media-connector-invoke-test/broker-listener/Install-BrokerListener.ps1 create mode 100644 samples/media-connector-invoke-test/broker-listener/Uninstall-BrokerListener.ps1 create mode 100644 samples/media-connector-invoke-test/broker-listener/broker-listener.yaml create mode 100644 samples/media-connector-invoke-test/media-connector-demo.png create mode 100644 samples/media-connector-invoke-test/media-connector-demo.svg create mode 100644 samples/media-connector-invoke-test/media-server/Install-MediaServer.ps1 create mode 100644 samples/media-connector-invoke-test/media-server/README.md create mode 100644 samples/media-connector-invoke-test/media-server/Test-MediaServer.ps1 create mode 100644 samples/media-connector-invoke-test/media-server/Test-Prerequisites.ps1 create mode 100644 samples/media-connector-invoke-test/media-server/Uninstall-MediaServer.ps1 create mode 100644 samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-hls-to-fs-autostart.yaml create mode 100644 samples/media-connector-invoke-test/update-aio/Update-AioMediaConnector.ps1 diff --git a/samples/media-connector-invoke-test/.config_aio_connectors_namespace b/samples/media-connector-invoke-test/.config_aio_connectors_namespace new file mode 100644 index 0000000..381b8a4 --- /dev/null +++ b/samples/media-connector-invoke-test/.config_aio_connectors_namespace @@ -0,0 +1 @@ +azure-iot-operations \ No newline at end of file diff --git a/samples/media-connector-invoke-test/.config_aio_namespace b/samples/media-connector-invoke-test/.config_aio_namespace new file mode 100644 index 0000000..381b8a4 --- /dev/null +++ b/samples/media-connector-invoke-test/.config_aio_namespace @@ -0,0 +1 @@ +azure-iot-operations \ No newline at end of file diff --git a/samples/media-connector-invoke-test/.config_resources_path b/samples/media-connector-invoke-test/.config_resources_path new file mode 100644 index 0000000..8348376 --- /dev/null +++ b/samples/media-connector-invoke-test/.config_resources_path @@ -0,0 +1 @@ +${PSScriptRoot}/resources diff --git a/samples/media-connector-invoke-test/Install-ResourceFile.ps1 b/samples/media-connector-invoke-test/Install-ResourceFile.ps1 new file mode 100644 index 0000000..2e5d34d --- /dev/null +++ b/samples/media-connector-invoke-test/Install-ResourceFile.ps1 @@ -0,0 +1,34 @@ +#Requires -Version 7 +<# + Install a resource file. +#> +param ( + [Parameter( + Mandatory=$true, + HelpMessage="The resource file.")] + [string]$resourceFile +) + +Write-Host "`n" +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$resourcesDirectory = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_resources_path") -Raw).Trim() +$resourcesDirectory = $ExecutionContext.InvokeCommand.ExpandString(${resourcesDirectory}) +Write-Host "Resources directory: $resourcesDirectory" + +Write-Host "Resource file: $resourceFile" + +$fileFullPath=(Join-Path -Path $resourcesDirectory -ChildPath $resourceFile) +Write-Host "Resource file full path: ${fileFullPath}" + +Write-Host "Applying the resource..." +. kubectl apply -n ${aioConnectorsNamespace} -f ${fileFullPath} +If ($LastExitCode -ne 0) { + Write-Host "Error: The resource could not be applied." + Exit $LastExitCode +} Else { + Write-Host "The resource was applied successfully.`n" +} diff --git a/samples/media-connector-invoke-test/Invoke-ResourceInstallMonitorAndUninstall.ps1 b/samples/media-connector-invoke-test/Invoke-ResourceInstallMonitorAndUninstall.ps1 new file mode 100644 index 0000000..4c66e49 --- /dev/null +++ b/samples/media-connector-invoke-test/Invoke-ResourceInstallMonitorAndUninstall.ps1 @@ -0,0 +1,60 @@ +#Requires -Version 7 +<# + Install a resource pair (aep/asset), monitor it, and uninstall it. +#> +param ( + [Parameter( + Mandatory, + HelpMessage="The AEP name.")] + [string]$aepName = "", + [Parameter( + Mandatory, + HelpMessage="The asset name.")] + [string]$assetName = "", + [Parameter( + Mandatory, + HelpMessage="The datapoint name.")] + [string]$datapointName = "", + [Parameter( + Mandatory, + HelpMessage="The monitor expression.")] + [string]$monitorExpresion = "" +) + +Write-Host "`n" +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +. (Join-Path $PSScriptRoot "Test-Prerequisites.ps1") | Out-Null + +$aioNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_namespace") -Raw).Trim() +Write-Host "AIO namespace: $aioNamespace" + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +Write-Host "AEP Name: $aepName" + +Write-Host "Asset Name: $assetName" + +Write-Host "Datapoint Name: $datapointName" + +Write-Host "Installing the resource files..." +. (Join-Path $PSScriptRoot "Install-ResourceFile.ps1") -resourceFile "${aepName}.yaml" +. (Join-Path $PSScriptRoot "Install-ResourceFile.ps1") -resourceFile "${assetName}.yaml" + +Write-Host "Waiting for the snapshot-to-mqtt task to be ready...`n" +Start-Sleep -Seconds 3 + +try { + Write-Host "Starting the monitor command...`n" + $monitorExpresion = $ExecutionContext.InvokeCommand.ExpandString(${monitorExpresion}) + Invoke-Expression "${monitorExpresion}" + +} finally { + + Write-Host "Uninstalling the resource files...`n" + . (Join-Path $PSScriptRoot "Uninstall-ResourceFile.ps1") -resourceFile "${assetName}.yaml" + . (Join-Path $PSScriptRoot "Uninstall-ResourceFile.ps1") -resourceFile "${aepName}.yaml" + + Write-Host "Snapshot-to-mqtt task test completed.`n" +} diff --git a/samples/media-connector-invoke-test/Invoke-TestClipToFsAutostart.ps1 b/samples/media-connector-invoke-test/Invoke-TestClipToFsAutostart.ps1 new file mode 100644 index 0000000..2a7fcc4 --- /dev/null +++ b/samples/media-connector-invoke-test/Invoke-TestClipToFsAutostart.ps1 @@ -0,0 +1,20 @@ +#Requires -Version 7 + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$aepName = "aep-public-http-anonymous-1" +Write-Host "AEP name: $aepName" + +$assetName = "asset-public-http-anonymous-1-clip-to-fs-autostart" +Write-Host "Asset name: $assetName" + +$datapointName = "clip-to-fs" +Write-Host "Datapoint name: $datapointName" + +. (Join-Path -Path $PSScriptRoot -ChildPath "Invoke-ResourceInstallMonitorAndUninstall.ps1") ` + -aepName $aepName ` + -assetName $assetName ` + -datapointName $datapointName ` + -monitorExpresion ` + "& (Join-Path -Path $PSScriptRoot -ChildPath `"Start-FileSystemMonitor.ps1`") -pathToMonitor /tmp/$aioConnectorsNamespace/data/$assetName/" diff --git a/samples/media-connector-invoke-test/Invoke-TestSnapshotToFsAutostart.ps1 b/samples/media-connector-invoke-test/Invoke-TestSnapshotToFsAutostart.ps1 new file mode 100644 index 0000000..680749b --- /dev/null +++ b/samples/media-connector-invoke-test/Invoke-TestSnapshotToFsAutostart.ps1 @@ -0,0 +1,20 @@ +#Requires -Version 7 + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$aepName = "aep-public-http-anonymous-1" +Write-Host "AEP name: $aepName" + +$assetName = "asset-public-http-anonymous-1-snapshot-to-fs-autostart" +Write-Host "Asset name: $assetName" + +$datapointName = "snapshot-to-fs" +Write-Host "Datapoint name: $datapointName" + +. (Join-Path -Path $PSScriptRoot -ChildPath "Invoke-ResourceInstallMonitorAndUninstall.ps1") ` + -aepName $aepName ` + -assetName $assetName ` + -datapointName $datapointName ` + -monitorExpresion ` + "& (Join-Path -Path $PSScriptRoot -ChildPath `"Start-FileSystemMonitor.ps1`") -pathToMonitor /tmp/$aioConnectorsNamespace/data/$assetName/" diff --git a/samples/media-connector-invoke-test/Invoke-TestSnapshotToMqttAutostart.ps1 b/samples/media-connector-invoke-test/Invoke-TestSnapshotToMqttAutostart.ps1 new file mode 100644 index 0000000..47c1fa0 --- /dev/null +++ b/samples/media-connector-invoke-test/Invoke-TestSnapshotToMqttAutostart.ps1 @@ -0,0 +1,20 @@ +#Requires -Version 7 + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$aepName = "aep-public-http-anonymous-1" +Write-Host "AEP name: $aepName" + +$assetName = "asset-public-http-anonymous-1-snapshot-to-mqtt-autostart" +Write-Host "Asset name: $assetName" + +$datapointName = "snapshot-to-mqtt" +Write-Host "Datapoint name: $datapointName" + +. (Join-Path -Path $PSScriptRoot -ChildPath "Invoke-ResourceInstallMonitorAndUninstall.ps1") ` + -aepName $aepName ` + -assetName $assetName ` + -datapointName $datapointName ` + -monitorExpresion ` + "& (Join-Path -Path $PSScriptRoot -ChildPath `"Start-MqttListener.ps1`") -listenTopics $aioConnectorsNamespace/data/$assetName/#" diff --git a/samples/media-connector-invoke-test/Invoke-TestStreamToRtspAutostart.ps1 b/samples/media-connector-invoke-test/Invoke-TestStreamToRtspAutostart.ps1 new file mode 100644 index 0000000..37acd74 --- /dev/null +++ b/samples/media-connector-invoke-test/Invoke-TestStreamToRtspAutostart.ps1 @@ -0,0 +1,21 @@ +#Requires -Version 7 + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$aepName = "aep-public-http-anonymous-1" +Write-Host "AEP name: $aepName" + +$assetName = "asset-public-http-anonymous-1-stream-to-rtsp-autostart" +Write-Host "Asset name: $assetName" + +$datapointName = "stream-to-rtsp" +Write-Host "Datapoint name: $datapointName" + +. (Join-Path -Path $PSScriptRoot -ChildPath "Invoke-ResourceInstallMonitorAndUninstall.ps1") ` + -aepName $aepName ` + -assetName $assetName ` + -datapointName $datapointName ` + -monitorExpresion ` + "& (Join-Path -Path $PSScriptRoot -ChildPath `"Start-RtspStreamViewer.ps1`") -assetName $assetName ; ` + try { Write-Host `"`nHit Ctrl+C to terminate`" ; Start-Sleep -Seconds 3600 } finally { Write-Host `"`nContinuing...`n`" }" diff --git a/samples/media-connector-invoke-test/Overview.md b/samples/media-connector-invoke-test/Overview.md new file mode 100644 index 0000000..7577bd7 --- /dev/null +++ b/samples/media-connector-invoke-test/Overview.md @@ -0,0 +1,29 @@ +# What is the media connector? + +The media connector makes media from media sources such as edge attached cameras available to other Azure IoT Operations components. The media connector is secure, performant, and can connect to the following media sources: + +| Media source | Example URLs | Notes | +|--------------| ---------------|-------| +| Edge attached camera | `file://host/dev/video0`
`file://host/dev/usb0` | No authentication required. The URL refers to the device file. Connects to a node using USB, FireWire, MIPI, or proprietary interface. | +| IP camera | `rtsp://192.168.178.45:554/stream1` | JPEG over HTTP for snapshots, RTSP/RTCP/RTP/MJPEG-TS for video streams. An IP camera might also expose a standard ONVIF control interface. | +| Media server | `rtsp://192.168.178.45:554/stream1` | JPEG over HTTP for snapshots, RTSP/RTCP/RTP/MJPEG-TS for video streams. A media server can also serve images and videos using URLs such as `ftp://host/path` or `smb://host/path` | +| Media file | `http://camera1/snapshot/profile1`
`nfs://server/path/file.extension`
` file://localhost/media/path/file.mkv` | Any media file with a URL accessible from the cluster. | +| Media folder | `file://host/path/to/folder/`
`ftp://server/path/to/folder/` | A folder, accessible from the cluster, that contain media files such as snapshots or clips. | + +Example uses of the media connector include: + +- Capture snapshots from a video stream or from an image URL and publish them to an MQTT topic. A subscriber to the MQTT topic can use the captured images for further processing or analysis. + +- Save video streams to a local file system on your cluster. [Edge Storage Accelerator](https://learn.microsoft.com/azure/azure-arc/edge-storage-accelerator/) can provide a reliable and fault-tolerant solution for uploading the captured video to the cloud for storage or processing. + +- Proxy a live video stream from a camera to an endpoint that an operator can access. For security and performance reasons, only the media connector should have direct access to an edge camera. The media connector uses a separate media server component to stream video to an operator's endpoint. This media server can transcode to a variety of protocols such as RTSP, RTCP, SRT, and HLS. + +## How does it relate to Azure IoT Operations? + +The media connector component is part of Azure IoT Operations. The connector deploys to an Arc-enabled Kubernetes cluster on the edge as part of an Azure IoT Operations deployment. The connector interacts with other Azure IoT Operations elements, such as: + +- _Asset endpoints_, which are custom resources in your Kubernetes cluster that define connections to resources such as cameras. An asset endpoint configuration includes the URL of the media source, the type of media source, and any credentials that are needed to access the media source. The media connector uses an asset endpoint to access the media source. + +- _Assets_, which in Azure IoT Operations Preview are logical entities that you create to represent a real assets such as cameras. An Azure IoT Operations camera asset can have properties, tags, and video streams. + +- The Azure IoT Operations portal, which is a web UI that provides a unified experience for you to manage assets such as cameras. You can use the portal to configure the assets and asset endpoints that the media connector uses to access media sources. diff --git a/samples/media-connector-invoke-test/README.md b/samples/media-connector-invoke-test/README.md index 113becf..0e38f32 100644 --- a/samples/media-connector-invoke-test/README.md +++ b/samples/media-connector-invoke-test/README.md @@ -1,8 +1,102 @@ -# Azure IoT Operations (AIO) Media Connector Demo - -> [!NOTE] -> Ensure you're using Azure IoT Operations version 1.0.0a3 or later before moving forward. +# Azure IoT Operations media connector demo ## Introduction -This collection consists of .yaml files that could be utilized by the sample commands found in the introductory document. \ No newline at end of file +This document describes the Azure IoT Operations media connector demo package. + +The Azure IoT Operations media connector is part of the Azure IoT Operations platform: + +- It is designed to be secure, scalable and fault-tolerant. +- It is responsible for the ingestion, storage, and distribution of media content. +- It takes care of the management of media metadata and the generation of media thumbnails. + +## Demo environment diagram + +The demo environment consists of the following components: + +![Demo environment diagram](media-connector-demo.png) + +The dotted lines represent connections and components that are possible but not show in the demo package. + +## Getting started + +1. The scripts are designed to run on PowerShell 7 or newer. + - You can test if you have the necessary prerequisites by running `Test-Prerequisites.ps1`. + - The *Installation of prerequisites* section below has useful relevant information. + - This demo folder should be in a path without spaces. +1. [Deploy Azure IoT Operations](https://aka.ms/getAzure IoT Operations). + - The Azure IoT Operations Kubernetes cluster should be configured as the `kubectl` current context. +1. Upgrade the public preview components by running the script `Update-Azure IoT OperationsMediaConnector.ps1` in the `update-Azure IoT Operations/` folder. +1. Install the media server using the files in the `media-server/` folder. +1. You should have a listener without TLS configured on port 1883. + - You can verify by calling the `Update-Azure IoT OperationsMqEndpointFile.ps1` script. + - You can use the files under `broker-listener/` to deploy this. +1. Then you can run each of the test scripts `Invoke-Test*.ps1` to run different test scenarios: + - `Invoke-TestSnapshotToMqttAutostart.ps1` takes snapshots from the demo stream and publishes them to the MQTT broker. + - `Invoke-TestSnapshotToFsAutostart.ps1` takes snapshots from the demo stream and writes them as files to the file system. + - `Invoke-TestClipToFsAutostart.ps1` creates clips at regular intervals from the demo stream and writes them as files to the file system. + - `Invoke-TestStreamToRtspAutostart.ps1` pushes the demo stream to a media server, from where it can be retrieved. + + The scripts deploy the endpoint and asset and monitors their activity. Use `Ctrl+C` to end the monitoring, remove the endpoint and asset and terminate the script. + +## Installation of prerequisites + +To install the prerequisites you can follow the instructions below. + +These might not be the preferred installation procedure for your system and IT environment. + +Check with your administrator before installing tools. + +### Windows + +Run these commands from the command line: + +`winget install -e --id Microsoft.PowerShell` +`winget install -e --id Kubernetes.kubectl` +`winget install -e --id Microsoft.AzureCLI` +`winget install -e --id Helm.Helm` +`winget install -e --id EclipseFoundation.Mosquitto` + +You might need to add `C:\Program Files\mosquitto` and `helm.exe` to your PATH. + +### Ubuntu GNU/Linux + +Follow the official documentation to install: +- [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/install-ubuntu) +- [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux) +- [Helm](https://helm.sh/docs/intro/install/) +- kubectl(depends on your system) + +You can install the mosquitto clients by running: +`sudo apt install mosquitto-clients` + +## Changes since Azure IoT Operations public preview + +- Additional test scripts have been added to demonstrate the capabilities of the Azure IoT Operations media connector. +- Now using PowerShell scripts instead of Polyglot notebooks. + +## Limitations + +The Azure IoT Operations media connector has the following limitations: + +- No discovery, this will be implemented by the ONVIF connector, currently under development. +- Limits on the number of concurrent connections and the file system use are not enforced. +- Performance and footprint are not optimized. +- The mRPC API is not publicly documented yet and is subject to change. + +## Description of package contents: + +- **README.md**: This file. +- **Overview.md**: General information about Azure IoT Operations and the Azure IoT Operations media connector. +- **media-connector-demo.mermaid and produced .png and .svg**: Diagram of the demo environment. +- **Broker listener (broker-listener/)**: This folder contains PowerShell scripts and kuberentes resources that show how to deploy an open (non-TLS) listener for MQ. +- **Media Server (media-server/)**: This folder contains scripts and yaml files that demonstrates how to deploy a media server in a kubernetes cluster. +- **resources/aep-*.yaml**: Example Asset Endpoint Profiles (AEPs) that can be used to configure the media connector. +- **resources/asset-*.yaml**: Example assets that can be used to configure the media connector. +- **Install-ResourceFile.ps1**: This PowerShell script installs a kubernetes resource file for the Azure IoT Operations media connector. +- **Uninstall-ResourceFile.ps1**: This PowerShell script uninstalls a kubernetes resource file for the Azure IoT Operations media connector. +- **Invoke-Test*.ps1**: These PowerShell scripts run different test scenarios for the Azure IoT Operations media connector. +- **Start-InteractiveSession.ps1**: This PowerShell script starts an interactive session in the Azure IoT Operations media connector container. +- **Start-MqttListener.ps1**: This PowerShell script starts an MQTT listener on the Azure IoT Operations MQTT broker. +- **Start-FileSystemMonitor.ps1**: This PowerShell script start monitoring for file changes on the Azure IoT Operations media connector container. +- **Start-RtspStreamViewer.ps1**: This PowerShell script start the default browser to look at streaming RTPS from the default media server. diff --git a/samples/media-connector-invoke-test/Start-FileSystemMonitor.ps1 b/samples/media-connector-invoke-test/Start-FileSystemMonitor.ps1 new file mode 100644 index 0000000..599531a --- /dev/null +++ b/samples/media-connector-invoke-test/Start-FileSystemMonitor.ps1 @@ -0,0 +1,50 @@ +#Requires -Version 7 +<# + Start a file monitor session in the AIO Media Connector pod. +#> +param ( + [Parameter( + HelpMessage="The path to monitor.")] + [string]$pathToMonitor = "" +) + +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +. (Join-Path $PSScriptRoot "Test-Prerequisites.ps1") + +$aioNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_namespace") -Raw).Trim() +Write-Host "AIO namespace: $aioNamespace" + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +If ($pathToMonitor -eq "") { + $pathToMonitor = "/tmp/${aioNamespace}" +} +Write-Host "Path to monitor: $pathToMonitor" + +$podName = (kubectl get pods -n $aioConnectorsNamespace -l app.kubernetes.io/component=aio-opc-media-1 --output=jsonpath='{.items[*].metadata.name}') +if ($null -eq $podName) { + Write-Host "No pod found" + Exit 1 +} +Write-Host "Pod name: $podName" + +try { + Write-Host "Checking if inotifywait is installed..." + $iNotifyWaitPath = "/usr/bin/inotifywait" + $commandString = "kubectl exec --stdin --tty $podName -n $aioConnectorsNamespace -- ls ${iNotifyWaitPath}" + $result = Invoke-Expression "${commandString}" + If ($result -eq $iNotifyWaitPath) { + Write-Host "Starting the file system monitor based on inotifywait..." + $commandString = "kubectl exec --stdin --tty $podName -n $aioConnectorsNamespace -- inotifywait -m -r -e create -e delete -e modify --timefmt `"%Y-%m-%d %H:%M:%S`" --format `"[%T] [%e] [%w] [%f]`" ${pathToMonitor}" + Invoke-Expression "${commandString}" + } Else { + Write-Host "inotifywait is not installed, pooling with find..." + $commandString = "kubectl exec --stdin --tty $podName -n $aioConnectorsNamespace -- sh -c `'while true ; do find ${pathToMonitor} -cmin 0.05 ; sleep 3 ; done `'" + Invoke-Expression "${commandString}" + } + +} finally { + Write-Host "`nThe file system monitor ended." +} diff --git a/samples/media-connector-invoke-test/Start-MqttListener.ps1 b/samples/media-connector-invoke-test/Start-MqttListener.ps1 new file mode 100644 index 0000000..88309f7 --- /dev/null +++ b/samples/media-connector-invoke-test/Start-MqttListener.ps1 @@ -0,0 +1,46 @@ +#Requires -Version 7 +<# + Start a an MQTT listener using mosquitto_sub. +#> +param ( + [Parameter( + HelpMessage="The listen topic.")] + [string[]]$listenTopics = @(), + [Parameter( + HelpMessage="The format string to be used to print messages.")] + [string]$printFormat = "Topic [%t], ID [%m], QoS [%q], Retain [%r], Size [%l]" +) + +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +. (Join-Path $PSScriptRoot "Test-Prerequisites.ps1") + +. (Join-Path $PSScriptRoot "Update-AioBrokerEndpointFile.ps1") + +$aioNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_namespace") -Raw).Trim() +Write-Host "AIO namespace: $aioNamespace" + +$aioMqHost = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_broker_host") -Raw).Trim() +Write-Host "AIO MQ host: $aioMqHost" + +$aioMqPort = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_broker_port") -Raw).Trim() +Write-Host "AIO MQ port: $aioMqPort" + +If ($listenTopics.Count -eq 0) { + $listenTopics = @("${aioNamespace}/#") +} +Write-Host "listenTopics: $listenTopics" + +Write-Host "printFormat: $printFormat" + +ForEach ($listenTopic in $listenTopics) { + $listenTopicParams += " -t `"${listenTopic}`" " +} + +try { + Write-Host "Starting the mosquitto_sub process..." + $commandString = "mosquitto_sub --host $aioMqHost --port $aioMqPort --verbose -V mqttv5 -F `"${printFormat}`" ${listenTopicParams}" + Invoke-Expression "${commandString}" +} finally { + Write-Host "`nThe mosquitto_sub process ended." +} diff --git a/samples/media-connector-invoke-test/Start-RtspStreamViewer.ps1 b/samples/media-connector-invoke-test/Start-RtspStreamViewer.ps1 new file mode 100644 index 0000000..dc265aa --- /dev/null +++ b/samples/media-connector-invoke-test/Start-RtspStreamViewer.ps1 @@ -0,0 +1,63 @@ +#Requires -Version 7 +<# + Start the default browser to watch an RTPS stream from the media server. +#> +param ( + [Parameter( + Mandatory, + HelpMessage="The asset name.")] + [string]$assetName = "" +) + +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +. (Join-Path $PSScriptRoot "Test-Prerequisites.ps1") + +. (Join-Path $PSScriptRoot "Update-MediaServerConfigFiles.ps1") + +$aioNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_namespace") -Raw).Trim() +Write-Host "AIO namespace: $aioNamespace" + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$mediaServer = (Get-Content -Path (Join-Path $PSScriptRoot ".config_media_server_host") -Raw).Trim() +Write-Host "Media Server: $mediaServer" + +Write-Host "Asset Name: $assetName" + +$streamUrl = "http://${mediaServer}:8888/${aioConnectorsNamespace}/data/${assetName}/" +Write-Host "Stream URL: $streamUrl" + +Write-Host "Showing the RTSP stream from the media server in the default browser..." + +if ($PSVersionTable.PSEdition -eq "Core") { + # Check if the script is running on Windows + If ([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform([System.Runtime.InteropServices.OSPlatform]::Windows)) { + Write-Host "Running on Windows" + . start $streamUrl + } + # Check if the script is running on Linux + ElseIf ([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform([System.Runtime.InteropServices.OSPlatform]::Linux)) { + Write-Host "Running on Linux" + If (Test-Path -Path env:WSL_DISTRO_NAME) { + Write-Host "Running on WSL" + . wslview $streamUrl + } Else { + Write-Host "Not running on WSL" + . xdg-open $streamUrl + } + } + # Check if the script is running on macOS + ElseIf ([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform([System.Runtime.InteropServices.OSPlatform]::OSX)) { + Write-Host "Running on macOS" + + Throw 'Error: macOS is not (yet) supported.`n' + } Else { + Write-Host "Unknown platform" + + Throw 'Error: Unknown platform.`n' + } +} else { + Write-Host "This script requires PowerShell Core" +} diff --git a/samples/media-connector-invoke-test/Test-Prerequisites.ps1 b/samples/media-connector-invoke-test/Test-Prerequisites.ps1 new file mode 100644 index 0000000..898c5b5 --- /dev/null +++ b/samples/media-connector-invoke-test/Test-Prerequisites.ps1 @@ -0,0 +1,52 @@ +#Requires -Version 7 +<# + Testing the prerequisites for the scripts in this package. +#> + +Write-Host "Testing the prerequisites..." + +If ($PSScriptRoot -match " ") { + Throw "Error: The script path contains spaces." + Exit 1 +} Else { + Write-Host "The script path does not contain spaces!" +} + +Write-Host "Checking for kubectl..." +If (-not (Get-Command -Name "kubectl" -ErrorAction SilentlyContinue)) { + Throw "Error: kubectl not found, make sure it is installed and accessible." + Exit 1 +} Else { + Write-Host "kubectl found!" +} + +Write-Host "Checking for mosquitto_pub..." +If (-not (Get-Command -Name "mosquitto_pub" -ErrorAction SilentlyContinue)) { + Throw "Error: mosquitto_pub not found, make sure it is installed and accessible." + Exit 1 +} Else { + Write-Host "mosquitto_pub found!" +} + +Write-Host "Checking for mosquitto_sub..." +If (-not (Get-Command -Name "mosquitto_sub" -ErrorAction SilentlyContinue)) { + Throw "Error: mosquitto_sub not found, make sure it is installed and accessible." + Exit 1 +} Else { + Write-Host "mosquitto_sub found!" +} + +Write-Host "Checking if a default cluster is configured..." +# Define the command to get the current kubectl context +$kubectlContextCommand = "kubectl config current-context" +# Execute the command and capture the output +$currentContext = Invoke-Expression $kubectlContextCommand +# Check if the output is empty +if ([string]::IsNullOrWhiteSpace($currentContext)) { + Throw "No Kubernetes cluster is currently configured." + Exit 1 +} else { + Write-Host "Current Kubernetes context: $currentContext" +} + +Write-Host "Prerequisites are met!`n" diff --git a/samples/media-connector-invoke-test/Uninstall-ResourceFile.ps1 b/samples/media-connector-invoke-test/Uninstall-ResourceFile.ps1 new file mode 100644 index 0000000..55cad75 --- /dev/null +++ b/samples/media-connector-invoke-test/Uninstall-ResourceFile.ps1 @@ -0,0 +1,34 @@ +#Requires -Version 7 +<# + Uninstall a resource file. +#> +param ( + [Parameter( + Mandatory=$true, + HelpMessage="The resource file.")] + [string]$resourceFile +) + +Write-Host "`n" +Write-Host (Split-Path -Path $PSCommandPath -Leaf).ToUpper() -ForegroundColor White + +$aioConnectorsNamespace = (Get-Content -Path (Join-Path $PSScriptRoot ".config_aio_connectors_namespace") -Raw).Trim() +Write-Host "AIO connectors namespace: $aioConnectorsNamespace" + +$resourcesDirectory = (Get-Content -Path (Join-Path $PSScriptRoot ".config_resources_path") -Raw).Trim() +$resourcesDirectory = $ExecutionContext.InvokeCommand.ExpandString(${resourcesDirectory}) +Write-Host "Resources directory: $resourcesDirectory" + +Write-Host "Resource file: $resourceFile" + +$fileFullPath=(Join-Path $resourcesDirectory $resourceFile) +Write-Host "Resource file full path: ${fileFullPath}" + +Write-Host "Deleteing the resource..." +. kubectl delete -n ${aioConnectorsNamespace} -f ${fileFullPath} +If ($LastExitCode -ne 0) { + Write-Host "Error: The resource could not be applied." + Exit $LastExitCode +} Else { + Write-Host "The resource was deleted successfully.`n" +} diff --git a/samples/media-connector-invoke-test/Update-AioBrokerEndpointFile.ps1 b/samples/media-connector-invoke-test/Update-AioBrokerEndpointFile.ps1 new file mode 100644 index 0000000..5afe992 --- /dev/null +++ b/samples/media-connector-invoke-test/Update-AioBrokerEndpointFile.ps1 @@ -0,0 +1,78 @@ +#Requires -Version 7 +<# + Update the AIO Broker endpoint file. +#> + +$aioNamespace = (Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath .config_aio_namespace) -Raw).Trim() +Write-Host "AIO connectors namespace: ${aioNamespace}" + +$aioMqPort=1883 # Default MQTT port + +Function Detect-Broker { + Param ( + [string]$serviceName + ) + + Write-Host "Detecting the AIO Broker endpoint with service name $serviceName..." + + $aioMqEndpointIp=(kubectl get service $serviceName ` + --namespace ${aioNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].ip}') + If (${aioMqEndpointIp}) { + Write-Host "AIO Broker endpoint IP: ${aioMqEndpointIp}" + + $aioMqPort=(kubectl get service $serviceName ` + --namespace ${aioNamespace} ` + --output jsonpath='{.spec.ports[0].port}') + Write-Host "AIO Broker port: ${aioMqPort}" + + $aioMqEndpoint="mqtt://${aioMqEndpointIp}:${aioMqPort}" + $aioMqHost=$aioMqEndpointIp + } Else { + $aioMqEndpointHostname=(kubectl get service $serviceName ` + --namespace ${aioNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].hostname}') + If (${aioMqEndpointHostname}) { + Write-Host "AIO Broker endpoint hostname: ${aioMqEndpointHostname}" + + $aioMqPort=(kubectl get service $serviceName ` + --namespace ${aioNamespace} ` + --output jsonpath='{.spec.ports[0].port}') + + $aioMqEndpoint="mqtt://${aioMqEndpointHostname}:${aioMqPort}" + $aioMqHost=$aioMqEndpointHostname + } + } +} + +$endpointNames = @( + "aio-broker", + "aio-broker-listener-non-tls", + "aio-broker-notls" +) + +ForEach ($endpointName in $endpointNames) { + + . Detect-Broker -serviceName $endpointName + + If (${aioMqEndpointIp} -or ${aioMqEndpointHostname}) { + Write-Host "AIO Broker endpoint detected!" + Break + } +} + +If (-not ${aioMqEndpointIp} -and -not ${aioMqEndpointHostname}) { + Throw "Failed to detect the AIO Broker endpoint." + Exit 1 +} + +Write-Host "AIO Broker endpoint: ${aioMqEndpoint}" +Out-File -FilePath (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_broker_endpoint") -InputObject $aioMqEndpoint -NoNewline + +Write-Host "AIO Broker host: ${aioMqHost}" +Out-File -FilePath (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_broker_host") -InputObject $aioMqHost -NoNewline + +Write-Host "AIO Broker port: ${aioMqPort}" +Out-File -FilePath (Join-Path -Path $PSScriptRoot -ChildPath ".config_aio_broker_port") -InputObject $aioMqPort -NoNewline + +Write-Host "Done!`n" diff --git a/samples/media-connector-invoke-test/Update-MediaServerConfigFiles.ps1 b/samples/media-connector-invoke-test/Update-MediaServerConfigFiles.ps1 new file mode 100644 index 0000000..4ff18a1 --- /dev/null +++ b/samples/media-connector-invoke-test/Update-MediaServerConfigFiles.ps1 @@ -0,0 +1,32 @@ +#Requires -Version 7 +<# + Update the Media Server config files. +#> + +$mediaServerNamespace="media-server" + +Write-Host "Detecting the Media Server endpoint..." +$mediaServerEndpointIp=(kubectl get service media-server-public ` + --namespace ${mediaServerNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].ip}') +If (${mediaServerEndpointIp}) { + Write-Host "Media Server endpoint IP: ${mediaServerEndpointIp}" + $mediaServerHost=$mediaServerEndpointIp +} Else { + $mediaServerEndpointHostname=(kubectl get service media-server-public ` + --namespace ${mediaServerNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].hostname}') + If (${mediaServerEndpointHostname}) { + Write-Host "Media Server endpoint hostname: ${mediaServerEndpointHostname}" + $mediaServerHost=$mediaServerEndpointHostname + } +} +If (-not ${mediaServerEndpointIp} -and -not ${mediaServerEndpointHostname}) { + Write-Host "Failed to detect the Media Server endpoint. Exiting..." + Exit 1 +} + +Write-Host "Media Server host: ${mediaServerHost}" +Out-File -FilePath (Join-Path -Path $PSScriptRoot -ChildPath ".config_media_server_host") -InputObject $mediaServerHost -NoNewline + +Write-Host "Done!`n" diff --git a/samples/media-connector-invoke-test/broker-listener/Install-BrokerListener.ps1 b/samples/media-connector-invoke-test/broker-listener/Install-BrokerListener.ps1 new file mode 100644 index 0000000..2953b53 --- /dev/null +++ b/samples/media-connector-invoke-test/broker-listener/Install-BrokerListener.ps1 @@ -0,0 +1,19 @@ +<# +.SYNOPSIS + Deploy an open (non-TLS) broker listener into the default Kubernetes cluster. +.DESCRIPTION + This PowerShell script deploys an open (non-TLS) broker listener into the default Kubernetes cluster using kubectl. +.LINK + https://azure.com/ +.NOTES + (c) 2024 Microsoft Corporation. All rights reserved. + Author: andrejm@microsoft.com +#> + +try { + & kubectl apply -f broker-listener.yaml --validate=false + exit 0 # success +} catch { + "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" + exit 1 +} diff --git a/samples/media-connector-invoke-test/broker-listener/Uninstall-BrokerListener.ps1 b/samples/media-connector-invoke-test/broker-listener/Uninstall-BrokerListener.ps1 new file mode 100644 index 0000000..d84c64f --- /dev/null +++ b/samples/media-connector-invoke-test/broker-listener/Uninstall-BrokerListener.ps1 @@ -0,0 +1,19 @@ +<# +.SYNOPSIS + Deletes an open (non-TLS) broker listener from the default Kubernetes cluster. +.DESCRIPTION + This PowerShell script deletes an open (non-TLS) broker listener from the default Kubernetes cluster using kubectl. +.LINK + https://azure.com/ +.NOTES + (c) 2024 Microsoft Corporation. All rights reserved. + Author: andrejm@microsoft.com +#> + +try { + & kubectl delete -f broker-listener.yaml + exit 0 # success +} catch { + "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" + exit 1 +} diff --git a/samples/media-connector-invoke-test/broker-listener/broker-listener.yaml b/samples/media-connector-invoke-test/broker-listener/broker-listener.yaml new file mode 100644 index 0000000..9f92e45 --- /dev/null +++ b/samples/media-connector-invoke-test/broker-listener/broker-listener.yaml @@ -0,0 +1,24 @@ +apiVersion: mqttbroker.iotoperations.azure.com/v1 +kind: BrokerListener +metadata: + name: aio-broker-notls + namespace: azure-iot-operations +spec: + brokerRef: default + serviceType: LoadBalancer + ports: + - port: 1883 + protocol: Mqtt + +--- + +apiVersion: v1 +kind: Service +metadata: + name: aio-broker-notls + namespace: azure-iot-operations +spec: + type: LoadBalancer + ports: + - port: 1883 + targetPort: 1883 diff --git a/samples/media-connector-invoke-test/media-connector-demo.png b/samples/media-connector-invoke-test/media-connector-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b145ce6d8f93956aface21de351a486a544da7 GIT binary patch literal 132512 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

vHslL`+lpE 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

3Z`l-Haaa0ce?r=ZjMyMyU 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 z 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

Azure
AIO
Azure Cloud
RTSP
HTTP
RTSP, RTCP, MPEG-TS, ...
RTSP, RTCP, MPEG-TS, SRT, ...
RTSP, RTCP, MPEG-TS, SRT, ...
HTTP/HTTPS
Snapshots
Files
Clips
Files
Telemetry
Snapshots
Messages
Streams
RTSP
HLS
RTSP, RTCP, SRT, HLS
RTSP, RTCP, SRT
HLS
Files
Files
RTSP
Video Indexer Edge
Fabric
Azure Storage
Video Indexer Cloud
Media Connector
File System and/or Volume
Edge Storage Accelerator
Broker
TinyKube
Example AEP/Asset
Camera
Media Source
Media Server - Server
Media Pusher
Web Server
VLC
FFplay
Web Browser
\ No newline at end of file diff --git a/samples/media-connector-invoke-test/media-server/Install-MediaServer.ps1 b/samples/media-connector-invoke-test/media-server/Install-MediaServer.ps1 new file mode 100644 index 0000000..e66667b --- /dev/null +++ b/samples/media-connector-invoke-test/media-server/Install-MediaServer.ps1 @@ -0,0 +1,28 @@ +<# +.SYNOPSIS + Deploy MediaMTX into the default Kubernetes cluster. +.DESCRIPTION + This PowerShell script deploys MediaMTX into the default Kubernetes cluster using kubectl. +.EXAMPLE + PS> ./media-server-deploy.ps1 + namespace/media-server created + deployment.apps/media-server created + service/media-server created + service/media-server-public created +.LINK + https://azure.com/ +.NOTES + (c) 2024 Microsoft Corporation. All rights reserved. + Author: andrejm@microsoft.com +#> + +try { + & kubectl create namespace media-server --dry-run=client -o yaml | kubectl apply -f - + & kubectl apply -f media-server-deployment.yaml --validate=false + & kubectl apply -f media-server-service.yaml --validate=false + & kubectl apply -f media-server-service-public.yaml --validate=false + exit 0 # success +} catch { + "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" + exit 1 +} diff --git a/samples/media-connector-invoke-test/media-server/README.md b/samples/media-connector-invoke-test/media-server/README.md new file mode 100644 index 0000000..ea9faf8 --- /dev/null +++ b/samples/media-connector-invoke-test/media-server/README.md @@ -0,0 +1,17 @@ +The scripts in this directory help in installing, uninstalling, and managing a media server. + +The scripts are written in PowerShell and use the kubectl to interact with the cluster. + +The scripts are designed to be run on Windows and Linux. + +## Prerequisites + +- [kubectl](installation instructions: https://kubernetes.io/docs/tasks/tools/install-kubectl/) + +## Usage + +1. Open a PowerShell terminal. +2. Check the prerequisites: `pwsh Test-Prerequisites.ps1`. +3. Install the Media Server: `pwsh Install-MediaServer.ps1` +4. Check the Media Server after installation: `pwsh Test-MediaServer.ps1` +5. When you are done, uninstall the Media Server: `pwsh Uninstall-MediaServer.ps1` diff --git a/samples/media-connector-invoke-test/media-server/Test-MediaServer.ps1 b/samples/media-connector-invoke-test/media-server/Test-MediaServer.ps1 new file mode 100644 index 0000000..b899dc8 --- /dev/null +++ b/samples/media-connector-invoke-test/media-server/Test-MediaServer.ps1 @@ -0,0 +1,24 @@ +$mediaServerNamespace="media-server" + +Write-Host "Detecting the Media Server endpoint..." +$mediaServerEndpointIp=(kubectl get service media-server-public ` + --namespace ${mediaServerNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].ip}') +If (${mediaServerEndpointIp}) { + Write-Host "Media Server endpoint IP: ${mediaServerEndpointIp}" + $mediaServerHost=$mediaServerEndpointIp +} Else { + $mediaServerEndpointHostname=(kubectl get service media-server-public ` + --namespace ${mediaServerNamespace} ` + --output jsonpath='{.status.loadBalancer.ingress[0].hostname}') + If (${mediaServerEndpointHostname}) { + Write-Host "Media Server endpoint hostname: ${mediaServerEndpointHostname}" + $mediaServerHost=$mediaServerEndpointHostname + } +} +If (-not ${mediaServerEndpointIp} -and -not ${mediaServerEndpointHostname}) { + Write-Host "Failed to detect the Media Server endpoint. Exiting..." + Exit 1 +} + +Write-Host "Media Server detected, host: ${mediaServerHost}" diff --git a/samples/media-connector-invoke-test/media-server/Test-Prerequisites.ps1 b/samples/media-connector-invoke-test/media-server/Test-Prerequisites.ps1 new file mode 100644 index 0000000..e571923 --- /dev/null +++ b/samples/media-connector-invoke-test/media-server/Test-Prerequisites.ps1 @@ -0,0 +1,11 @@ +Write-Host "Testing the prerequisites..." + +Write-Host "Checking for kubectl..." +If (-not (Get-Command -Name "kubectl" -ErrorAction SilentlyContinue)) { + Write-Host "Error: kubectl not found, make sure it is installed and accessible" + Exit 1 +} Else { + Write-Host "kubectl found!" +} + +Write-Host "Done!`n" diff --git a/samples/media-connector-invoke-test/media-server/Uninstall-MediaServer.ps1 b/samples/media-connector-invoke-test/media-server/Uninstall-MediaServer.ps1 new file mode 100644 index 0000000..4ab5ac3 --- /dev/null +++ b/samples/media-connector-invoke-test/media-server/Uninstall-MediaServer.ps1 @@ -0,0 +1,24 @@ +<# +.SYNOPSIS + Deploy MediaMTX into the default Kubernetes cluster. +.DESCRIPTION + This PowerShell script deploys MediaMTX into the default Kubernetes cluster using kubectl. +.EXAMPLE + PS> ./media-server-delete.ps1 +.LINK + https://azure.com/ +.NOTES + (c) 2024 Microsoft Corporation. All rights reserved. + Author: andrejm@microsoft.com +#> + +try { + & kubectl delete -f media-server-service-public.yaml + & kubectl delete -f media-server-service.yaml + & kubectl delete -f media-server-deployment.yaml + & kubectl delete namespace media-server + exit 0 # success +} catch { + "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" + exit 1 +} diff --git a/samples/media-connector-invoke-test/resources/aep-public-http-anonymous-1.yaml b/samples/media-connector-invoke-test/resources/aep-public-http-anonymous-1.yaml index 1d4ac3a..be53dea 100644 --- a/samples/media-connector-invoke-test/resources/aep-public-http-anonymous-1.yaml +++ b/samples/media-connector-invoke-test/resources/aep-public-http-anonymous-1.yaml @@ -7,7 +7,7 @@ spec: { "$schema": "https://aiobrokers.blob.core.windows.net/aio-media-connector/1.0.0.json" } - endpointProfileType: Media + endpointProfileType: Microsoft.Media targetAddress: http://s7d2.scene7.com/is/content/microsoftcorp/CLO24-Azure-Retail-16x9 authentication: method: Anonymous diff --git a/samples/media-connector-invoke-test/resources/aep-public-https-anonymous-1.yaml b/samples/media-connector-invoke-test/resources/aep-public-https-anonymous-1.yaml index e2d799d..c822333 100644 --- a/samples/media-connector-invoke-test/resources/aep-public-https-anonymous-1.yaml +++ b/samples/media-connector-invoke-test/resources/aep-public-https-anonymous-1.yaml @@ -7,7 +7,7 @@ spec: { "$schema": "https://aiobrokers.blob.core.windows.net/aio-media-connector/1.0.0.json" } - endpointProfileType: Media + endpointProfileType: Microsoft.Media targetAddress: https://s7d2.scene7.com/is/content/microsoftcorp/CLO24-Azure-Retail-16x9 authentication: method: Anonymous diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-autostart.yaml index 87c79b1..041d9af 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-clip-to-fs-autostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-noautostart.yaml index 0e5d18f..7c99d2f 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-fs-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-clip-to-fs-noautostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-autostart.yaml index 5c2e273..f057f8b 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-clip-to-mqtt-autostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-noautostart.yaml index 6acea54..072124f 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-clip-to-mqtt-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-clip-to-mqtt-noautostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-hls-to-fs-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-hls-to-fs-autostart.yaml new file mode 100644 index 0000000..3322858 --- /dev/null +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-hls-to-fs-autostart.yaml @@ -0,0 +1,20 @@ +apiVersion: deviceregistry.microsoft.com/v1 +kind: Asset +metadata: + name: asset-public-http-anonymous-1-hls-to-fs-autostart +spec: + assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true + datasets: + - name: dataset1 + dataPoints: + - name: hls-to-fs + dataSource: hls-to-fs + dataPointConfiguration: |- + { + "taskType": "hls-to-fs", + "autostart": true, + "realtime": true, + "loop": true, + "duration": 3 + } diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-autostart.yaml index 883e6ac..047e6c5 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-snapshot-to-fs-autostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-noautostart.yaml index 014f401..a714aa3 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-fs-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-snapshot-to-fs-noautostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-autostart.yaml index da6fe69..11f724c 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-snapshot-to-mqtt-autostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-noautostart.yaml index ffa7968..e45c562 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-snapshot-to-mqtt-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-snapshot-to-mqtt-noautostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-autostart.yaml index e48fc4f..8886f2b 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-stream-to-rtsp-autostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-noautostart.yaml index 9ab60c5..7ea765e 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-http-anonymous-1-stream-to-rtsp-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-http-anonymous-1-stream-to-rtsp-noautostart spec: assetEndpointProfileRef: aep-public-http-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-autostart.yaml index 5d2d823..00b143b 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-clip-to-fs-autostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-noautostart.yaml index 34092ca..b6d68e4 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-fs-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-clip-to-fs-noautostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-autostart.yaml index 58b4f9e..5083757 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-clip-to-mqtt-autostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-noautostart.yaml index 0bede92..4caaba2 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-clip-to-mqtt-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-clip-to-mqtt-noautostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-autostart.yaml index 6597fd1..eb6e5e2 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-snapshot-to-fs-autostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-noautostart.yaml index 761dc32..4de000a 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-fs-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-snapshot-to-fs-noautostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-autostart.yaml index 437d904..6a62ba7 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-snapshot-to-mqtt-autostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-noautostart.yaml index 5578e54..29ba736 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-snapshot-to-mqtt-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-snapshot-to-mqtt-noautostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-autostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-autostart.yaml index 8d768de..994aa06 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-autostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-autostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-stream-to-rtsp-autostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-noautostart.yaml b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-noautostart.yaml index 14600ba..df8bd09 100644 --- a/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-noautostart.yaml +++ b/samples/media-connector-invoke-test/resources/asset-public-https-anonymous-1-stream-to-rtsp-noautostart.yaml @@ -4,6 +4,7 @@ metadata: name: asset-public-https-anonymous-1-stream-to-rtsp-noautostart spec: assetEndpointProfileRef: aep-public-https-anonymous-1 + enabled: true datasets: - name: dataset1 dataPoints: diff --git a/samples/media-connector-invoke-test/update-aio/Update-AioMediaConnector.ps1 b/samples/media-connector-invoke-test/update-aio/Update-AioMediaConnector.ps1 new file mode 100644 index 0000000..8af93f8 --- /dev/null +++ b/samples/media-connector-invoke-test/update-aio/Update-AioMediaConnector.ps1 @@ -0,0 +1,38 @@ +#Requires -Version 7 +<# + Uninstall a resource file. +#> +param ( + [Parameter( + Mandatory=$true, + HelpMessage="The cluster resource group.")] + [string]$clusterResourceGroup, + [Parameter( + Mandatory=$true, + HelpMessage="The cluster name.")] + [string]$clusterName, + [Parameter( + HelpMessage="The media connector version to use.")] + [string]$mediaConnectorVersion = "1.1.0" +) + +$extension = az k8s-extension list ` + --cluster-name $clusterName ` + --cluster-type connectedClusters ` + --resource-group $clusterResourceGroup ` + --query "[?extensionType == 'microsoft.iotoperations']" ` + | ConvertFrom-Json + +az k8s-extension update ` + --version $extension.version ` + --name $extension.name ` + --release-train $extension.releaseTrain ` + --cluster-name $clusterName ` + --resource-group $clusterResourceGroup ` + --cluster-type connectedClusters ` + --auto-upgrade-minor-version false ` + --config connectors.image.registry=mcr.microsoft.com ` + --config connectors.image.repository=aio-connectors/helmchart/microsoft-aio-connectors ` + --config connectors.image.tag=$mediaConnectorVersion ` + --config connectors.values.enablePreviewFeatures=true ` + --yes