Azure Media Services: Modificar las unidades reservadas para streaming desde .NET

Con el fin de automatizar las unidades reservadas que estamos utilizando para el servicio de streaming, podemos hacer uso del siguiente código en C#:

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.Configuration;
using System.Linq;

namespace StreamingReservedUnits
{
    class Program
    {
        static void Main(string[] args)
        {
            //0.Nuget: Install-Package windowsazure.mediaservices 

            //1. Credentials
            var AccountName = ConfigurationManager.AppSettings["AccountName"];
            var AccountKey = ConfigurationManager.AppSettings["AccountKey"];

            //2. Get Context
            var context = new CloudMediaContext(AccountName, AccountKey);

            //3. Create tasks
            for (var index = 0; index < context.StreamingEndpoints.Count(); index++)
            {
                var endpoint = context.StreamingEndpoints.Skip(index).Take(1).FirstOrDefault();

                Console.WriteLine("Endpoint {0} has {1} units", endpoint.Name, endpoint.ScaleUnits);

                if (endpoint.State != StreamingEndpointState.Scaling)
                    endpoint.Scale(0);
            }

            Console.WriteLine("Streaming endpoint units off!");

            Console.ReadLine();
        }
    }
}

También está disponible el método asíncrono para esta acción, ScaleAsync, el cual podríamos usar de la siguiente manera:

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;

namespace StreamingReservedUnits
{
    class Program
    {
        static void Main(string[] args)
        {
            //0.Nuget: Install-Package windowsazure.mediaservices            

            //1. Credentials and constants
            var AccountName = ConfigurationManager.AppSettings["AccountName"];
            var AccountKey = ConfigurationManager.AppSettings["AccountKey"];
            var ReservedUnits = 0;

            //2. Get Context
            var context = new CloudMediaContext(AccountName, AccountKey);

            var task = new List<Task>();

            //3. Create tasks
            for (var index = 0; index < context.StreamingEndpoints.Count(); index++)
            {
                var endpoint = context.StreamingEndpoints.Skip(index).Take(1).FirstOrDefault();

                Console.WriteLine("Endpoint {0} has {1} units", endpoint.Name, endpoint.ScaleUnits);

                if (endpoint.State != StreamingEndpointState.Scaling)
                {
                    task.Add(endpoint.ScaleAsync(ReservedUnits));
                    Console.WriteLine("From {0} units to {1}", endpoint.ScaleUnits, ReservedUnits);
                }
            }

            Task.WaitAll(task.ToArray());

            Console.WriteLine("All endpoints updated!");

            Console.ReadLine();
        }
    }
}

Si además quisieramos que esta tarea se lanzara cada X tiempo podemos hacer uso de Azure WebJobs para facilitarnos el trabajo.

Gracias a Vito por pasarme la versión vintage del código. Sólo tuve que actualizarla 😉

¡Saludos!