Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging.Abstractions;
using System.Collections.Generic;
using Microsoft.Extensions.Logging.Abstractions;
using NUnit.Framework;
using TerraformPluginDotNet.ResourceProvider;
using TerraformPluginDotNet.Schemas;
Expand Down Expand Up @@ -27,18 +28,45 @@ public void TestRegisterDataSource()
{
var registry = BuildRegistry();

Assert.That(registry.DataSchemas.Keys, Is.EquivalentTo(new[] { "test_data_source" }));
Assert.That(registry.DataSchemas.Keys, Is.EquivalentTo(new[] { "test_data_source", "test_provided_data_source" }));
Assert.That(registry.DataSchemas["test_data_source"], Is.InstanceOf<Schema>());
Assert.That(registry.DataSchemas["test_provided_data_source"], Is.InstanceOf<Schema>());

Assert.That(registry.DataTypes.Keys, Is.EquivalentTo(new[] { "test_data_source" }));
Assert.That(registry.DataTypes.Keys, Is.EquivalentTo(new[] { "test_data_source", "test_provided_data_source" }));
Assert.That(registry.DataTypes["test_data_source"], Is.EqualTo(typeof(TestResource)));
Assert.That(registry.DataTypes["test_provided_data_source"], Is.EqualTo(typeof(TestResource)));
}

private static ResourceRegistry BuildRegistry()
{
var schemaBuilder = new SchemaBuilder(NullLogger<SchemaBuilder>.Instance, new TerraformTypeBuilder());
var registration = new ResourceRegistryRegistration("test_resource", typeof(TestResource));
var dataSourceRegistration = new DataSourceRegistryRegistration("test_data_source", typeof(TestResource));
var registry = new ResourceRegistry(new SchemaBuilder(NullLogger<SchemaBuilder>.Instance, new TerraformTypeBuilder()), new[] { registration }, new[] { dataSourceRegistration });
var dataSourceSchemaProvider = new SchemaProvider(schemaBuilder);
var registry = new ResourceRegistry(
schemaBuilder,
new[] { registration },
new[] { dataSourceRegistration },
new[] { dataSourceSchemaProvider });
return registry;
}

private class SchemaProvider : IDataSourceSchemaProvider
{
private readonly SchemaBuilder _schemaBuilder;

public SchemaProvider(
SchemaBuilder schemaBuilder)
{
_schemaBuilder = schemaBuilder;
}

public IEnumerable<DataSourceRegistration> GetSchemas()
{
yield return new DataSourceRegistration(
"test_provided_data_source",
typeof(TestResource),
_schemaBuilder.BuildSchema(typeof(TestResource)));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Tfplugin5;

namespace TerraformPluginDotNet.ResourceProvider;

public record DataSourceRegistration(string ResourceName, Type Type, Schema Schema);
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TerraformPluginDotNet.ResourceProvider;

public interface IDataSourceSchemaProvider
{
IEnumerable<DataSourceRegistration> GetSchemas();
}
17 changes: 13 additions & 4 deletions TerraformPluginDotNet/ResourceProvider/ResourceRegistry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,29 @@ namespace TerraformPluginDotNet.ResourceProvider;
class ResourceRegistry
{
public ResourceRegistry(
ISchemaBuilder schemaBulder,
ISchemaBuilder schemaBuilder,
IEnumerable<ResourceRegistryRegistration> resourceRegistrations,
IEnumerable<DataSourceRegistryRegistration> dataSourceRegistrations)
IEnumerable<DataSourceRegistryRegistration> dataSourceRegistrations,
IEnumerable<IDataSourceSchemaProvider> dataSourceSchemaProviders)
{
foreach (var registration in resourceRegistrations)
{
Schemas.Add(registration.ResourceName, schemaBulder.BuildSchema(registration.Type));
Schemas.Add(registration.ResourceName, schemaBuilder.BuildSchema(registration.Type));
Types.Add(registration.ResourceName, registration.Type);
}
foreach (var registration in dataSourceRegistrations)
{
DataSchemas.Add(registration.ResourceName, schemaBulder.BuildSchema(registration.Type));
DataSchemas.Add(registration.ResourceName, schemaBuilder.BuildSchema(registration.Type));
DataTypes.Add(registration.ResourceName, registration.Type);
}
foreach (var provider in dataSourceSchemaProviders)
{
foreach (var registration in provider.GetSchemas())
{
DataSchemas.Add(registration.ResourceName, registration.Schema);
DataTypes.Add(registration.ResourceName, registration.Type);
}
}
}

public Dictionary<string, Schema> Schemas { get; } = new Dictionary<string, Schema>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ public void RegisterResource<T>(string resourceName)
_services.AddSingleton(new ResourceRegistryRegistration(resourceName, typeof(T)));
}

public void RegisterDataSource<T>(string resourceName)
public void RegisterDataSource<T>(string dataSourceName)
{
EnsureValidType<T>();

_services.AddSingleton(new DataSourceRegistryRegistration(resourceName, typeof(T)));
_services.AddSingleton(new DataSourceRegistryRegistration(dataSourceName, typeof(T)));
}

private static void EnsureValidType<T>()
Expand Down