Skip to content

Commit 7ce4d0b

Browse files
committed
NetworkService.ListSecurityGroupRules
1 parent 4965b95 commit 7ce4d0b

File tree

7 files changed

+137
-2
lines changed

7 files changed

+137
-2
lines changed

src/corelib/Networking/v2/Layer3/NetworkingService_Layer3_Extensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ public static class NetworkingService_Layer3_Extensions
111111
{
112112
return await service._networkingApiBuilder.ListSecurityGroupsAsync<SecurityGroupCollection>(options, cancellationToken).ConfigureAwait(false);
113113
}
114+
115+
/// <inheritdoc cref="NetworkingApiBuilder.ListSecurityGroupRulesAsync{T}" />
116+
public static async Task<IEnumerable<SecurityGroupRule>> ListSecurityGroupRulesAsync(this NetworkingService service, SecurityGroupRuleListOptions options = null, CancellationToken cancellationToken = default(CancellationToken))
117+
{
118+
return await service._networkingApiBuilder.ListSecurityGroupRulesAsync<SecurityGroupRuleCollection>(options, cancellationToken).ConfigureAwait(false);
119+
}
114120
#endregion
115121
}
116122
}
@@ -217,6 +223,11 @@ public static IEnumerable<SecurityGroup> ListSecurityGroups(this NetworkingServi
217223
{
218224
return service.ListSecurityGroupsAsync(options).ForceSynchronous();
219225
}
226+
/// <inheritdoc cref="NetworkingService_Layer3_Extensions.ListSecurityGroupRulesAsync" />
227+
public static IEnumerable<SecurityGroupRule> ListSecurityGroupRules(this NetworkingService service, SecurityGroupRuleListOptions options = null)
228+
{
229+
return service.ListSecurityGroupRulesAsync(options).ForceSynchronous();
230+
}
220231
#endregion
221232

222233
}

src/corelib/Networking/v2/Layer3/SecurityGroupRule.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Newtonsoft.Json;
1+
using System.Collections.Generic;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Linq;
24
using OpenStack.Serialization;
35

46
namespace OpenStack.Networking.v2.Layer3
@@ -7,7 +9,7 @@ namespace OpenStack.Networking.v2.Layer3
79
///
810
/// </summary>
911
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "security_group_rule")]
10-
public class SecurityGroupRule
12+
public class SecurityGroupRule : IHaveExtraData, IServiceResource
1113
{
1214
/// <summary>
1315
/// ingress or egress: the direction in which the security group rule is applied.
@@ -71,5 +73,10 @@ public class SecurityGroupRule
7173
/// </summary>
7274
[JsonProperty("security_group_id")]
7375
public Identifier SecurityGroupId;
76+
77+
[JsonExtensionData]
78+
IDictionary<string, JToken> IHaveExtraData.Data { get; set; } = new Dictionary<string, JToken>();
79+
80+
object IServiceResource.Owner { get; set; }
7481
}
7582
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Collections.Generic;
2+
3+
namespace OpenStack.Networking.v2.Layer3
4+
{
5+
/// <summary>
6+
/// Optional filter and paging options when listing security group rules.
7+
/// </summary>
8+
public class SecurityGroupRuleListOptions : FilterOptions
9+
{
10+
/// <summary>
11+
/// Filter by the group name.
12+
/// </summary>
13+
public TrafficDirection Direction { get; set; }
14+
15+
/// <summary />
16+
protected override IDictionary<string, object> BuildQueryString()
17+
{
18+
var queryString = new Dictionary<string, object>
19+
{
20+
["direction"] = Direction
21+
};
22+
23+
return queryString;
24+
}
25+
}
26+
}

src/corelib/Networking/v2/NetworkingApiBuilder.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,41 @@ public NetworkingApiBuilder(IServiceType serviceType, IAuthenticationProvider au
704704
return request;
705705
}
706706

707+
/// <summary>
708+
/// Lists all network security group rules associated with the account.
709+
/// </summary>
710+
/// <param name="queryString">Options for filtering.</param>
711+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
712+
/// <returns>
713+
/// A collection of network security group rule resources associated with the account.
714+
/// </returns>
715+
public async Task<T> ListSecurityGroupRulesAsync<T>(IQueryStringBuilder queryString, CancellationToken cancellationToken = default(CancellationToken))
716+
where T : IEnumerable<IServiceResource>
717+
{
718+
return await BuildListSecurityGroupRulesRequest(queryString, cancellationToken)
719+
.SendAsync()
720+
.ReceiveJson<T>()
721+
.PropogateOwnerToChildren(this).ConfigureAwait(false);
722+
}
723+
724+
/// <summary>
725+
/// Builds a <see cref="ListSecurityGroupRulesAsync{T}"/> request.
726+
/// </summary>
727+
/// <param name="queryString">Options for filtering.</param>
728+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
729+
public async Task<PreparedRequest> BuildListSecurityGroupRulesRequest(IQueryStringBuilder queryString, CancellationToken cancellationToken = default(CancellationToken))
730+
{
731+
Url endpoint = await Endpoint.GetEndpoint(cancellationToken).ConfigureAwait(false);
732+
733+
var request = endpoint
734+
.AppendPathSegments("security-group-rules")
735+
.Authenticate(AuthenticationProvider)
736+
.PrepareGet(cancellationToken);
737+
738+
request.Url.SetQueryParams(queryString?.Build());
739+
740+
return request;
741+
}
707742
#endregion
708743

709744
#region Floating IPs
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Collections.Generic;
2+
using OpenStack.Networking.v2.Layer3;
3+
using OpenStack.Serialization;
4+
5+
namespace OpenStack.Networking.v2.Serialization
6+
{
7+
/// <summary>
8+
/// Represents a collection of security group rule resources returned by the <see cref="NetworkingService"/>.
9+
/// <para>Intended for custom implementations and stubbing responses in unit tests.</para>
10+
/// </summary>
11+
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "security_group_rules")]
12+
public class SecurityGroupRuleCollection : List<SecurityGroupRule>
13+
{
14+
15+
/// <summary>
16+
/// Initializes a new instance of the<see cref="SecurityGroupRuleCollection"/> class.
17+
/// </summary>
18+
public SecurityGroupRuleCollection()
19+
{
20+
21+
}
22+
23+
/// <summary>
24+
/// Initializes a new instance of the<see cref="SecurityGroupRuleCollection"/> class.
25+
/// </summary>
26+
/// <param name="items"></param>
27+
public SecurityGroupRuleCollection(IEnumerable<SecurityGroupRule> items) : base(items)
28+
{
29+
30+
}
31+
}
32+
}

src/corelib/OpenStack.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@
200200
<Compile Include="Networking\v2\Layer3\SecurityGroupRule.cs" />
201201
<Compile Include="Networking\v2\AllowedAddress.cs" />
202202
<Compile Include="Networking\v2\AllocationPool.cs" />
203+
<Compile Include="Networking\v2\Layer3\SecurityGroupRuleListOptions.cs" />
203204
<Compile Include="Networking\v2\PortListOptions.cs" />
204205
<Compile Include="Networking\v2\HostRoute.cs" />
205206
<Compile Include="Networking\v2\IPAddressAssociation.cs" />
@@ -240,6 +241,7 @@
240241
<Compile Include="Networking\v2\Serialization\PortCollection.cs" />
241242
<Compile Include="Networking\v2\Serialization\PortDefinitionCollection.cs" />
242243
<Compile Include="Networking\v2\Serialization\SecurityGroupCollection.cs" />
244+
<Compile Include="Networking\v2\Serialization\SecurityGroupRuleCollection.cs" />
243245
<Compile Include="Networking\v2\Serialization\SubnetCollection.cs" />
244246
<Compile Include="Networking\v2\Serialization\SubnetDefinitionCollection.cs" />
245247
<Compile Include="Networking\v2\Serialization\TrafficDirection.cs" />

src/testing/unit/Networking/v2/Layer3/Layer3Tests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,28 @@ public void ListSecurityGroups()
340340
Assert.Equal(rule.Id, resultRule.Id);
341341
}
342342
}
343+
344+
[Fact]
345+
public void ListSecurityGroupRules()
346+
{
347+
using (var httpTest = new HttpTest())
348+
{
349+
Identifier securityGroupId = Guid.NewGuid();
350+
Identifier securityGroupRuleId = Guid.NewGuid();
351+
httpTest.RespondWithJson(new SecurityGroupRuleCollection
352+
{
353+
new SecurityGroupRule {Id = securityGroupRuleId, SecurityGroupId = securityGroupId}
354+
});
355+
356+
var results = _networking.ListSecurityGroupRules();
357+
358+
httpTest.ShouldHaveCalled("*/security-group-rules");
359+
Assert.Equal(1, results.Count());
360+
var result = results.First();
361+
Assert.Equal(securityGroupRuleId, result.Id);
362+
Assert.Equal(securityGroupId, result.SecurityGroupId);
363+
}
364+
}
343365
#endregion
344366

345367
}

0 commit comments

Comments
 (0)