Skip to content

Commit 6bc6e92

Browse files
author
Alan Quillin
committed
[Delivers #43555597 #43555601] Added Tests for Identity Service: Authenticate, GetUserByName, GetUser and ListUsers
1 parent bd271ec commit 6bc6e92

50 files changed

Lines changed: 16723 additions & 137 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/console/Program.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
2-
using net.openstack.Core;
3-
using net.openstack.Core.Domain;
4-
using net.openstack.Core.Exceptions.Response;
2+
using System.Collections.Generic;
3+
using System.IO;
54
using net.openstack.Providers.Rackspace;
65

76
namespace net.openstack.console

src/corelib/Core/Domain/UserCredential.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class UserCredential
88
[DataMember(Name = "username")]
99
public string Username { get; set; }
1010

11-
[DataMember(Name = "apikey")]
11+
[DataMember(Name = "apiKey")]
1212
public string APIKey { get; set; }
1313
}
1414
}

src/corelib/Core/IIdentityProvider.cs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,20 @@ namespace net.openstack.Core
44
{
55
public interface IIdentityProvider
66
{
7-
UserAccess Authenticate(CloudIdentity identity, bool forceCacheRefresh = false);
8-
9-
Role[] ListRoles(CloudIdentity identity);
10-
Role AddRole(CloudIdentity identity, Role role);
11-
Role GetRole(CloudIdentity identity, string roleId);
12-
Role[] GetRolesByUser(CloudIdentity identity, string userId);
13-
bool AddRoleToUser(CloudIdentity identity, string userId, string roleId);
14-
bool DeleteRoleFromUser(CloudIdentity identity, string userId, string roleId);
7+
UserAccess Authenticate(CloudIdentity identity);
158
string GetToken(CloudIdentity identity, bool forceCacheRefresh = false);
169
IdentityToken GetTokenInfo(CloudIdentity identity, bool forceCacheRefresh = false);
17-
10+
11+
Role[] GetRolesByUser(CloudIdentity identity, string userId);
12+
1813
User[] ListUsers(CloudIdentity identity);
1914
User GetUserByName(CloudIdentity identity, string name);
2015
User GetUser(CloudIdentity identity, string id);
2116
User AddUser(CloudIdentity identity, User user);
2217
User UpdateUser(CloudIdentity identity, User user);
2318
bool DeleteUser(CloudIdentity identity, string userId);
2419

25-
bool SetUserPassword(CloudIdentity identity, string userId, string password);
26-
2720
UserCredential[] ListUserCredentials(CloudIdentity identity, string userId);
28-
UserCredential UpdateUserCredentials(CloudIdentity identity, string userId);
29-
bool DeleteUserCredentials(CloudIdentity identity, string userId);
3021

3122
Tenant[] ListTenants(CloudIdentity identity);
3223
}

src/corelib/Properties/AssemblyInfo.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@
3434
// [assembly: AssemblyVersion("1.0.*")]
3535
[assembly: AssemblyVersion("1.0.0.0")]
3636
[assembly: AssemblyFileVersion("1.0.0.0")]
37+
38+
[assembly: InternalsVisibleTo("OpenStackNet.Testing.Integration")]
39+
[assembly: InternalsVisibleTo("OpenStackNet.Testing.Unit")]

src/corelib/Providers/Rackspace/GeographicalIdentityProvider.cs

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using Newtonsoft.Json;
45
using Newtonsoft.Json.Linq;
56
using SimpleRestServices.Client;
67
using SimpleRestServices.Client.Json;
7-
using net.openstack.Core;
88
using net.openstack.Core.Domain;
99
using net.openstack.Core.Exceptions;
1010
using net.openstack.Providers.Rackspace.Objects.Request;
1111
using net.openstack.Providers.Rackspace.Objects.Response;
1212

1313
namespace net.openstack.Providers.Rackspace
1414
{
15-
internal class GeographicalIdentityProvider : IIdentityProvider
15+
internal class GeographicalIdentityProvider : IExtendedIdentityProvider
1616
{
1717
private readonly IRestService _restService;
1818
private readonly ICache<UserAccess> _userAccessCache;
@@ -97,24 +97,40 @@ public bool DeleteRoleFromUser(CloudIdentity identity, string userId, string rol
9797

9898
public bool SetUserPassword(CloudIdentity identity, string userId, string password)
9999
{
100-
var urlPath = string.Format("v2.0/users/{0}/OS-KSADM/credentials", userId);
101-
var response = ExecuteRESTRequest<RoleResponse>(identity, urlPath, HttpMethod.GET);
100+
var user = GetUser(identity, userId);
102101

103-
if (response == null || response.StatusCode != 201)
102+
var urlPath = string.Format("v2.0/users/{0}/OS-KSADM/credentials", userId);
103+
var request = new SetPasswordRequest
104+
{
105+
PasswordCredencial =
106+
new PasswordCredencial {Username = user.Username, Password = password}
107+
};
108+
var response = ExecuteRESTRequest<PasswordCredencialResponse>(identity, urlPath, HttpMethod.POST, request);
109+
110+
if (response == null || response.StatusCode != 201 || response.Data == null)
104111
return false;
105112

106-
return true;
113+
return response.Data.PasswordCredencial.Password.Equals(password);
107114
}
108115

109116
public UserCredential[] ListUserCredentials(CloudIdentity identity, string userId)
110117
{
111-
throw new NotImplementedException();
118+
var urlPath = string.Format("v2.0/users/{0}/OS-KSADM/credentials", userId);
119+
var response = ExecuteRESTRequest<UserCredentialsResponse>(identity, urlPath, HttpMethod.GET);
120+
121+
if (response == null || response.Data == null)
122+
return null;
123+
124+
return response.Data.Credentials.Select(c => c.UserCredential).ToArray();
112125
}
113126

114-
public UserCredential UpdateUserCredentials(CloudIdentity identity, string userId)
127+
public UserCredential UpdateUserCredentials(CloudIdentity identity, string userId, string apiKey)
115128
{
129+
var user = GetUser(identity, userId);
130+
116131
var urlPath = string.Format("v2.0/users/{0}/OS-KSADM/credentials/RAX-KSKEY:apiKeyCredentials", userId);
117-
var response = ExecuteRESTRequest<UserCredentialResponse>(identity, urlPath, HttpMethod.POST);
132+
var request = new UpdateUserCredencialRequest { UserCredential = new UserCredential { Username = user.Username, APIKey = apiKey } };
133+
var response = ExecuteRESTRequest<UserCredentialResponse>(identity, urlPath, HttpMethod.POST, request);
118134

119135
if (response == null || response.Data == null)
120136
return null;
@@ -144,6 +160,18 @@ public User[] ListUsers(CloudIdentity identity)
144160
if (response == null || response.Data == null)
145161
return null;
146162

163+
// Due to the fact the sometimes the API returns a JSON array of users and sometimes it returns a single JSON user object.
164+
// Therefore if we get a null data object (which indicates that the deserializer could not parse to an array) we need to try and parse as a single User object.
165+
if(response.Data.Users == null)
166+
{
167+
var userResponse = JsonConvert.DeserializeObject<UserResponse>(response.RawBody);
168+
169+
if (response == null || response.Data == null)
170+
return null;
171+
172+
return new[] {userResponse.User};
173+
}
174+
147175
return response.Data.Users;
148176
}
149177

@@ -222,7 +250,7 @@ public Tenant[] ListTenants(CloudIdentity identity)
222250

223251
public string GetToken(CloudIdentity idenity, bool forceCacheRefresh = false)
224252
{
225-
var auth = Authenticate(idenity, forceCacheRefresh);
253+
var auth = GetUserAccess(idenity, forceCacheRefresh);
226254

227255
if (auth == null || auth.Token == null)
228256
return null;
@@ -232,7 +260,7 @@ public string GetToken(CloudIdentity idenity, bool forceCacheRefresh = false)
232260

233261
public string GetToken(RackspaceImpersonationIdentity identity, bool forceCacheRefresh = false)
234262
{
235-
var auth = Authenticate(identity, forceCacheRefresh);
263+
var auth = GetUserAccess(identity, forceCacheRefresh);
236264

237265
if (auth == null || auth.Token == null)
238266
return null;
@@ -242,31 +270,34 @@ public string GetToken(RackspaceImpersonationIdentity identity, bool forceCacheR
242270

243271
public IdentityToken GetTokenInfo(CloudIdentity identity, bool forceCacheRefresh = false)
244272
{
245-
var auth = Authenticate(identity, forceCacheRefresh);
273+
var auth = GetUserAccess(identity, forceCacheRefresh);
246274

247275
if (auth == null)
248276
return null;
249277

250278
return auth.Token;
251279
}
252280

253-
public UserAccess Authenticate(CloudIdentity identity, bool forceCacheRefresh = false)
281+
public UserAccess Authenticate(CloudIdentity identity)
254282
{
255-
var usIdentity = identity as RackspaceCloudIdentity;
283+
var auth = AuthRequest.FromCloudIdentity(identity);
284+
var response = ExecuteRESTRequest<AuthenticationResponse>(identity, "/v2.0/tokens", HttpMethod.POST, auth, isTokenRequest: true);
256285

257-
if(usIdentity == null)
258-
throw new InvalidCloudIdentityException(string.Format("Invalid Identity object. Rackspace Identity service requires an instance of type: {0}", typeof(RackspaceCloudIdentity)));
259286

260-
var userAccess = _userAccessCache.Get(string.Format("{0}/{1}", usIdentity.CloudInstance, usIdentity.Username), () => {
261-
var auth = AuthRequest.FromCloudIdentity(usIdentity);
262-
var response = ExecuteRESTRequest<AuthenticationResponse>(usIdentity, "/v2.0/tokens", HttpMethod.POST, auth, isTokenRequest: true);
287+
if (response == null || response.Data == null || response.Data.UserAccess == null || response.Data.UserAccess.Token == null)
288+
return null;
263289

290+
return response.Data.UserAccess;
291+
}
264292

265-
if (response == null || response.Data == null || response.Data.UserAccess == null || response.Data.UserAccess.Token == null)
266-
return null;
293+
private UserAccess GetUserAccess(CloudIdentity identity, bool forceCacheRefresh = false)
294+
{
295+
var rackspaceCloudIdentity = identity as RackspaceCloudIdentity;
267296

268-
return response.Data.UserAccess;
269-
}, forceCacheRefresh);
297+
if (rackspaceCloudIdentity == null)
298+
throw new InvalidCloudIdentityException(string.Format("Invalid Identity object. Rackspace Identity service requires an instance of type: {0}", typeof(RackspaceCloudIdentity)));
299+
300+
var userAccess = _userAccessCache.Get(string.Format("{0}/{1}", rackspaceCloudIdentity.CloudInstance, rackspaceCloudIdentity.Username), () => Authenticate(rackspaceCloudIdentity), forceCacheRefresh);
270301

271302
return userAccess;
272303
}
@@ -332,6 +363,8 @@ protected virtual Response ExecuteRESTRequest(CloudIdentity identity, string url
332363
return ExecuteRESTRequest<T>(identity,urlPath, method, body, queryStringParameter, true, isTokenRequest, GetToken(identity));
333364
}
334365

366+
ProviderBase.CheckResponse(response);
367+
335368
return response;
336369
}
337370
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using net.openstack.Core;
2+
using net.openstack.Core.Domain;
3+
4+
namespace net.openstack.Providers.Rackspace
5+
{
6+
public interface IExtendedIdentityProvider : IIdentityProvider
7+
{
8+
Role[] ListRoles(CloudIdentity identity);
9+
Role AddRole(CloudIdentity identity, Role role);
10+
Role GetRole(CloudIdentity identity, string roleId);
11+
bool AddRoleToUser(CloudIdentity identity, string userId, string roleId);
12+
bool DeleteRoleFromUser(CloudIdentity identity, string userId, string roleId);
13+
14+
UserCredential UpdateUserCredentials(CloudIdentity identity, string userId, string apiKey);
15+
bool DeleteUserCredentials(CloudIdentity identity, string userId);
16+
bool SetUserPassword(CloudIdentity identity, string userId, string password);
17+
}
18+
}

src/corelib/Providers/Rackspace/IdentityProvider.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
using SimpleRestServices.Client;
2-
using net.openstack.Core;
32
using net.openstack.Core.Domain;
43
using net.openstack.Core.Exceptions;
54

65
namespace net.openstack.Providers.Rackspace
76
{
8-
public class IdentityProvider : IIdentityProvider
7+
public class IdentityProvider : IExtendedIdentityProvider
98
{
109
private readonly IdentityProviderFactory _factory;
1110

12-
public IdentityProvider(IRestService restService = null, ICache<UserAccess> tokenCache = null)
11+
public IdentityProvider(IRestService restService = null, ICache<UserAccess> tokenCache = null, string usInstanceUrlBase = null, string ukInstanceUrlBase = null)
1312
{
14-
_factory = new IdentityProviderFactory(restService, tokenCache);
13+
_factory = new IdentityProviderFactory(restService, tokenCache, usInstanceUrlBase, ukInstanceUrlBase);
1514
}
1615

1716
public Role[] ListRoles(CloudIdentity identity)
@@ -50,10 +49,10 @@ public User GetUserByName(CloudIdentity identity, string name)
5049
return provider.GetUserByName(identity, name);
5150
}
5251

53-
public UserAccess Authenticate(CloudIdentity identity, bool forceCacheRefresh = false)
52+
public UserAccess Authenticate(CloudIdentity identity)
5453
{
5554
var provider = GetProvider(identity);
56-
return provider.Authenticate(identity, forceCacheRefresh);
55+
return provider.Authenticate(identity);
5756
}
5857

5958
public bool AddRoleToUser(CloudIdentity identity, string userId, string roleId)
@@ -98,10 +97,10 @@ public UserCredential[] ListUserCredentials(CloudIdentity identity, string userI
9897
return provider.ListUserCredentials(identity, userId);
9998
}
10099

101-
public UserCredential UpdateUserCredentials(CloudIdentity identity, string userId)
100+
public UserCredential UpdateUserCredentials(CloudIdentity identity, string userId, string apiKey)
102101
{
103102
var provider = GetProvider(identity);
104-
return provider.UpdateUserCredentials(identity, userId);
103+
return provider.UpdateUserCredentials(identity, userId, apiKey);
105104
}
106105

107106
public bool DeleteUserCredentials(CloudIdentity identity, string userId)
@@ -134,7 +133,7 @@ public IdentityToken GetTokenInfo(CloudIdentity identity, bool forceCacheRefresh
134133
return provider.GetTokenInfo(identity);
135134
}
136135

137-
private IIdentityProvider GetProvider(CloudIdentity identity)
136+
private IExtendedIdentityProvider GetProvider(CloudIdentity identity)
138137
{
139138
var rackspaceCloudIdentity = identity as RackspaceCloudIdentity;
140139

src/corelib/Providers/Rackspace/IdentityProviderFactory.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,30 @@
77

88
namespace net.openstack.Providers.Rackspace
99
{
10-
internal class IdentityProviderFactory : IProviderFactory<IIdentityProvider, CloudInstance>
10+
internal class IdentityProviderFactory : IProviderFactory<IExtendedIdentityProvider, CloudInstance>
1111
{
12-
private const string USIdentityUrlBase = "https://identity.api.rackspacecloud.com";
13-
private const string LONIdentityUrlBase = "https://lon.identity.api.rackspacecloud.com";
12+
private readonly string USIdentityUrlBase;
13+
private readonly string LONIdentityUrlBase;
1414

1515
private readonly ICache<UserAccess> _tokenCache;
1616
private readonly IRestService _restService;
1717

18-
public IdentityProviderFactory(IRestService restService = null, ICache<UserAccess> tokenCache = null)
18+
public IdentityProviderFactory(IRestService restService = null, ICache<UserAccess> tokenCache = null, string usInstanceUrlBase = null, string ukInstanceUrlBase = null)
1919
{
2020
if (restService == null)
2121
restService = new JsonRestServices();
2222

2323
if (tokenCache == null)
2424
tokenCache = UserAccessCache.Instance;
2525

26+
USIdentityUrlBase = string.IsNullOrWhiteSpace(usInstanceUrlBase) ? "https://identity.api.rackspacecloud.com" : usInstanceUrlBase;
27+
LONIdentityUrlBase = string.IsNullOrWhiteSpace(ukInstanceUrlBase) ? "https://lon.identity.api.rackspacecloud.com" : ukInstanceUrlBase;
28+
2629
_restService = restService;
2730
_tokenCache = tokenCache;
2831
}
2932

30-
public IIdentityProvider Get(CloudInstance cloudInstance)
33+
public IExtendedIdentityProvider Get(CloudInstance cloudInstance)
3134
{
3235
switch (cloudInstance)
3336
{

src/corelib/Providers/Rackspace/Objects/AuthDetails.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace net.openstack.Providers.Rackspace.Objects
44
{
55
[DataContract]
6-
public class AuthDetails
6+
internal class AuthDetails
77
{
88
[DataMember(Name = "passwordCredentials", EmitDefaultValue = true)]
99
public Credentials PasswordCredentials { get; set; }

src/corelib/Providers/Rackspace/Objects/Credentials.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace net.openstack.Providers.Rackspace.Objects
44
{
55
[DataContract]
6-
public class Credentials
6+
internal class Credentials
77
{
88
[DataMember(Name="username", EmitDefaultValue = true)]
99
public string Username { get; set; }

0 commit comments

Comments
 (0)