Skip to content

Commit 150e148

Browse files
committed
Merge pull request #36 from alanquillin/ImplementListRolesPaging
Implemented the pagination filters for Roles and Servers
2 parents 9cde7f2 + 6ad3374 commit 150e148

File tree

7 files changed

+174
-16
lines changed

7 files changed

+174
-16
lines changed

src/corelib/Providers/Rackspace/CloudIdentityProvider.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,22 @@ public CloudIdentityProvider(CloudIdentity defaultIdentity, IRestService restSer
5454
_defaultIdentity = defaultIdentity;
5555
}
5656

57-
public IEnumerable<Role> ListRoles(CloudIdentity identity)
57+
public IEnumerable<Role> ListRoles(string serviceId = null, string markerId = null, int? limit = null, CloudIdentity identity = null)
5858
{
5959
var provider = GetProvider(identity);
60-
return provider.ListRoles(identity);
60+
return provider.ListRoles(serviceId, markerId, limit, identity);
6161
}
6262

63-
public Role AddRole(Role role, CloudIdentity identity)
63+
public Role AddRole(string name, string descritpion, CloudIdentity identity)
6464
{
6565
var provider = GetProvider(identity);
66-
return provider.AddRole(role, identity: identity);
66+
return provider.AddRole(name, descritpion, identity);
6767
}
6868

6969
public Role GetRole(string roleId, CloudIdentity identity)
7070
{
7171
var provider = GetProvider(identity);
72-
return provider.GetRole(roleId, identity: identity);
72+
return provider.GetRole(roleId, identity);
7373
}
7474

7575
public IEnumerable<Role> GetRolesByUser(string userId, CloudIdentity identity)

src/corelib/Providers/Rackspace/CloudServersProvider.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,18 @@ public IEnumerable<SimpleServer> ListServers(string imageId = null, string flavo
100100
{
101101
var urlPath = new Uri(string.Format("{0}/servers", GetServiceEndpoint(identity, region)));
102102

103-
var response = ExecuteRESTRequest<ListServersResponse>(identity, urlPath, HttpMethod.GET);
103+
var parameters = BuildOptionalParameterList(new Dictionary<string, string>
104+
{
105+
{"image", imageId},
106+
{"flavor", flavorId},
107+
{"name", name},
108+
{"status", status},
109+
{"marker", markerId},
110+
{"limit", !limit.HasValue ? null : limit.Value.ToString()},
111+
{"changes-since", !changesSince.HasValue ? null : changesSince.Value.ToString("yyyy-MM-ddThh:mm:ss")}
112+
});
113+
114+
var response = ExecuteRESTRequest<ListServersResponse>(identity, urlPath, HttpMethod.GET, queryStringParameter: parameters);
104115

105116
if (response == null || response.Data == null)
106117
return null;
@@ -112,8 +123,19 @@ public IEnumerable<SimpleServer> ListServers(string imageId = null, string flavo
112123
public IEnumerable<Server> ListServersWithDetails(string imageId = null, string flavorId = null, string name = null, string status = null, string markerId = null, int? limit = null, DateTime? changesSince = null, string region = null, CloudIdentity identity = null)
113124
{
114125
var urlPath = new Uri(string.Format("{0}/servers/detail", GetServiceEndpoint(identity, region)));
115-
116-
var response = ExecuteRESTRequest<ListServersResponse>(identity, urlPath, HttpMethod.GET);
126+
127+
var parameters = BuildOptionalParameterList(new Dictionary<string, string>
128+
{
129+
{"image", imageId},
130+
{"flavor", flavorId},
131+
{"name", name},
132+
{"status", status},
133+
{"marker", markerId},
134+
{"limit", !limit.HasValue ? null : limit.Value.ToString()},
135+
{"changes-since", !changesSince.HasValue ? null : changesSince.Value.ToString("yyyy-MM-ddThh:mm:ss")}
136+
});
137+
138+
var response = ExecuteRESTRequest<ListServersResponse>(identity, urlPath, HttpMethod.GET, queryStringParameter: parameters);
117139

118140
if (response == null || response.Data == null)
119141
return null;

src/corelib/Providers/Rackspace/GeographicalCloudIdentityProvider.cs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,26 @@ public GeographicalCloudIdentityProvider(Uri urlBase, CloudIdentity identity, IR
3535

3636
#region Roles
3737

38-
public IEnumerable<Role> ListRoles(CloudIdentity identity)
38+
public IEnumerable<Role> ListRoles(string serviceId = null, string markerId = null, int? limit = null, CloudIdentity identity = null)
3939
{
40-
var response = ExecuteRESTRequest<RolesResponse>(identity, "/v2.0/OS-KSADM/roles",
41-
HttpMethod.GET);
40+
var parameters = BuildOptionalParameterList(new Dictionary<string, string>
41+
{
42+
{"serviceId", serviceId},
43+
{"marker", markerId},
44+
{"limit", !limit.HasValue ? null : limit.Value.ToString()},
45+
});
46+
47+
var response = ExecuteRESTRequest<RolesResponse>(identity, "/v2.0/OS-KSADM/roles", HttpMethod.GET, queryStringParameter: parameters);
48+
4249
if (response == null || response.Data == null)
4350
return null;
4451

4552
return response.Data.Roles;
4653
}
4754

48-
public Role AddRole(Role role, CloudIdentity identity)
55+
public Role AddRole(string name, string description, CloudIdentity identity)
4956
{
50-
var response = ExecuteRESTRequest<RoleResponse>(identity, "/v2.0/OS-KSADM/roles", HttpMethod.POST, new AddRoleRequest{Role = role});
57+
var response = ExecuteRESTRequest<RoleResponse>(identity, "/v2.0/OS-KSADM/roles", HttpMethod.POST, new AddRoleRequest{Role = new Role{Name = name, Description = description}});
5158

5259
if (response == null || response.Data == null)
5360
return null;
@@ -459,5 +466,18 @@ protected T ExecuteRESTRequest<T>(CloudIdentity identity, string urlPath, HttpMe
459466

460467
return response;
461468
}
469+
470+
protected Dictionary<string, string> BuildOptionalParameterList(Dictionary<string, string> optionalParameters)
471+
{
472+
if (optionalParameters == null)
473+
return null;
474+
475+
var paramList = optionalParameters.Where(optionalParameter => !string.IsNullOrWhiteSpace(optionalParameter.Value)).ToDictionary(optionalParameter => optionalParameter.Key, optionalParameter => optionalParameter.Value);
476+
477+
if (!paramList.Any())
478+
return null;
479+
480+
return paramList;
481+
}
462482
}
463483
}

src/corelib/Providers/Rackspace/IExtendedCloudIdentityProvider.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,21 @@ public interface IExtendedCloudIdentityProvider : IIdentityProvider
1010
/// <summary>
1111
/// Lists all roles.
1212
/// </summary>
13+
/// <param name="serviceId">The ID of service to filter by.</param>
14+
/// <param name="markerId">The index of the last item in the previous list. <remarks>Used for pagination.</remarks></param>
15+
/// <param name="limit">Indicates the number of items to return <remarks>Default value depends on the provider's implemenation.</remarks><remarks>Used for pagination.</remarks></param>
1316
/// <param name="identity">The users Cloud Identity <see cref="net.openstack.Core.Domain.CloudIdentity" /><remarks>If not specified, the default identity given in the constructor will be used.</remarks></param>
1417
/// <returns>List of <see cref="Role"/></returns>
15-
IEnumerable<Role> ListRoles(CloudIdentity identity = null);
18+
IEnumerable<Role> ListRoles(string serviceId = null, string markerId = null, int? limit = null, CloudIdentity identity = null);
1619

1720
/// <summary>
1821
/// Create a new role.
1922
/// </summary>
20-
/// <param name="role">The new role.</param>
23+
/// <param name="name">The name for the new role.</param>
24+
/// <param name="description">The description for the new role.</param>
2125
/// <param name="identity">The users Cloud Identity <see cref="net.openstack.Core.Domain.CloudIdentity" /><remarks>If not specified, the default identity given in the constructor will be used.</remarks></param>
2226
/// <returns>The <see cref="Role"/></returns>
23-
Role AddRole(Role role, CloudIdentity identity = null);
27+
Role AddRole(string name, string description, CloudIdentity identity = null);
2428

2529
/// <summary>
2630
/// Retrieves the specified role
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
1+
using System.Runtime.Serialization;
12
using net.openstack.Core.Domain;
23

34
namespace net.openstack.Providers.Rackspace.Objects.Response
45
{
6+
[DataContract]
57
internal class ListServersResponse
68
{
9+
[DataMember(Name = "servers")]
710
public Server[] Servers { get; set; }
11+
12+
[DataMember(Name = "servers_links")]
13+
public ServerLink[] Links { get; set; }
14+
}
15+
16+
[DataContract]
17+
internal class ServerLink
18+
{
19+
[DataMember(Name = "href")]
20+
public string Link { get; set; }
21+
22+
[DataMember(Name = "rel")]
23+
public string Type { get; set; }
824
}
925
}

src/corelib/Providers/Rackspace/ProviderBase.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,5 +255,18 @@ private static bool IsLondonIdentity(CloudIdentity identity)
255255

256256
return rsCloudIdentity.CloudInstance == CloudInstance.UK;
257257
}
258+
259+
protected Dictionary<string, string> BuildOptionalParameterList(Dictionary<string, string> optionalParameters)
260+
{
261+
if (optionalParameters == null)
262+
return null;
263+
264+
var paramList = optionalParameters.Where(optionalParameter => !string.IsNullOrWhiteSpace(optionalParameter.Value)).ToDictionary(optionalParameter => optionalParameter.Key, optionalParameter => optionalParameter.Value);
265+
266+
if (!paramList.Any())
267+
return null;
268+
269+
return paramList;
270+
}
258271
}
259272
}

src/testing/unit/Providers/Rackspace/ProviderBaseTests.cs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,84 @@ public void Should_Return_Correct_LON_Endpoint_When_Identity_Is_Set_On_Provider_
271271
Assert.AreEqual("LON", endpoint.Region);
272272
}
273273

274+
[TestMethod]
275+
public void Should_Return_Null_While_Building_Optional_Parameter_List_When_A_Null_Value_Is_Passed()
276+
{
277+
var providerBase = new MockProvider(null, null, null);
278+
279+
var paramList = providerBase.BuildOptionalParameterList(null);
280+
281+
Assert.IsNull(paramList);
282+
}
283+
284+
[TestMethod]
285+
public void Should_Return_Null_While_Building_Optional_Parameter_List_When_An_Empty_Value_Is_Passed()
286+
{
287+
var providerBase = new MockProvider(null, null, null);
288+
289+
var paramList = providerBase.BuildOptionalParameterList(new Dictionary<string, string>());
290+
291+
Assert.IsNull(paramList);
292+
}
293+
294+
[TestMethod]
295+
public void Should_Return_Null_While_Building_Optional_Parameter_List_When_All_Values_In_List_Are_InValid()
296+
{
297+
var providerBase = new MockProvider(null, null, null);
298+
299+
var paramList = providerBase.BuildOptionalParameterList(new Dictionary<string, string>
300+
{
301+
{"key1", ""},
302+
{"key2", null},
303+
{"key3", ""},
304+
{"key4", null},
305+
});
306+
307+
Assert.IsNull(paramList);
308+
}
309+
310+
[TestMethod]
311+
public void Should_Return_All_Parameters_While_Building_Optional_Parameter_List_When_All_Values_In_List_Are_Valid()
312+
{
313+
var providerBase = new MockProvider(null, null, null);
314+
315+
var paramList = providerBase.BuildOptionalParameterList(new Dictionary<string, string>
316+
{
317+
{"key1", "val1"},
318+
{"key2", "val2"},
319+
{"key3", "val3"},
320+
{"key4", "val4"},
321+
});
322+
323+
Assert.AreEqual(4, paramList.Count);
324+
Assert.IsTrue(paramList.Any(p => p.Key == "key1" && p.Value == "val1"));
325+
Assert.IsTrue(paramList.Any(p => p.Key == "key2" && p.Value == "val2"));
326+
Assert.IsTrue(paramList.Any(p => p.Key == "key3" && p.Value == "val3"));
327+
Assert.IsTrue(paramList.Any(p => p.Key == "key4" && p.Value == "val4"));
328+
}
329+
330+
[TestMethod]
331+
public void Should_Return_Only_Valid_Parameters_While_Building_Optional_Parameter_List_When_Some_Values_In_List_Are_Valid()
332+
{
333+
var providerBase = new MockProvider(null, null, null);
334+
335+
var paramList = providerBase.BuildOptionalParameterList(new Dictionary<string, string>
336+
{
337+
{"key1", "val1"},
338+
{"key2", ""},
339+
{"key3", "val3"},
340+
{"key4", null},
341+
});
342+
343+
Assert.AreEqual(2, paramList.Count);
344+
Assert.IsTrue(paramList.Any(p => p.Key == "key1" && p.Value == "val1"));
345+
Assert.IsFalse(paramList.Any(p => p.Key == "key2" && p.Value == "val2"));
346+
Assert.IsTrue(paramList.Any(p => p.Key == "key3" && p.Value == "val3"));
347+
Assert.IsFalse(paramList.Any(p => p.Key == "key4" && p.Value == "val4"));
348+
}
349+
350+
351+
274352
public class MockProvider : ProviderBase<IIdentityProvider>
275353
{
276354
internal MockProvider(CloudIdentity defaultIdentity, IIdentityProvider identityProvider, IRestService restService) : base(defaultIdentity, identityProvider, restService)
@@ -286,6 +364,11 @@ protected override IIdentityProvider BuildProvider(CloudIdentity identity)
286364
{
287365
throw new NotImplementedException();
288366
}
367+
368+
public Dictionary<string, string> BuildOptionalParameterList(Dictionary<string, string> optionalParameters)
369+
{
370+
return base.BuildOptionalParameterList(optionalParameters);
371+
}
289372
}
290373
}
291374
}

0 commit comments

Comments
 (0)