Exemple #1
0
        public async Task Constructor_CreatesSecretPathIfNotExists(SecretsRepositoryType repositoryType, string sku)
        {
            string path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            _fixture.Environment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteSku, sku);
            await _fixture.TestInitialize(repositoryType, path);

            try
            {
                bool preConstDirExists = Directory.Exists(path);
                var  target            = _fixture.GetNewSecretRepository();

                if (_fixture.Environment.IsDynamicSku())
                {
                    await Task.Delay(TimeSpan.FromMilliseconds(2 * Utility.ColdStartDelayMS));
                }

                bool postConstDirExists = Directory.Exists(path);
                Assert.False(preConstDirExists);
                Assert.True(postConstDirExists);
            }
            finally
            {
                if (Directory.Exists(path))
                {
                    Directory.Delete(path);
                }
            }
        }
Exemple #2
0
        public async Task WriteAsync_ChangeNotificationUpdatesExistingSecret(SecretsRepositoryType repositoryType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                string            testFunctionName  = functionName;
                ScriptSecretsType secretsType       = ScriptSecretsType.Function;
                FunctionSecrets   initialSecretText = new FunctionSecrets()
                {
                    Keys = new List <Key> {
                        new Key(KeyName, "test1")
                    }
                };
                FunctionSecrets updatedSecretText = new FunctionSecrets()
                {
                    Keys = new List <Key> {
                        new Key(KeyName, "test2")
                    }
                };

                await _fixture.WriteSecret(testFunctionName, initialSecretText);

                var           target        = _fixture.GetNewSecretRepository();
                ScriptSecrets preTextResult = await target.ReadAsync(secretsType, testFunctionName);

                await _fixture.WriteSecret(testFunctionName, updatedSecretText);

                ScriptSecrets postTextResult = await target.ReadAsync(secretsType, testFunctionName);

                Assert.Equal("test1", (preTextResult as FunctionSecrets).Keys[0].Value);
                Assert.Equal("test2", (postTextResult as FunctionSecrets).Keys[0].Value);
            }
        }
Exemple #3
0
            public async Task TestInitialize(SecretsRepositoryType repositoryType, string secretsDirectory, string testSiteName = null)
            {
                RepositoryType   = repositoryType;
                SecretsDirectory = secretsDirectory;
                if (testSiteName != null)
                {
                    TestSiteName = testSiteName;
                }

                if (RepositoryType == SecretsRepositoryType.BlobStorageSas)
                {
                    BlobSasConnectionUri = await TestHelpers.CreateBlobContainerSas(BlobConnectionString, "azure-webjobs-secrets-sas");

                    BlobContainer = new CloudBlobContainer(BlobSasConnectionUri);
                }
                else
                {
                    BlobContainer = CloudStorageAccount.Parse(BlobConnectionString).CreateCloudBlobClient().GetContainerReference("azure-webjobs-secrets");
                }

                await ClearAllBlobSecrets();

                ClearAllFileSecrets();
                await ClearAllKeyVaultSecrets();

                LoggerProvider = new TestLoggerProvider();
                var loggerFactory = new LoggerFactory();

                loggerFactory.AddProvider(LoggerProvider);
            }
Exemple #4
0
        public async Task ReadAsync_ReadsExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                ScriptSecrets testSecrets = null;
                if (secretsType == ScriptSecretsType.Host)
                {
                    testSecrets = new HostSecrets()
                    {
                        MasterKey    = new Key("master", "test"),
                        FunctionKeys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        },
                        SystemKeys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                else
                {
                    testSecrets = new FunctionSecrets()
                    {
                        Keys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                string testFunctionName = secretsType == ScriptSecretsType.Host ? "host" : functionName;

                await _fixture.WriteSecret(testFunctionName, testSecrets);

                var target = _fixture.GetNewSecretRepository();

                ScriptSecrets secretsContent = await target.ReadAsync(secretsType, testFunctionName);

                if (secretsType == ScriptSecretsType.Host)
                {
                    Assert.Equal((secretsContent as HostSecrets).MasterKey.Name, "master");
                    Assert.Equal((secretsContent as HostSecrets).MasterKey.Value, "test");
                    Assert.Equal((secretsContent as HostSecrets).FunctionKeys[0].Name, KeyName);
                    Assert.Equal((secretsContent as HostSecrets).FunctionKeys[0].Value, "test");
                    Assert.Equal((secretsContent as HostSecrets).SystemKeys[0].Name, KeyName);
                    Assert.Equal((secretsContent as HostSecrets).SystemKeys[0].Value, "test");
                }
                else
                {
                    Assert.Equal((secretsContent as FunctionSecrets).Keys[0].Name, KeyName);
                    Assert.Equal((secretsContent as FunctionSecrets).Keys[0].Value, "test");
                }
            }
        }
Exemple #5
0
            public void TestInitialize(SecretsRepositoryType repositoryType, string secretsDirectory, string testSiteName = null)
            {
                RepositoryType   = repositoryType;
                SecretsDirectory = secretsDirectory;
                if (testSiteName != null)
                {
                    TestSiteName = testSiteName;
                }

                ClearAllBlobSecrets();
                ClearAllFileSecrets();
            }
Exemple #6
0
            public async Task TestInitialize(SecretsRepositoryType repositoryType, string secretsDirectory, string testSiteName = null)
            {
                RepositoryType   = repositoryType;
                SecretsDirectory = secretsDirectory;
                if (testSiteName != null)
                {
                    TestSiteName = testSiteName;
                }

                await ClearAllBlobSecrets();

                ClearAllFileSecrets();
                await ClearAllKeyVaultSecrets();
            }
Exemple #7
0
        private async Task ReadAsync_ReadsExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                _fixture.TestInitialize(repositoryType, directory.Path);
                string testContent      = "test";
                string testFunctionName = secretsType == ScriptSecretsType.Host ? "host" : "testfunction";

                _fixture.WriteSecret(testFunctionName, testContent);

                var target = _fixture.GetNewSecretRepository();

                string secretsContent = await target.ReadAsync(secretsType, testFunctionName);

                Assert.Equal(testContent, secretsContent);
            }
        }
Exemple #8
0
        private async Task WriteAsync_CreatesExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                _fixture.TestInitialize(repositoryType, directory.Path);
                string testContent      = "test";
                string testFunctionName = secretsType == ScriptSecretsType.Host ? null : "TestFunction";

                var target = _fixture.GetNewSecretRepository();
                await target.WriteAsync(secretsType, testFunctionName, testContent);

                string filePath = Path.Combine(directory.Path, $"{testFunctionName ?? "host"}.json");

                if (repositoryType == SecretsRepositoryType.BlobStorage)
                {
                    Assert.True(_fixture.MarkerFileExists(testFunctionName ?? "host"));
                }
                Assert.Equal(testContent, _fixture.GetSecretText(testFunctionName ?? "host"));
            }
        }
Exemple #9
0
        public async Task GetSecretSnapshots_ReturnsExpected(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                string testContent      = "test";
                string testFunctionName = secretsType == ScriptSecretsType.Host ? null : "TestFunction";

                var target = _fixture.GetNewSecretRepository();
                await target.WriteAsync(secretsType, testFunctionName, testContent);

                for (int i = 0; i < 5; i++)
                {
                    await target.WriteSnapshotAsync(secretsType, testFunctionName, testContent);
                }
                string[] files = await target.GetSecretSnapshots(secretsType, testFunctionName);

                Assert.True(files.Length > 0);
            }
        }
Exemple #10
0
        private async Task Constructor_CreatesSecretPathIfNotExists(SecretsRepositoryType repositoryType)
        {
            string path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
            await _fixture.TestInitialize(repositoryType, path);

            try
            {
                bool preConstDirExists  = Directory.Exists(path);
                var  target             = _fixture.GetNewSecretRepository();
                bool postConstDirExists = Directory.Exists(path);

                Assert.False(preConstDirExists);
                Assert.True(postConstDirExists);
            }
            finally
            {
                if (Directory.Exists(path))
                {
                    Directory.Delete(path);
                }
            }
        }
Exemple #11
0
        private async Task WriteAsync_ChangeNotificationUpdatesExistingSecret(SecretsRepositoryType repositoryType)
        {
            using (var directory = new TempDirectory())
            {
                _fixture.TestInitialize(repositoryType, directory.Path);

                string            testFunctionName  = "TestFunction";
                ScriptSecretsType secretsType       = ScriptSecretsType.Function;
                string            initialSecretText = "TextOne";
                string            updatedSecretText = "TextTwo";

                _fixture.WriteSecret(testFunctionName, initialSecretText);
                var    target        = _fixture.GetNewSecretRepository();
                string preTextResult = await target.ReadAsync(secretsType, testFunctionName);

                _fixture.WriteSecret(testFunctionName, updatedSecretText);
                string postTextResult = await target.ReadAsync(secretsType, testFunctionName);

                Assert.Equal(initialSecretText, preTextResult);
                Assert.Equal(updatedSecretText, postTextResult);
            }
        }
Exemple #12
0
        public async Task GetSecretSnapshots_ReturnsExpected(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                ScriptSecrets secrets = null;
                if (secretsType == ScriptSecretsType.Host)
                {
                    secrets = new HostSecrets()
                    {
                        MasterKey = new Key("master", "test")
                    };
                }
                else
                {
                    secrets = new FunctionSecrets()
                    {
                        Keys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                string testFunctionName = secretsType == ScriptSecretsType.Host ? null : functionName;

                var target = _fixture.GetNewSecretRepository();
                await target.WriteAsync(secretsType, testFunctionName, secrets);

                for (int i = 0; i < 5; i++)
                {
                    await target.WriteSnapshotAsync(secretsType, testFunctionName, secrets);
                }
                string[] files = await target.GetSecretSnapshots(secretsType, testFunctionName);

                Assert.True(files.Length > 0);
            }
        }
Exemple #13
0
 public async Task BlobStorageRepo_WriteAsync_ChangeNotificationUpdatesExistingSecret(SecretsRepositoryType repositoryType)
 {
     await WriteAsync_ChangeNotificationUpdatesExistingSecret(repositoryType);
 }
Exemple #14
0
 public async Task BlobStorageRepo_Constructor_CreatesSecretPathIfNotExists(SecretsRepositoryType repositoryType)
 {
     await Constructor_CreatesSecretPathIfNotExists(repositoryType);
 }
Exemple #15
0
 public async Task BlobStorageRepo_ReadAsync_ReadsExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
 {
     await ReadAsync_ReadsExpectedFile(repositoryType, secretsType);
 }
Exemple #16
0
 public async Task BlobStorageRepo_WriteAsync_CreatesExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
 {
     await WriteAsync_CreatesExpectedFile(repositoryType, secretsType);
 }
Exemple #17
0
        public async Task ReadAsync_ReadsExpectedKeyVaultPages(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                ScriptSecrets testSecrets = null;
                int           keyCount    = 35;

                List <Key> functionKeys = new List <Key>();
                for (int i = 0; i < keyCount; ++i)
                {
                    functionKeys.Add(new Key(KeyName + Guid.NewGuid().ToString(), "test" + i.ToString()));
                }

                if (secretsType == ScriptSecretsType.Host)
                {
                    testSecrets = new HostSecrets()
                    {
                        MasterKey    = new Key("master", "test"),
                        FunctionKeys = functionKeys,
                        SystemKeys   = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                else
                {
                    testSecrets = new FunctionSecrets()
                    {
                        Keys = functionKeys
                    };
                }
                string testFunctionName = secretsType == ScriptSecretsType.Host ? "host" : functionName;

                await _fixture.WriteSecret(testFunctionName, testSecrets);

                var target = _fixture.GetNewSecretRepository();

                ScriptSecrets secretsContent = await target.ReadAsync(secretsType, testFunctionName);

                if (secretsType == ScriptSecretsType.Host)
                {
                    Assert.Equal((secretsContent as HostSecrets).MasterKey.Name, "master");
                    Assert.Equal((secretsContent as HostSecrets).MasterKey.Value, "test");

                    Assert.Equal((secretsContent as HostSecrets).FunctionKeys.Count, functionKeys.Count);
                    foreach (Key originalKey in functionKeys)
                    {
                        var matchingKeys = (secretsContent as HostSecrets).FunctionKeys.Where(x => string.Equals(x.Name, originalKey.Name));
                        Assert.Equal(matchingKeys.Count(), 1);
                        Assert.Equal(matchingKeys.First().Value, originalKey.Value);
                    }

                    Assert.Equal((secretsContent as HostSecrets).SystemKeys[0].Name, KeyName);
                    Assert.Equal((secretsContent as HostSecrets).SystemKeys[0].Value, "test");
                }
                else
                {
                    Assert.Equal((secretsContent as FunctionSecrets).Keys.Count, functionKeys.Count);
                    foreach (Key originalKey in functionKeys)
                    {
                        var matchingKeys = (secretsContent as FunctionSecrets).Keys.Where(x => string.Equals(x.Name, originalKey.Name));
                        Assert.Equal(matchingKeys.Count(), 1);
                        Assert.Equal(matchingKeys.First().Value, originalKey.Value);
                    }
                }
            }
        }
Exemple #18
0
        public async Task WriteAsync_CreatesExpectedFile(SecretsRepositoryType repositoryType, ScriptSecretsType secretsType)
        {
            using (var directory = new TempDirectory())
            {
                await _fixture.TestInitialize(repositoryType, directory.Path);

                ScriptSecrets secrets = null;
                if (secretsType == ScriptSecretsType.Host)
                {
                    secrets = new HostSecrets()
                    {
                        MasterKey    = new Key("master", "test"),
                        FunctionKeys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        },
                        SystemKeys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                else
                {
                    secrets = new FunctionSecrets()
                    {
                        Keys = new List <Key>()
                        {
                            new Key(KeyName, "test")
                        }
                    };
                }
                string testFunctionName = secretsType == ScriptSecretsType.Host ? null : functionName;

                var target = _fixture.GetNewSecretRepository();
                await target.WriteAsync(secretsType, testFunctionName, secrets);

                string filePath = Path.Combine(directory.Path, $"{testFunctionName ?? "host"}.json");

                if (repositoryType == SecretsRepositoryType.BlobStorage || repositoryType == SecretsRepositoryType.BlobStorageSas)
                {
                    Assert.True(_fixture.MarkerFileExists(testFunctionName ?? "host"));
                }

                ScriptSecrets secrets1 = await _fixture.GetSecretText(testFunctionName ?? "host", secretsType);

                if (secretsType == ScriptSecretsType.Host)
                {
                    Assert.Equal((secrets1 as HostSecrets).MasterKey.Name, "master");
                    Assert.Equal((secrets1 as HostSecrets).MasterKey.Value, "test");
                    Assert.Equal((secrets1 as HostSecrets).FunctionKeys[0].Name, KeyName);
                    Assert.Equal((secrets1 as HostSecrets).FunctionKeys[0].Value, "test");
                    Assert.Equal((secrets1 as HostSecrets).SystemKeys[0].Name, KeyName);
                    Assert.Equal((secrets1 as HostSecrets).SystemKeys[0].Value, "test");
                }
                else
                {
                    Assert.Equal((secrets1 as FunctionSecrets).Keys[0].Name, KeyName);
                    Assert.Equal((secrets1 as FunctionSecrets).Keys[0].Value, "test");
                }
            }
        }