Example #1
0
        public async Task <Response <DigitalTwinsDescription> > GetAsync(string resourceGroupName, string resourceName, CancellationToken cancellationToken = default)
        {
            if (resourceGroupName == null)
            {
                throw new ArgumentNullException(nameof(resourceGroupName));
            }
            if (resourceName == null)
            {
                throw new ArgumentNullException(nameof(resourceName));
            }

            using var message = CreateGetRequest(resourceGroupName, resourceName);
            await _pipeline.SendAsync(message, cancellationToken).ConfigureAwait(false);

            switch (message.Response.Status)
            {
            case 200:
            {
                DigitalTwinsDescription value = default;
                using var document = await JsonDocument.ParseAsync(message.Response.ContentStream, default, cancellationToken).ConfigureAwait(false);

                if (document.RootElement.ValueKind == JsonValueKind.Null)
                {
                    value = null;
                }
                else
                {
                    value = DigitalTwinsDescription.DeserializeDigitalTwinsDescription(document.RootElement);
                }
                return(Response.FromValue(value, message.Response));
            }
Example #2
0
        protected DigitalTwinsDescription CreateDigitalTwinsInstance(ResourceGroup resourceGroup, string location, string digitalTwinsInstanceName)
        {
            var digitalTwinsDescription = new DigitalTwinsDescription()
            {
                Location = location,
            };


            return(this.digitalTwinsClient.DigitalTwins.CreateOrUpdate(
                       resourceGroup.Name,
                       digitalTwinsInstanceName,
                       digitalTwinsDescription
                       ));
        }
Example #3
0
        protected DigitalTwinsDescription CreateDigitalTwinsInstance(ResourceGroup resourceGroup, string location, string digitalTwinsInstanceName)
        {
            var digitalTwinsDescription = new DigitalTwinsDescription()
            {
                Location = location,
            };

            PropertyInfo        sku    = digitalTwinsDescription.GetType().BaseType.GetProperty("Sku");
            DigitalTwinsSkuInfo newSku = new DigitalTwinsSkuInfo();

            newSku.GetType().GetProperty("Name").SetValue(newSku, "S1");
            sku.SetValue(digitalTwinsDescription, newSku);

            return(this.digitalTwinsClient.DigitalTwins.CreateOrUpdate(
                       resourceGroup.Name,
                       digitalTwinsInstanceName,
                       digitalTwinsDescription
                       ));
        }
Example #4
0
        private async Task <DigitalTwinsDescription> FindDigitalTwinInstanceAsync(AzureDigitalTwinsManagementClient dtClient, string instanceName)
        {
            string nextPageLink           = null;
            DigitalTwinsDescription match = null;

            do
            {
                var instances = nextPageLink == null
          ? await dtClient.DigitalTwins.ListAsync()
          : await dtClient.DigitalTwins.ListNextAsync(nextPageLink);

                nextPageLink = instances.NextPageLink;

                match = instances.FirstOrDefault(x => string.Equals(x.Name, instanceName, StringComparison.OrdinalIgnoreCase));
                if (match != null)
                {
                    break;
                }
            } while (nextPageLink != null);

            return(match);
        }
Example #5
0
 /// <summary>
 /// Create or update the metadata of a DigitalTwinsInstance. The usual pattern
 /// to modify a property is to retrieve the DigitalTwinsInstance and security
 /// metadata, and then combine them with the modified values in a new body to
 /// update the DigitalTwinsInstance.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group that contains the DigitalTwinsInstance.
 /// </param>
 /// <param name='resourceName'>
 /// The name of the DigitalTwinsInstance.
 /// </param>
 /// <param name='digitalTwinsCreate'>
 /// The DigitalTwinsInstance and security metadata.
 /// </param>
 public static DigitalTwinsDescription CreateOrUpdate(this IDigitalTwinsOperations operations, string resourceGroupName, string resourceName, DigitalTwinsDescription digitalTwinsCreate)
 {
     return(operations.CreateOrUpdateAsync(resourceGroupName, resourceName, digitalTwinsCreate).GetAwaiter().GetResult());
 }
Example #6
0
 /// <summary>
 /// Create or update the metadata of a DigitalTwinsInstance. The usual pattern
 /// to modify a property is to retrieve the DigitalTwinsInstance and security
 /// metadata, and then combine them with the modified values in a new body to
 /// update the DigitalTwinsInstance.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group that contains the DigitalTwinsInstance.
 /// </param>
 /// <param name='resourceName'>
 /// The name of the DigitalTwinsInstance.
 /// </param>
 /// <param name='digitalTwinsCreate'>
 /// The DigitalTwinsInstance and security metadata.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <DigitalTwinsDescription> BeginCreateOrUpdateAsync(this IDigitalTwinsOperations operations, string resourceGroupName, string resourceName, DigitalTwinsDescription digitalTwinsCreate, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.BeginCreateOrUpdateWithHttpMessagesAsync(resourceGroupName, resourceName, digitalTwinsCreate, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
Example #7
0
        public virtual DigitalTwinsCreateOrUpdateOperation StartCreateOrUpdate(string resourceGroupName, string resourceName, DigitalTwinsDescription digitalTwinsCreate, CancellationToken cancellationToken = default)
        {
            if (resourceGroupName == null)
            {
                throw new ArgumentNullException(nameof(resourceGroupName));
            }
            if (resourceName == null)
            {
                throw new ArgumentNullException(nameof(resourceName));
            }
            if (digitalTwinsCreate == null)
            {
                throw new ArgumentNullException(nameof(digitalTwinsCreate));
            }

            using var scope = _clientDiagnostics.CreateScope("DigitalTwinsOperations.StartCreateOrUpdate");
            scope.Start();
            try
            {
                var originalResponse = RestClient.CreateOrUpdate(resourceGroupName, resourceName, digitalTwinsCreate, cancellationToken);
                return(new DigitalTwinsCreateOrUpdateOperation(_clientDiagnostics, _pipeline, RestClient.CreateCreateOrUpdateRequest(resourceGroupName, resourceName, digitalTwinsCreate).Request, originalResponse));
            }
            catch (Exception e)
            {
                scope.Failed(e);
                throw;
            }
        }
Example #8
0
        public async Task DigitalTwinInstance_Lifecycle()
        {
            string dtInstanceName;
            Response <CheckNameResult> checkNameResponse = null;
            const int maxTryCount = 5;
            int       tryCount    = 0;

            // Create Resource Group
            string resourceGroupName = Recording.GenerateAssetName("DtSDKRG");
            await ResourceManagementClient.ResourceGroups.CreateOrUpdateAsync(resourceGroupName, new ResourceGroup("eastus2"));

            // Ensure the random instance Id generated does not already exist.
            do
            {
                dtInstanceName = Recording.GenerateAssetName("DtInstanceLifecycle");
                if (tryCount++ > maxTryCount)
                {
                    // If for some reason this unique check keeps failing, proceed with the last unique
                    // name.
                    break;
                }

                try
                {
                    checkNameResponse = await DigitalTwinsManagementClient.DigitalTwins
                                        .CheckNameAvailabilityAsync(
                        TestEnvironment.Location,
                        dtInstanceName)
                                        .ConfigureAwait(false);
                }
                catch (RequestFailedException ex) when(ex.Status == (int)HttpStatusCode.Forbidden)
                {
                    // This call requires contributor rights in subscription, which I think might be a bug
                    // but until it changes, this test should just assume the random name is probably
                    // unique.
                    break;
                }
                catch (RequestFailedException ex)
                {
                    Console.WriteLine(ex);
                }
            } while (checkNameResponse?.GetRawResponse().Status != 200);

            bool createdSuccessfully = false;

            try
            {
                // Test create
                DigitalTwinsCreateOrUpdateOperation createResponse = await DigitalTwinsManagementClient.DigitalTwins
                                                                     .StartCreateOrUpdateAsync(
                    resourceGroupName,
                    dtInstanceName,
                    new DigitalTwinsDescription(TestEnvironment.Location))
                                                                     .ConfigureAwait(false);

                // IsAsync seems to be broken. My async method gets the breakpoint no matter the mode.
                // Once issue is resolved, return this code to the right path.
                //int expectedCreateResponseCode = IsAsync ? 201 : 200;
                //createResponse.GetRawResponse().Status.Should().Be(expectedCreateResponseCode);
                createResponse.GetRawResponse().Status.Should().BeOneOf(200, 201);

                createResponse.GetRawResponse().ClientRequestId.Should().NotBeNullOrWhiteSpace();

                Response <DigitalTwinsDescription> createdResponse = await WaitForCompletionAsync(createResponse).ConfigureAwait(false);

                createdResponse.GetRawResponse().Status.Should().Be(200);
                createdResponse.GetRawResponse().ClientRequestId.Should().NotBeNullOrWhiteSpace();
                createdSuccessfully = true;

                // Validate create
                DigitalTwinsDescription createdDtInstance = createdResponse.Value;
                createdDtInstance.Name.Should().Be(dtInstanceName);
                createdDtInstance.Location.Should().Be(TestEnvironment.Location);
                createdDtInstance.ProvisioningState.Should().Be(ProvisioningState.Succeeded);
                createdDtInstance.HostName.Should().NotBeNullOrWhiteSpace();
                createdDtInstance.Id.Should().NotBeNullOrWhiteSpace();
                createdDtInstance.CreatedTime.Should().NotBeNull();
                createdDtInstance.LastUpdatedTime.Should().NotBeNull();

                // Test get
                Response <DigitalTwinsDescription> getResponse = await DigitalTwinsManagementClient.DigitalTwins
                                                                 .GetAsync(
                    resourceGroupName,
                    dtInstanceName)
                                                                 .ConfigureAwait(false);

                // Validate get
                getResponse.GetRawResponse().Status.Should().Be(200);
                getResponse.GetRawResponse().ClientRequestId.Should().NotBeNullOrWhiteSpace();
                getResponse.Value.Name.Should().Be(dtInstanceName);
                getResponse.Value.Location.Should().Be(TestEnvironment.Location);
                getResponse.Value.ProvisioningState.Should().Be(ProvisioningState.Succeeded);
                getResponse.Value.HostName.Should().NotBeNullOrWhiteSpace();
                getResponse.Value.Id.Should().NotBeNullOrWhiteSpace();
                getResponse.Value.CreatedTime.Should().NotBeNull();
                getResponse.Value.LastUpdatedTime.Should().NotBeNull();

                // Test list
                AsyncPageable <DigitalTwinsDescription> listResponse = DigitalTwinsManagementClient.DigitalTwins.ListAsync();

                // Validate list
                DigitalTwinsDescription foundInstance = null;
                await foreach (DigitalTwinsDescription dtInstance in listResponse)
                {
                    if (StringComparer.Ordinal.Equals(dtInstance.Name, dtInstanceName))
                    {
                        foundInstance = dtInstance;
                        break;
                    }
                }
                foundInstance.Name.Should().Be(dtInstanceName);
                foundInstance.Location.Should().Be(TestEnvironment.Location);
                foundInstance.ProvisioningState.Should().Be(ProvisioningState.Succeeded);
                foundInstance.HostName.Should().NotBeNullOrWhiteSpace();
                foundInstance.Id.Should().NotBeNullOrWhiteSpace();
                foundInstance.CreatedTime.Should().NotBeNull();
                foundInstance.LastUpdatedTime.Should().NotBeNull();
            }
            finally
            {
                if (createdSuccessfully)
                {
                    // Test delete
                    DigitalTwinsDeleteOperation deleteResponse = await DigitalTwinsManagementClient.DigitalTwins
                                                                 .StartDeleteAsync(
                        resourceGroupName,
                        dtInstanceName)
                                                                 .ConfigureAwait(false);

                    deleteResponse.GetRawResponse().Status.Should().BeOneOf(202);
                    deleteResponse.GetRawResponse().ClientRequestId.Should().NotBeNullOrWhiteSpace();

                    // Validate delete
                    Response <Response> deletedResponse = await WaitForCompletionAsync(deleteResponse).ConfigureAwait(false);

                    // The swagger indicates this should be a 204, but in practice the service returns 200.
                    // The issue has been raised with the service team, but for now we'll expect a 200 instead.
                    deletedResponse.Value.Status.Should().Be(200);
                    deletedResponse.GetRawResponse().ClientRequestId.Should().NotBeNullOrWhiteSpace();
                }
            }
        }
Example #9
0
 protected DigitalTwinsDescription UpdateDigitalTwinsInstance(ResourceGroup resourceGroup, DigitalTwinsDescription digitalTwinsDescription, string digitalTwinsInstanceName)
 {
     return(this.digitalTwinsClient.DigitalTwins.CreateOrUpdate(
                resourceGroup.Name,
                digitalTwinsInstanceName,
                digitalTwinsDescription
                ));
 }
        public async Task TestDigitalTwinsLifecycle()
        {
            using var context = MockContext.Start(GetType());

            Initialize(context);

            // Create Resource Group
            ResourceGroup rg = await ResourcesClient.ResourceGroups.CreateOrUpdateAsync(
                DefaultResourceGroupName,
                new ResourceGroup
            {
                Location = DefaultLocation,
            });

            try
            {
                // Check if instance exists and delete
                CheckNameResult dtNameCheck = await DigitalTwinsClient.DigitalTwins.CheckNameAvailabilityAsync(
                    DefaultLocation,
                    DefaultInstanceName);

                if (!dtNameCheck.NameAvailable.Value)
                {
                    DigitalTwinsDescription dtDelete = await DigitalTwinsClient.DigitalTwins.DeleteAsync(
                        rg.Name,
                        DefaultInstanceName);

                    dtDelete.ProvisioningState.Should().Be(ProvisioningState.Deleted);

                    dtNameCheck = await DigitalTwinsClient.DigitalTwins.CheckNameAvailabilityAsync(
                        DefaultLocation,
                        DefaultInstanceName);

                    dtNameCheck.NameAvailable.Should().BeTrue();
                }

                // Create DigitalTwins resource
                var dtInstance = await DigitalTwinsClient.DigitalTwins.CreateOrUpdateAsync(
                    rg.Name,
                    DefaultInstanceName,
                    new DigitalTwinsDescription
                {
                    Location = DefaultLocation,
                });

                try
                {
                    dtInstance.Should().NotBeNull();
                    dtInstance.Name.Should().Be(DefaultInstanceName);
                    dtInstance.Location.Should().Be(DefaultLocation);

                    // Add and Get Tags
                    const string key2   = "key2";
                    const string value2 = "value2";
                    var          patch  = new DigitalTwinsPatchDescription(
                        tags: new Dictionary <string, string>
                    {
                        { "key1", "value1" },
                        { key2, value2 },
                    });
                    dtInstance = await DigitalTwinsClient.DigitalTwins.UpdateAsync(
                        rg.Name,
                        dtInstance.Name,
                        patch);

                    dtInstance.Should().NotBeNull();
                    dtInstance.Tags.Count().Should().Be(2);
                    dtInstance.Tags[key2].Should().Be(value2);

                    // List DigitalTwins instances in Resource Group
                    var twinsResources = await DigitalTwinsClient.DigitalTwins.ListByResourceGroupAsync(rg.Name);

                    twinsResources.Count().Should().BeGreaterThan(0);

                    // Get all of the available operations, ensure CRUD
                    var operationList = await DigitalTwinsClient.Operations.ListAsync();

                    operationList.Count().Should().BeGreaterThan(0);
                    Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/read", StringComparison.OrdinalIgnoreCase));
                    Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/write", StringComparison.OrdinalIgnoreCase));
                    Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/delete", StringComparison.OrdinalIgnoreCase));

                    // Test other operations

                    // Register Operation
                    var registerOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/register"));
                    registerOperations.Count().Should().BeGreaterThan(0);

                    // Twin Operations
                    var twinOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/digitaltwins"));
                    twinOperations.Count().Should().BeGreaterThan(0);

                    // Event Route Operations
                    var eventRouteOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/eventroutes"));
                    eventRouteOperations.Count().Should().BeGreaterThan(0);

                    // Model operations
                    var modelOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/models"));
                    modelOperations.Count().Should().BeGreaterThan(0);
                }
                finally
                {
                    // Delete instance
                    DigitalTwinsDescription deleteOp = await DigitalTwinsClient.DigitalTwins.BeginDeleteAsync(
                        rg.Name,
                        dtInstance.Name);

                    deleteOp.ProvisioningState.Should().Be(ProvisioningState.Deleting);
                }
            }
            finally
            {
                await ResourcesClient.ResourceGroups.DeleteAsync(rg.Name);
            }
        }
        public void TestDigitalTwinsLifecycle()
        {
            using (MockContext context = MockContext.Start(this.GetType()))
            {
                var digitalTwinsDescription = new DigitalTwinsDescription()
                {
                    Location = location,
                };

                this.Initialize(context);

                // Create Resource Group
                var resourceGroup = this.CreateResourceGroup(DigitalTwinsTestUtilities.DefaultResourceGroupName);

                // Check if instance exists and delete
                var digitalTwinsAvailability = this.digitalTwinsClient.DigitalTwins.CheckNameAvailability(DigitalTwinsTestUtilities.DefaultLocation, DigitalTwinsTestUtilities.DefaultInstanceName);

                if (!(bool)digitalTwinsAvailability.NameAvailable)
                {
                    this.digitalTwinsClient.DigitalTwins.Delete(
                        DigitalTwinsTestUtilities.DefaultResourceGroupName,
                        DigitalTwinsTestUtilities.DefaultInstanceName);

                    digitalTwinsAvailability = this.digitalTwinsClient.DigitalTwins.CheckNameAvailability(DigitalTwinsTestUtilities.DefaultLocation, DigitalTwinsTestUtilities.DefaultInstanceName);
                    Assert.True(digitalTwinsAvailability.NameAvailable);
                }

                // Create DigitalTwins resource
                var digitalTwinsInstance = this.CreateDigitalTwinsInstance(resourceGroup, DigitalTwinsTestUtilities.DefaultLocation, DigitalTwinsTestUtilities.DefaultInstanceName);

                Assert.NotNull(digitalTwinsInstance);
                Assert.Equal(DigitalTwinsTestUtilities.DefaultInstanceName, digitalTwinsInstance.Name);
                Assert.Equal(DigitalTwinsTestUtilities.DefaultLocation, digitalTwinsInstance.Location);

                // Add and Get Tags
                IDictionary <string, string> tags = new Dictionary <string, string>();
                tags.Add("key1", "value1");
                tags.Add("key2", "value2");
                digitalTwinsInstance = this.digitalTwinsClient.DigitalTwins.Update(DigitalTwinsTestUtilities.DefaultResourceGroupName, DigitalTwinsTestUtilities.DefaultInstanceName, tags);

                Assert.NotNull(digitalTwinsInstance);
                Assert.True(digitalTwinsInstance.Tags.Count().Equals(2));
                Assert.Equal("value2", digitalTwinsInstance.Tags["key2"]);

                // List DigitalTwins instances in Resource Group
                var twinsResources = this.digitalTwinsClient.DigitalTwins.ListByResourceGroup(DigitalTwinsTestUtilities.DefaultResourceGroupName);
                Assert.True(twinsResources.Count() > 0);

                // Get all of the available operations, ensure CRUD
                var operationList = this.digitalTwinsClient.Operations.List();
                Assert.True(operationList.Count() > 0);
                Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/read", StringComparison.OrdinalIgnoreCase));
                Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/write", StringComparison.OrdinalIgnoreCase));
                Assert.Contains(operationList, e => e.Name.Equals($"Microsoft.DigitalTwins/digitalTwinsInstances/delete", StringComparison.OrdinalIgnoreCase));

                // Get other operations

                // Register Operation
                var registerOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/register"));
                Assert.True(registerOperations.Count() > 0);

                // Twin Operations
                var twinOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/digitaltwins"));
                Assert.True(twinOperations.Count() > 0);

                // Event Route Operations
                var eventRouteOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/eventroutes"));
                Assert.True(eventRouteOperations.Count() > 0);

                // Model operations
                var modelOperations = operationList.Where(e => e.Name.Contains($"Microsoft.DigitalTwins/models"));
                Assert.True(modelOperations.Count() > 0);

                // Delete instance
                var deleteOp = this.digitalTwinsClient.DigitalTwins.BeginDelete(DigitalTwinsTestUtilities.DefaultResourceGroupName, DigitalTwinsTestUtilities.DefaultInstanceName);
                Assert.True(deleteOp.ProvisioningState == ProvisioningState.Deleting);
            }
        }