Skip to content
Merged
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
31 changes: 31 additions & 0 deletions MountAws.UnitTests/DynamoDbRoutingTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using AwesomeAssertions;
using MountAnything;
using MountAnything.Routing;
using MountAws.Services.DynamoDb;
using Xunit;

namespace MountAws.UnitTests;

public class DynamoDbRoutingTests
{
private readonly Router _router;

public DynamoDbRoutingTests()
{
var provider = new MountAwsProvider();
_router = provider.CreateRouter();
}

[Theory]
[InlineData("myprofile/us-east-1/dynamodb", typeof(DynamoDbRootHandler))]
[InlineData("myprofile/us-east-1/dynamodb/tables", typeof(TablesHandler))]
[InlineData("myprofile/us-east-1/dynamodb/tables/my-table", typeof(TableHandler))]
[InlineData("myprofile/us-east-1/dynamodb/tables/my-table/autoscaling", typeof(TableAutoscalingHandler))]
[InlineData("myprofile/us-east-1/dynamodb/tables/my-table/items", typeof(TableItemsHandler))]
public void DynamoDbRoutesResolveToCorrectHandlers(string path, Type expectedHandlerType)
{
var resolver = _router.GetResolver(new ItemPath(path));
resolver.HandlerType.Should().Be(expectedHandlerType);
}
}
1 change: 1 addition & 0 deletions MountAws/MountAws.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<PackageReference Include="Microsoft.PowerShell.Commands.Utility" Version="7.4.13" />
<PackageReference Include="System.Management.Automation" Version="7.4.13" />
<PackageReference Include="AWSSDK.AutoScaling" Version="3.7.*" />
<PackageReference Include="AWSSDK.ApplicationAutoScaling" Version="3.7.*" />
<PackageReference Include="AWSSDK.ServiceDiscovery" Version="3.7.*" />
<PackageReference Include="AWSSDK.WAFV2" Version="3.7.*" />
<PackageReference Include="AWSSDK.ECR" Version="3.7.*" />
Expand Down
67 changes: 67 additions & 0 deletions MountAws/Services/AppAutoscaling/ApiExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using Amazon.ApplicationAutoScaling;
using Amazon.ApplicationAutoScaling.Model;
using static MountAws.PagingHelper;

namespace MountAws.Services.AppAutoscaling;

public static class ApiExtensions
{
public static IEnumerable<ScalableTarget> DescribeScalableTargets(this IAmazonApplicationAutoScaling autoScaling, ServiceNamespace serviceNamespace)
{
return Paginate(nextToken =>
{
var response = autoScaling.DescribeScalableTargetsAsync(new DescribeScalableTargetsRequest
{
ServiceNamespace = serviceNamespace,
NextToken = nextToken
}).GetAwaiter().GetResult();

return (response.ScalableTargets, response.NextToken);
});
}

public static IEnumerable<ScalingPolicy> DescribeScalingPolicies(this IAmazonApplicationAutoScaling autoScaling, ServiceNamespace serviceNamespace, string resourceId)
{
return Paginate(nextToken =>
{
var response = autoScaling.DescribeScalingPoliciesAsync(new DescribeScalingPoliciesRequest
{
ServiceNamespace = serviceNamespace,
ResourceId = resourceId,
NextToken = nextToken
}).GetAwaiter().GetResult();

return (response.ScalingPolicies, response.NextToken);
});
}

public static IEnumerable<ScalingActivity> DescribeScalingActivities(this IAmazonApplicationAutoScaling autoScaling, ServiceNamespace serviceNamespace, string resourceId)
{
return Paginate(nextToken =>
{
var response = autoScaling.DescribeScalingActivitiesAsync(new DescribeScalingActivitiesRequest
{
ServiceNamespace = serviceNamespace,
ResourceId = resourceId,
NextToken = nextToken
}).GetAwaiter().GetResult();

return (response.ScalingActivities, response.NextToken);
});
}

public static IEnumerable<ScheduledAction> DescribeScheduledActions(this IAmazonApplicationAutoScaling autoScaling, ServiceNamespace serviceNamespace, string resourceId)
{
return Paginate(nextToken =>
{
var response = autoScaling.DescribeScheduledActionsAsync(new DescribeScheduledActionsRequest
{
ServiceNamespace = serviceNamespace,
ResourceId = resourceId,
NextToken = nextToken
}).GetAwaiter().GetResult();

return (response.ScheduledActions, response.NextToken);
});
}
}
25 changes: 25 additions & 0 deletions MountAws/Services/AppAutoscaling/AutoscalingHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using MountAnything;
using MountAws.Services.Core;

namespace MountAws.Services.AppAutoscaling;

public class AutoscalingHandler(ItemPath path, IPathHandlerContext context) : PathHandler(path, context)
{
public static Item CreateItem(ItemPath parentPath)
{
return new GenericContainerItem(parentPath, "autoscaling",
"Navigate application autoscaling dimensions");
}

protected override IItem? GetItemImpl()
{
return CreateItem(ParentPath);
}

protected override IEnumerable<IItem> GetChildItemsImpl()
{
yield return ScalingPoliciesHandler.CreateItem(Path);
yield return ScalingActivitiesHandler.CreateItem(Path);
yield return ScheduledActionsHandler.CreateItem(Path);
}
}
8 changes: 8 additions & 0 deletions MountAws/Services/AppAutoscaling/CurrentServiceNamespace.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using MountAnything;

namespace MountAws.Services.AppAutoscaling;

public class CurrentServiceNamespace : TypedString
{
public CurrentServiceNamespace(string value) : base(value) { }
}
132 changes: 132 additions & 0 deletions MountAws/Services/AppAutoscaling/Formats.ps1xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<Configuration>
<ViewDefinitions>
<View>
<Name>ScalableTarget</Name>
<ViewSelectedBy>
<TypeName>MountAws.Services.AppAutoscaling.ScalableTargetItem</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>ItemName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>ScalableDimension</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>MinCapacity</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>MaxCapacity</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<View>
<Name>ScalingPolicy</Name>
<ViewSelectedBy>
<TypeName>MountAws.Services.AppAutoscaling.ScalingPolicyItem</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>ItemName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>PolicyType</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>ScalableDimension</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Summary</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<View>
<Name>ScalingActivity</Name>
<ViewSelectedBy>
<TypeName>MountAws.Services.AppAutoscaling.ScalingActivityItem</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>ItemName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>StatusCode</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Description</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>StartTime</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<View>
<Name>ScheduledAction</Name>
<ViewSelectedBy>
<TypeName>MountAws.Services.AppAutoscaling.ScheduledActionItem</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>ItemName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Schedule</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>ScalableDimension</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>CreationTime</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
6 changes: 6 additions & 0 deletions MountAws/Services/AppAutoscaling/IResourceIdResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MountAws.Services.AppAutoscaling;

public interface IResourceIdResolver
{
string ResourceId { get; }
}
9 changes: 9 additions & 0 deletions MountAws/Services/AppAutoscaling/ItemResourceIdResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using MountAnything;

namespace MountAws.Services.AppAutoscaling;

public class ItemResourceIdResolver<TItem>(IItemAncestor<TItem> itemAncestor, Func<TItem,string> resourceIdAccessor)
: IResourceIdResolver where TItem : IItem
{
public string ResourceId => resourceIdAccessor(itemAncestor.Item);
}
16 changes: 16 additions & 0 deletions MountAws/Services/AppAutoscaling/Registrar.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Amazon;
using Amazon.ApplicationAutoScaling;
using Amazon.Runtime;
using Autofac;

namespace MountAws.Services.AppAutoscaling;

public class Registrar : IServiceRegistrar
{
public void Register(ContainerBuilder builder)
{
builder.RegisterType<AmazonApplicationAutoScalingClient>()
.As<IAmazonApplicationAutoScaling>()
.UsingConstructor(typeof(AWSCredentials), typeof(RegionEndpoint));
}
}
37 changes: 37 additions & 0 deletions MountAws/Services/AppAutoscaling/RouteExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Autofac;
using MountAnything;
using MountAnything.Routing;

namespace MountAws.Services.AppAutoscaling;

public static class RouteExtensions
{
public static void MapAppAutoscaling<TItem>(this Route route, string serviceNamespace, Func<TItem,string> resourceIdSelector) where TItem : IItem
{
route.ConfigureContainer(c =>
{
c.RegisterInstance(new CurrentServiceNamespace(serviceNamespace));
c.Register<IResourceIdResolver>(s =>
{
var item = s.Resolve<IItemAncestor<TItem>>();

return new ItemResourceIdResolver<TItem>(item, resourceIdSelector);
}).As<IResourceIdResolver>();
});
route.MapLiteral<AutoscalingHandler>("autoscaling", autoscaling =>
{
autoscaling.MapLiteral<ScalingPoliciesHandler>("scaling-policies", scalablePolicies =>
{
scalablePolicies.Map<ScalingPolicyHandler>();
});
autoscaling.MapLiteral<ScalingActivitiesHandler>("scaling-activities", scalingActivities =>
{
scalingActivities.Map<ScalingActivityHandler>();
});
autoscaling.MapLiteral<ScheduledActionsHandler>("scheduled-actions", scheduledActions =>
{
scheduledActions.Map<ScheduledActionHandler>();
});
});
}
}
23 changes: 23 additions & 0 deletions MountAws/Services/AppAutoscaling/ScalableTargetItem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Amazon.ApplicationAutoScaling.Model;
using MountAnything;

namespace MountAws.Services.AppAutoscaling;

public class ScalableTargetItem(ItemPath parentPath, ScalableTarget underlyingObject)
: AwsItem<ScalableTarget>(parentPath, underlyingObject)
{
public override string ItemName => UnderlyingObject.ResourceId.Replace("/", ":");
public override bool IsContainer => true;

[ItemProperty]
public string ScalableDimension => UnderlyingObject.ScalableDimension.Value;

[ItemProperty]
public int MinCapacity => UnderlyingObject.MinCapacity;

[ItemProperty]
public int MaxCapacity => UnderlyingObject.MaxCapacity;

[ItemProperty]
public string ServiceNamespace => UnderlyingObject.ServiceNamespace.Value;
}
Loading