Skip to content

Commit

Permalink
Clean-up DPS service group enrollment sample and related documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
David R. Williamson committed Jan 12, 2023
1 parent a2e9b75 commit ad393c8
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 88 deletions.
2 changes: 1 addition & 1 deletion azureiot.sln
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CleanupEnrollmentsSample",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnrollmentGroupSample", "provisioning\service\samples\getting started\EnrollmentGroupSample\EnrollmentGroupSample.csproj", "{EDE1FB8E-5BD4-49E7-9745-6599687D34CD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnrollmentSample", "provisioning\service\samples\getting started\EnrollmentSample\EnrollmentSample.csproj", "{C8639C47-5772-4E58-A5A1-9D4134577437}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IndividualEnrollmentSample", "provisioning\service\samples\getting started\EnrollmentSample\IndividualEnrollmentSample.csproj", "{C8639C47-5772-4E58-A5A1-9D4134577437}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "how to guides", "how to guides", "{E6205B13-D163-4247-80F5-905ACC7F0977}"
EndProject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,91 +3,88 @@

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
{
internal class EnrollmentGroupSample
{
private const string EnrollmentGroupId = "enrollmentgrouptest";
private static readonly string s_enrollmentGroupId = $"EnrollmentGroupSample-{Guid.NewGuid()}";
private readonly ProvisioningServiceClient _provisioningServiceClient;
private readonly X509Certificate2 _groupIssuerCertificate;

public EnrollmentGroupSample(ProvisioningServiceClient provisioningServiceClient, X509Certificate2 groupIssuerCertificate)
public EnrollmentGroupSample(ProvisioningServiceClient provisioningServiceClient)
{
_provisioningServiceClient = provisioningServiceClient;
_groupIssuerCertificate = groupIssuerCertificate;
}

public async Task RunSampleAsync()
{
await QueryEnrollmentGroupAsync().ConfigureAwait(false);
await CreateEnrollmentGroupAsync();
await GetEnrollmentGroupInfoAsync();
await QueryEnrollmentGroupAsync();
await DeleteEnrollmentGroupAsync();
}

public async Task CreateEnrollmentGroupAsync()
{
Console.WriteLine("Creating a new enrollment group...");
Attestation attestation = new SymmetricKeyAttestation(null, null); // let the service generate keys
var group = new EnrollmentGroup(s_enrollmentGroupId, attestation);

await CreateEnrollmentGroupAsync().ConfigureAwait(false);
await GetEnrollmentGroupInfoAsync().ConfigureAwait(false);
await DeleteEnrollmentGroupAsync().ConfigureAwait(false);
group = await _provisioningServiceClient.CreateOrUpdateEnrollmentGroupAsync(group);
Console.WriteLine($"Created {group.EnrollmentGroupId}: {JsonConvert.SerializeObject(group)}");
}

public async Task GetEnrollmentGroupInfoAsync()
{
Console.WriteLine("Getting the enrollment group information...");
EnrollmentGroup group = await _provisioningServiceClient.GetEnrollmentGroupAsync(s_enrollmentGroupId);
Console.WriteLine($"Got {group.EnrollmentGroupId}: {JsonConvert.SerializeObject(group)}");
}

public async Task QueryEnrollmentGroupAsync()
{
Console.WriteLine("\nCreating a query for enrollmentGroups...");
var querySpecification = new QuerySpecification("SELECT * FROM enrollmentGroups");
Console.WriteLine($"Running a query for enrollment groups: {querySpecification.Query}");
using Query query = _provisioningServiceClient.CreateEnrollmentGroupQuery(querySpecification);
while (query.HasNext())
{
Console.WriteLine("\nQuerying the next enrollmentGroups...");
QueryResult queryResult = await query.NextAsync().ConfigureAwait(false);
Console.WriteLine(queryResult);

QueryResult queryResult = await query.NextAsync();
foreach (EnrollmentGroup group in queryResult.Items.Cast<EnrollmentGroup>())
{
Console.WriteLine($"Found enrollment group {group.EnrollmentGroupId} is {group.ProvisioningStatus}.");
await EnumerateRegistrationsInGroupAsync(querySpecification, group);
}
}
}

private async Task EnumerateRegistrationsInGroupAsync(QuerySpecification querySpecification, EnrollmentGroup group)
{
Console.WriteLine($"\nCreating a query for registrations within group '{group.EnrollmentGroupId}'...");
using Query registrationQuery = _provisioningServiceClient.CreateEnrollmentGroupRegistrationStateQuery(querySpecification, group.EnrollmentGroupId);
Console.WriteLine($"\nQuerying the next registrations within group '{group.EnrollmentGroupId}'...");
while (registrationQuery.HasNext())
Console.WriteLine($"Registrations within group {group.EnrollmentGroupId}:");
using Query query = _provisioningServiceClient.CreateEnrollmentGroupRegistrationStateQuery(
querySpecification,
group.EnrollmentGroupId);

while (query.HasNext())
{
QueryResult registrationQueryResult = await registrationQuery.NextAsync();
Console.WriteLine(registrationQueryResult.ToString());
QueryResult queryResult = await query.NextAsync();
foreach (DeviceRegistrationState registration in queryResult.Items.Cast<DeviceRegistrationState>())
{
Console.WriteLine($"\t{registration.RegistrationId} for {registration.DeviceId} is {registration.Status}.");
if (registration.ErrorCode.HasValue)
{
Console.WriteLine($"\t\tWith error ({registration.ErrorCode.Value}: {registration.ErrorMessage}");
}
}
}
}

public async Task CreateEnrollmentGroupAsync()
{
Console.WriteLine("\nCreating a new enrollmentGroup...");
Attestation attestation = X509Attestation.CreateFromRootCertificates(_groupIssuerCertificate);
var enrollmentGroup =
new EnrollmentGroup(
EnrollmentGroupId,
attestation);
Console.WriteLine(enrollmentGroup);

Console.WriteLine("\nAdding new enrollmentGroup...");
EnrollmentGroup enrollmentGroupResult =
await _provisioningServiceClient.CreateOrUpdateEnrollmentGroupAsync(enrollmentGroup);
Console.WriteLine("\nEnrollmentGroup created with success.");
Console.WriteLine(enrollmentGroupResult);
}

public async Task GetEnrollmentGroupInfoAsync()
{
Console.WriteLine("\nGetting the enrollmentGroup information...");
EnrollmentGroup getResult =
await _provisioningServiceClient.GetEnrollmentGroupAsync(EnrollmentGroupId);
Console.WriteLine(getResult);
}

public async Task DeleteEnrollmentGroupAsync()
{
Console.WriteLine("\nDeleting the enrollmentGroup...");
await _provisioningServiceClient.DeleteEnrollmentGroupAsync(EnrollmentGroupId);
Console.WriteLine("Deleting the enrollmentGroup...");
await _provisioningServiceClient.DeleteEnrollmentGroupAsync(s_enrollmentGroupId);
Console.WriteLine($"Enrollment group {s_enrollmentGroupId} deleted.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,6 @@ namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
/// </summary>
internal class Parameters
{
[Option(
'p',
"CertificatePath",
Required = true,
HelpText = "The path to X509 certificate.")]
public string CertificatePath { get; set; }

[Option(
'c',
"ProvisioningConnectionString",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

using CommandLine;
using System;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
{
Expand All @@ -16,7 +16,7 @@ internal class Program
/// <param name="args">
/// Run with `--help` to see a list of required and optional parameters.
/// </param>
public static int Main(string[] args)
public static async Task Main(string[] args)
{
// Parse application parameters
Parameters parameters = null;
Expand All @@ -36,14 +36,11 @@ public static int Main(string[] args)
Environment.Exit(1);
}

var certificate = new X509Certificate2(parameters.CertificatePath);

using var provisioningServiceClient = ProvisioningServiceClient.CreateFromConnectionString(parameters.ProvisioningConnectionString);
var sample = new EnrollmentGroupSample(provisioningServiceClient, certificate);
sample.RunSampleAsync().GetAwaiter().GetResult();
var sample = new EnrollmentGroupSample(provisioningServiceClient);
await sample.RunSampleAsync();

Console.WriteLine("Done.\n");
return 0;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
{
internal class EnrollmentSample
internal class IndividualEnrollmentSample
{
private const string RegistrationId = "myvalid-registratioid-csharp";
private const string TpmEndorsementKey =
Expand All @@ -25,7 +25,7 @@ internal class EnrollmentSample

private readonly ProvisioningServiceClient _provisioningServiceClient;

public EnrollmentSample(ProvisioningServiceClient provisioningServiceClient)
public IndividualEnrollmentSample(ProvisioningServiceClient provisioningServiceClient)
{
_provisioningServiceClient = provisioningServiceClient;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>9.0</LangVersion>
</PropertyGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text;
using CommandLine.Text;
using CommandLine;
using Newtonsoft.Json;

namespace EnrollmentSample
namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
{
internal class Parameters
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Threading.Tasks;
using CommandLine;
using EnrollmentSample;

namespace Microsoft.Azure.Devices.Provisioning.Service.Samples
{
internal class Program
{
public static int Main(string[] args)
public static async Task Main(string[] args)
{
// Parse application parameters
Parameters parameters = null;
Expand All @@ -30,11 +30,10 @@ public static int Main(string[] args)
}

using var provisioningServiceClient = ProvisioningServiceClient.CreateFromConnectionString(parameters.ProvisioningConnectionString);
var sample = new EnrollmentSample(provisioningServiceClient);
sample.RunSampleAsync().GetAwaiter().GetResult();
var sample = new IndividualEnrollmentSample(provisioningServiceClient);
await sample.RunSampleAsync();

Console.WriteLine("Done.\n");
return 0;
}
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion provisioning/service/samples/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

- [Group certificate verification][group-cert-sample] sample
- [Bulk operation][bulk-op-sample] sample
- [Enrollment][enrollment-sample] sample
- [Individual enrollment][enrollment-sample] sample
- [Enrollment group][enrollment-group-sample] sample
- [Clean up enrollments][clean-up-enrollments-sample] sample

Expand Down
1 change: 0 additions & 1 deletion provisioning/service/src/Config/DeviceRegistrationState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using Microsoft.Azure.Devices.Shared;
using Newtonsoft.Json;

namespace Microsoft.Azure.Devices.Provisioning.Service
Expand Down
14 changes: 14 additions & 0 deletions provisioning/service/src/Config/QueryResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,20 @@ public class QueryResult
/// <summary>
/// Getter for the list of query result Items.
/// </summary>
/// <remarks>
/// Depending on the <see cref="Type"/>, these items can be cast to a corresponding type:
/// <list type="bullet">
/// <item><description>
/// <see cref="QueryResultType.Enrollment"/>: <see cref="IndividualEnrollment"/>
/// </description></item>
/// <item><description>
/// <see cref="QueryResultType.EnrollmentGroup"/>: <see cref="EnrollmentGroup"/>
/// </description></item>
/// <item><description>
/// <see cref="QueryResultType.DeviceRegistration"/>: <see cref="DeviceRegistrationState"/>
/// </description></item>
/// </list>
/// </remarks>
public IEnumerable<object> Items { get; private set; }

/// <summary>
Expand Down

0 comments on commit ad393c8

Please sign in to comment.