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
Binary file modified lib/SimpleRestServices.dll
Binary file not shown.
Binary file modified lib/SimpleRestServices.pdb
Binary file not shown.
23 changes: 23 additions & 0 deletions src/corelib/Core/Domain/NewUser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Runtime.Serialization;

namespace net.openstack.Core.Domain
{
[DataContract]
public class NewUser
{
[DataMember(Name = "OS-KSADM:password")]
public string Password { get; set; }

[DataMember(Name = "id", EmitDefaultValue = true)]
public string Id { get; set; }

[DataMember(Name = "username")]
public string Username { get; set; }

[DataMember(Name = "email")]
public string Email { get; set; }

[DataMember(Name = "enabled")]
public bool Enabled { get; set; }
}
}
10 changes: 4 additions & 6 deletions src/corelib/Core/Domain/User.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,19 @@ namespace net.openstack.Core.Domain
[DataContract]
public class User
{

[DataMember(Name = "RAX-AUTH:defaultRegion")]
public string DefaultRegion { get; set; }

[DataMember]
[DataMember(Name="id", EmitDefaultValue = true)]
public string Id { get; set; }

[DataMember]
[DataMember(Name="username")]
public string Username { get; set; }

[DataMember]
[DataMember(Name="email")]
public string Email { get; set; }

[DataMember]
[DataMember(Name = "enabled")]
public bool Enabled { get; set; }

}
}
2 changes: 1 addition & 1 deletion src/corelib/Core/IIdentityProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface IIdentityProvider
User[] ListUsers(CloudIdentity identity);
User GetUserByName(CloudIdentity identity, string name);
User GetUser(CloudIdentity identity, string id);
User AddUser(CloudIdentity identity, User user);
NewUser AddUser(CloudIdentity identity, NewUser user);
User UpdateUser(CloudIdentity identity, User user);
bool DeleteUser(CloudIdentity identity, string userId);

Expand Down
18 changes: 14 additions & 4 deletions src/corelib/Providers/Rackspace/GeographicalIdentityProvider.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SimpleRestServices.Client;
Expand Down Expand Up @@ -215,18 +216,27 @@ public User GetUser(CloudIdentity identity, string userId)
return response.Data.User;
}

public User AddUser(CloudIdentity identity, User user)
public NewUser AddUser(CloudIdentity identity, NewUser newUser)
{
var response = ExecuteRESTRequest<UserResponse>(identity, "/v2.0/users", HttpMethod.POST, new AddUserRequest { User = user });
newUser.Id = null;

var response = ExecuteRESTRequest<NewUserResponse>(identity, "/v2.0/users", HttpMethod.POST, new AddUserRequest { User = newUser });

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

return response.Data.User;
// If the user specifies a password, then the password will not be in the response, so we need to fill it in on the return object.
if (string.IsNullOrWhiteSpace(response.Data.NewUser.Password))
response.Data.NewUser.Password = newUser.Password;

return response.Data.NewUser;
}

public User UpdateUser(CloudIdentity identity, User user)
{
if(user == null || string.IsNullOrWhiteSpace(user.Id))
throw new ArgumentException("The User or User.Id values cannot be null.");

var urlPath = string.Format("v2.0/users/{0}", user.Id);

var updateUserRequest = new UpdateUserRequest { User = user };
Expand Down Expand Up @@ -378,7 +388,7 @@ protected virtual Response ExecuteRESTRequest(CloudIdentity identity, string url
bodyStr = JsonConvert.SerializeObject(body, new JsonSerializerSettings{NullValueHandling = NullValueHandling.Ignore});
}

var response = _restService.Execute<T>(url, method, bodyStr, headers, queryStringParameter, new JsonRequestSettings() { RetryCount = retryCount, RetryDelayInMS = retryDelay, Non200SuccessCodes = new[] { 401, 409 } });
var response = _restService.Execute<T>(url, method, bodyStr, headers, queryStringParameter, new JsonRequestSettings() { RetryCount = retryCount, RetryDelayInMS = retryDelay, Non200SuccessCodes = new[] { 401, 409 }, UserAgent = ProviderBase.GetUserAgentHeaderValue()});

// on errors try again 1 time.
if (response.StatusCode == 401 && !isRetry && !isTokenRequest)
Expand Down
6 changes: 3 additions & 3 deletions src/corelib/Providers/Rackspace/IdentityProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ public User GetUser(CloudIdentity identity, string userId)
return provider.GetUser(identity, userId);
}

public User AddUser(CloudIdentity identity, User user)
public NewUser AddUser(CloudIdentity identity, NewUser newUser)
{
var provider = GetProvider(identity);
return provider.AddUser(identity, user);
return provider.AddUser(identity, newUser);
}

public User UpdateUser(CloudIdentity identity, User user)
Expand Down Expand Up @@ -168,7 +168,7 @@ private IExtendedIdentityProvider GetProvider(CloudIdentity identity)
var rackspaceCloudIdentity = identity as RackspaceCloudIdentity;

if (rackspaceCloudIdentity == null)
throw new InvalidCloudIdentityException(string.Format("Invalid Identity object. Rackspace Identoty service requires an instance of type: {0}", typeof(RackspaceCloudIdentity)));
_factory.Get(CloudInstance.Default);

return _factory.Get(rackspaceCloudIdentity.CloudInstance);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ namespace net.openstack.Providers.Rackspace.Objects.Request
internal class AddUserRequest
{
[DataMember(Name = "user")]
public User User { get; set; }
public NewUser User { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using net.openstack.Core.Domain;

namespace net.openstack.Providers.Rackspace.Objects.Request
{
[DataContract]
internal class UpdateUserRequest
{
[DataMember(Name = "user")]
public User User { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Runtime.Serialization;
using net.openstack.Core.Domain;

namespace net.openstack.Providers.Rackspace.Objects.Response
{
[DataContract]
internal class NewUserResponse
{
[DataMember(Name = "user")]
public NewUser NewUser { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
using System.Runtime.Serialization;
using net.openstack.Core.Domain;

namespace net.openstack.Providers.Rackspace.Objects.Response
{
[DataContract]
internal class UserResponse
{
[DataMember(Name = "user")]
public User User { get; set; }
}
}
18 changes: 17 additions & 1 deletion src/corelib/Providers/Rackspace/ProviderBase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SimpleRestServices.Client;
Expand All @@ -16,6 +17,7 @@ public class ProviderBase
{
private readonly IIdentityProvider _identityProvider;
private readonly IRestService _restService;
private static Version _currentVersion;

protected ProviderBase(IIdentityProvider identityProvider, IRestService restService)
{
Expand All @@ -42,6 +44,9 @@ protected Response<T> ExecuteRESTRequest<T>(CloudIdentity identity, Uri absolute
bodyStr = JsonConvert.SerializeObject(body, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
}

if (string.IsNullOrWhiteSpace(requestSettings.UserAgent))
requestSettings.UserAgent = GetUserAgentHeaderValue();

var response = _restService.Execute<T>(absoluteUri, method, bodyStr, headers, queryStringParameter, requestSettings);

// on errors try again 1 time.
Expand Down Expand Up @@ -77,6 +82,9 @@ protected Response ExecuteRESTRequest(CloudIdentity identity, Uri absoluteUri, H
bodyStr = JsonConvert.SerializeObject(body, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
}

if (string.IsNullOrWhiteSpace(requestSettings.UserAgent))
requestSettings.UserAgent = GetUserAgentHeaderValue();

var response = _restService.Execute(absoluteUri, method, bodyStr, headers, queryStringParameter, requestSettings);

// on errors try again 1 time.
Expand All @@ -99,7 +107,7 @@ internal JsonRequestSettings BuildDefaultRequestSettings(IEnumerable<int> non200
if(non200SuccessCodes != null)
non200SuccessCodesAggregate.AddRange(non200SuccessCodes);

return new JsonRequestSettings { RetryCount = 2, RetryDelayInMS = 200, Non200SuccessCodes = non200SuccessCodesAggregate};
return new JsonRequestSettings { RetryCount = 2, RetryDelayInMS = 200, Non200SuccessCodes = non200SuccessCodesAggregate, UserAgent = GetUserAgentHeaderValue()};
}

protected virtual string GetServiceEndpoint(CloudIdentity identity, string serviceName, string region = null)
Expand Down Expand Up @@ -150,5 +158,13 @@ internal static void CheckResponse(Response response)
throw new ServiceUnavailableException(response);
}
}

internal static string GetUserAgentHeaderValue()
{
if (_currentVersion == null)
_currentVersion = Assembly.GetExecutingAssembly().GetName().Version;

return string.Format("openstack.net/{0}", _currentVersion.ToString());
}
}
}
2 changes: 2 additions & 0 deletions src/corelib/corelib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
<Compile Include="Core\Domain\Mapping\IObjectMapper.cs" />
<Compile Include="Core\Domain\Mapping\MetaDataJsonMapper.cs" />
<Compile Include="Core\Domain\Network.cs" />
<Compile Include="Core\Domain\NewUser.cs" />
<Compile Include="Core\Domain\Personality.cs" />
<Compile Include="Core\Domain\RebootType.cs" />
<Compile Include="Core\Domain\ServerAddresses.cs" />
Expand Down Expand Up @@ -101,6 +102,7 @@
<Compile Include="Providers\Rackspace\Objects\AuthDetails.cs" />
<Compile Include="Providers\Rackspace\Objects\Request\CreateServerRequest.cs" />
<Compile Include="Providers\Rackspace\Objects\Response\CreateServerResponse.cs" />
<Compile Include="Providers\Rackspace\Objects\Response\NewUserResponse.cs" />
<Compile Include="Providers\Rackspace\Objects\Response\PasswordCredencialResponse.cs" />
<Compile Include="Providers\Rackspace\Objects\Response\TenantsResponse.cs" />
<Compile Include="Providers\Rackspace\Objects\Response\UserCredentialResponse.cs" />
Expand Down
16 changes: 13 additions & 3 deletions src/testing/integration/Providers/Rackspace/ComputeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -333,12 +333,22 @@ public void Test025_Should_Successfully_To_And_Login_With_New_Password()
{
var provider = new net.openstack.Providers.Rackspace.ComputeProvider();
var serverDetails = provider.GetDetails(_testIdentity, _testServer.Id);
using(var client = new Renci.SshNet.SshClient(serverDetails.AccessIPv4, "root", NewPassword))
bool sucess = false;
for (int i = 0; i < 10; i++ )
{
client.Connect();
using (var client = new Renci.SshNet.SshClient(serverDetails.AccessIPv4, "root", NewPassword))
{
client.Connect();

Assert.IsTrue(client.IsConnected);
sucess = client.IsConnected;

if (sucess)
break;
}
Thread.Sleep(1000);
}

Assert.IsTrue(sucess);
}

[TestMethod]
Expand Down
Loading