Exemple #1
0
        public void CreateClient_WithoutAuthentication_Throws()
        {
            var location = new AzureServiceBusNamespace("resource group", "namespace", ServiceBusEntityType.Topic, "entity name", "authorization rule name");

            Assert.ThrowsAny <ArgumentException>(
                () => new AzureServiceBusClient(authentication: null, @namespace: location, logger: NullLogger.Instance));
        }
Exemple #2
0
        public void CreateClient_WithoutLogger_Throws()
        {
            var location = new AzureServiceBusNamespace("resource group", "namespace", ServiceBusEntityType.Topic, "entity name", "authorization rule name");

            Assert.ThrowsAny <ArgumentException>(
                () => new AzureServiceBusClient(Mock.Of <IAzureServiceBusManagementAuthentication>(), location, logger: null));
        }
        private static AzureServiceBusNamespace GenerateAzureServiceBusLocation(ServiceBusEntityType entity)
        {
            var location = new AzureServiceBusNamespace(
                resourceGroup: BogusGenerator.Random.Word(),
                @namespace: BogusGenerator.Random.Word(),
                entity: entity,
                entityName: BogusGenerator.Random.Word(),
                authorizationRuleName: BogusGenerator.Random.Word());

            return(location);
        }
        public void CreateRotation_WithoutLogger_Throws()
        {
            var location = new AzureServiceBusNamespace("resource group", "namespace", ServiceBusEntityType.Topic, "entity name", "authorization rule name");
            var client   = new AzureServiceBusClient(Mock.Of <IAzureServiceBusManagementAuthentication>(), location, NullLogger.Instance);

            Assert.ThrowsAny <ArgumentException>(
                () => new AzureServiceBusKeyRotation(
                    serviceBusClient: client,
                    authentication: Mock.Of <IKeyVaultAuthentication>(),
                    configuration: Mock.Of <IKeyVaultConfiguration>(),
                    logger: null));
        }
        private static Mock <ITopicsOperations> CreateStubTopicsOperations(
            AzureServiceBusNamespace @namespace,
            AzureOperationResponse <AccessKeys> response)
        {
            var stubTopics = new Mock <ITopicsOperations>();

            stubTopics.Setup(t => t.RegenerateKeysWithHttpMessagesAsync(
                                 @namespace.ResourceGroup, @namespace.Namespace, @namespace.EntityName, @namespace.AuthorizationRuleName, It.IsAny <RegenerateAccessKeyParameters>(), null, default))
            .ReturnsAsync(response);

            return(stubTopics);
        }
        /// <summary>
        /// Checks for the existence of a specific Azure Web Site, if it doesn't exist it will create it.
        /// </summary>
        /// <param name="client">The <see cref="ServiceBusManagementClient"/> that is performing the operation.</param>
        /// <param name="model">The DevOpsFlex rich model object that contains everything there is to know about this service bus spec.</param>
        /// <returns>The async <see cref="Task"/> wrapper.</returns>
        public static async Task CreateNamespaceIfNotExistsAsync(this ServiceBusManagementClient client, AzureServiceBusNamespace model)
        {
            Contract.Requires(client != null);
            Contract.Requires(model != null);

            await client.CreateNamespaceIfNotExistsAsync(
                FlexDataConfiguration.GetNaming<AzureServiceBusNamespace>()
                                     .GetSlotName(
                                         model,
                                         FlexDataConfiguration.Branch,
                                         FlexDataConfiguration.Configuration),
                model.Region.GetEnumDescription());
        }
        public async Task RotateServiceBusSecret_WithValidArguments_RotatesPrimarySecondaryAlternately(ServiceBusEntityType entity)
        {
            // Arrange
            string vaultUrl   = BogusGenerator.Internet.UrlWithPath(protocol: "https");
            string secretName = BogusGenerator.Random.Word();
            AzureServiceBusNamespace @namespace = GenerateAzureServiceBusLocation(entity);
            var response = new AzureOperationResponse <AccessKeys>
            {
                Body = new AccessKeys(
                    primaryConnectionString: BogusGenerator.Random.Words(),
                    secondaryConnectionString: BogusGenerator.Random.Words())
            };

            Mock <ITopicsOperations> stubTopics = CreateStubTopicsOperations(@namespace, response);
            Mock <IQueuesOperations> stubQueues = CreateStubQueueOperations(@namespace, response);
            Mock <IAzureServiceBusManagementAuthentication> stubServiceBusAuthentication = CreateStubAuthentication(stubTopics.Object, stubQueues.Object);
            Mock <IKeyVaultAuthentication> stubKeyVaultAuthentication = CreateStubKeyVaultAuthentication(vaultUrl, secretName, response.Body);

            var rotation = new AzureServiceBusKeyRotation(
                new AzureServiceBusClient(stubServiceBusAuthentication.Object, @namespace, NullLogger.Instance),
                stubKeyVaultAuthentication.Object, new KeyVaultConfiguration(vaultUrl), NullLogger.Instance);

            // Act
            await rotation.RotateServiceBusSecretAsync(secretName);

            // Assert
            Assert.Empty(DetermineNonRelevantInvocations(entity, stubTopics.Invocations, stubQueues.Invocations));
            Assert.Collection(DetermineRelevantInvocations(entity, stubTopics.Invocations, stubQueues.Invocations),
                              invocation => AssertInvocationKeyRotation(invocation, KeyType.SecondaryKey),
                              invocation => AssertInvocationKeyRotation(invocation, KeyType.PrimaryKey));

            await rotation.RotateServiceBusSecretAsync(secretName);

            Assert.Empty(DetermineNonRelevantInvocations(entity, stubTopics.Invocations, stubQueues.Invocations));
            Assert.Collection(DetermineRelevantInvocations(entity, stubTopics.Invocations, stubQueues.Invocations).Skip(2),
                              invocation => AssertInvocationKeyRotation(invocation, KeyType.PrimaryKey),
                              invocation => AssertInvocationKeyRotation(invocation, KeyType.SecondaryKey));
        }
Exemple #8
0
        private AzureServiceBusClient CreateAzureServiceBusClient(
            KeyRotationConfig keyRotationConfig,
            ISecretProvider secretProvider,
            ServiceBusEntityType entity)
        {
            var serviceBusAuthentication = new DefaultAzureServiceBusManagementAuthentication(
                keyRotationConfig.ServicePrincipal.ClientId,
                keyRotationConfig.ServicePrincipal.ClientSecretKey,
                keyRotationConfig.ServiceBusNamespace.SubscriptionId,
                keyRotationConfig.ServiceBusNamespace.TenantId,
                secretProvider);

            var serviceBusLocation = new AzureServiceBusNamespace(
                keyRotationConfig.ServiceBusNamespace.ResourceGroup,
                keyRotationConfig.ServiceBusNamespace.Namespace,
                entity,
                keyRotationConfig.ServiceBusNamespace.TopicName,
                keyRotationConfig.ServiceBusNamespace.AuthorizationRuleName);

            var azureServiceBusClient = new AzureServiceBusClient(serviceBusAuthentication, serviceBusLocation, _logger);

            return(azureServiceBusClient);
        }
        /// <summary>
        /// Checks for the existence of a specific Azure Web Site, if it doesn't exist it will create it.
        /// </summary>
        /// <param name="client">The <see cref="ServiceBusManagementClient"/> that is performing the operation.</param>
        /// <param name="model">The DevOpsFlex rich model object that contains everything there is to know about this service bus spec.</param>
        /// <returns>The async <see cref="Task"/> wrapper.</returns>
        public static async Task CreateNamespaceIfNotExistsAsync(this ServiceBusManagementClient client, AzureServiceBusNamespace model)
        {
            Contract.Requires(client != null);
            Contract.Requires(model != null);

            await client.CreateNamespaceIfNotExistsAsync(
                FlexDataConfiguration.GetNaming <AzureServiceBusNamespace>()
                .GetSlotName(
                    model,
                    FlexDataConfiguration.Branch,
                    FlexDataConfiguration.Configuration),
                model.Region.GetEnumDescription());
        }