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
103 changes: 101 additions & 2 deletions src/corelib/Compute/v2_1/ComputeApiBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1151,15 +1151,15 @@ public virtual async Task<TPage> ListImageDetailsAsync<TPage>(Url url, Cancellat
public virtual async Task<T> ListSecurityGroupsAsync<T>(string serverId = null, CancellationToken cancellationToken = default(CancellationToken))
where T : IEnumerable<IServiceResource>
{
var result = await BuildListSecurityGropusAsync(serverId, cancellationToken)
var result = await BuildListSecurityGroupsAsync(serverId, cancellationToken)
.SendAsync()
.ReceiveJson<T>();
result.PropogateOwner(this);
return result;
}

/// <summary />
public virtual async Task<PreparedRequest> BuildListSecurityGropusAsync(string serverId = null, CancellationToken cancellationToken = default(CancellationToken))
public virtual async Task<PreparedRequest> BuildListSecurityGroupsAsync(string serverId = null, CancellationToken cancellationToken = default(CancellationToken))
{
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);

Expand Down Expand Up @@ -1246,6 +1246,105 @@ public virtual async Task<TPage> ListImageDetailsAsync<TPage>(Url url, Cancellat

#endregion

#region Server Groups

/// <summary />
public virtual async Task<T> GetServerGroupAsync<T>(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
where T : IServiceResource
{
var result = await BuildGetServerGroupsAsync(serverGroupId, cancellationToken)
.SendAsync()
.ReceiveJson<T>();
result.PropogateOwner(this);
return result;
}

/// <summary />
public virtual async Task<PreparedRequest> BuildGetServerGroupsAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
{
if (serverGroupId == null)
throw new ArgumentNullException("serverGroupId");

Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);

return endpoint
.AppendPathSegment($"os-server-groups/{serverGroupId}")
.Authenticate(AuthenticationProvider)
.SetMicroversion(this)
.PrepareGet(cancellationToken);
}

/// <summary />
public virtual async Task<T> CreateServerGroupAsync<T>(object serverGroup, CancellationToken cancellationToken = default(CancellationToken))
where T : IServiceResource
{
var result = await BuildCreateServerGroupAsync(serverGroup, cancellationToken).SendAsync().ReceiveJson<T>();
result.PropogateOwner(this);
return result;
}

/// <summary />
public virtual async Task<PreparedRequest> BuildCreateServerGroupAsync(object serverGroup, CancellationToken cancellationToken = default(CancellationToken))
{
if (serverGroup == null)
throw new ArgumentNullException("serverGroup");

Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);

return endpoint
.AppendPathSegments("os-server-groups")
.Authenticate(AuthenticationProvider)
.SetMicroversion(this)
.PreparePostJson(serverGroup, cancellationToken);
}

/// <summary />
public virtual async Task<T> ListServerGroupsAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
where T : IEnumerable<IServiceResource>
{
var result = await BuildListServerGroupsAsync(cancellationToken)
.SendAsync()
.ReceiveJson<T>();
result.PropogateOwner(this);
return result;
}

/// <summary />
public virtual async Task<PreparedRequest> BuildListServerGroupsAsync(CancellationToken cancellationToken = default(CancellationToken))
{
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);

return endpoint
.AppendPathSegment("os-server-groups")
.Authenticate(AuthenticationProvider)
.SetMicroversion(this)
.PrepareGet(cancellationToken);
}

/// <summary />
public virtual Task DeleteServerGroupAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
{
return BuildDeleteServerGroupAsync(serverGroupId, cancellationToken).SendAsync();
}

/// <summary />
public virtual async Task<PreparedRequest> BuildDeleteServerGroupAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
{
if (serverGroupId == null)
throw new ArgumentNullException("serverGroupId");

Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);

return (PreparedRequest)endpoint
.AppendPathSegment($"os-server-groups/{serverGroupId}")
.Authenticate(AuthenticationProvider)
.SetMicroversion(this)
.PrepareDelete(cancellationToken)
.AllowHttpStatus(HttpStatusCode.NotFound);
}

#endregion

#region Compute Service
/// <summary />
public virtual Task<T> GetLimitsAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
Expand Down
28 changes: 28 additions & 0 deletions src/corelib/Compute/v2_1/ComputeService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,34 @@ public ComputeService(IAuthenticationProvider authenticationProvider, string reg

#endregion

#region Sever Groups

/// <inheritdoc cref="ComputeApiBuilder.GetServerGroupAsync{T}" />
public Task<ServerGroup> GetServerGroupAsync(Identifier serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
{
return _computeApi.GetServerGroupAsync<ServerGroup>(serverGroupId, cancellationToken);
}

/// <inheritdoc cref="ComputeApiBuilder.CreateServerGroupAsync{T}" />
public Task<ServerGroup> CreateServerGroupAsync(ServerGroupDefinition serverGroup, CancellationToken cancellationToken = default(CancellationToken))
{
return _computeApi.CreateServerGroupAsync<ServerGroup>(serverGroup, cancellationToken);
}

/// <inheritdoc cref="ComputeApiBuilder.ListServerGroupsAsync{T}" />
public async Task<IEnumerable<ServerGroup>> ListServerGroupsAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return await _computeApi.ListServerGroupsAsync<ServerGroupCollection>(cancellationToken);
}

/// <inheritdoc cref="ComputeApiBuilder.DeleteServerGroupAsync" />
public Task DeleteServerGroupAsync(Identifier serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
{
return _computeApi.DeleteServerGroupAsync(serverGroupId, cancellationToken);
}

#endregion

#region Compute Service
/// <inheritdoc cref="ComputeApiBuilder.GetLimitsAsync{T}" />
public Task<ServiceLimits> GetLimitsAsync(CancellationToken cancellationToken = default(CancellationToken))
Expand Down
28 changes: 28 additions & 0 deletions src/corelib/Compute/v2_1/ComputeServiceExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,34 @@ public static void DeleteSecurityGroup(this ComputeService service, Identifier s

#endregion

#region Server Groups

/// <inheritdoc cref="ComputeService.GetServerGroupAsync" />
public static ServerGroup GetServerGroup(this ComputeService service, Identifier severGroupId)
{
return service.GetServerGroupAsync(severGroupId).ForceSynchronous();
}

/// <inheritdoc cref="ComputeService.CreateServerGroupAsync" />
public static ServerGroup CreateServerGroup(this ComputeService service, ServerGroupDefinition severGroup)
{
return service.CreateServerGroupAsync(severGroup).ForceSynchronous();
}

/// <inheritdoc cref="ComputeService.ListServerGroupsAsync" />
public static IEnumerable<ServerGroup> ListServerGroups(this ComputeService service)
{
return service.ListServerGroupsAsync().ForceSynchronous();
}

/// <inheritdoc cref="ComputeService.DeleteServerGroupAsync" />
public static void DeleteServerGroup(this ComputeService service, Identifier severGroupId)
{
service.DeleteServerGroupAsync(severGroupId).ForceSynchronous();
}

#endregion

#region Compute Service
/// <inheritdoc cref="ComputeService.GetLimitsAsync" />
public static ServiceLimits GetLimits(this ComputeService service)
Expand Down
10 changes: 10 additions & 0 deletions src/corelib/Compute/v2_1/SchedulerHints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,15 @@ public SchedulerHints()
/// <summary />
[JsonExtensionData]
public IDictionary<string, JToken> Data { get; set; } = new Dictionary<string, JToken>();

/// <summary>
/// Adds a custom scheduling hint.
/// </summary>
/// <param name="hint">The hint key.</param>
/// <param name="value">The hint value.</param>
public void Add(string hint, object value)
{
Data.Add(hint, JToken.FromObject(value));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System;
using Newtonsoft.Json;
using OpenStack.Serialization;

namespace OpenStack.Compute.v2_1.Serialization
{
/// <summary />
public class ServerCreateDefinitionConverter : DefaultJsonConverter
{
/// <inheritdoc />
public override bool CanRead => false;

/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
// Serialize server
writer.WritePropertyName("server");
base.WriteJson(writer, value, serializer);

// Serialize scheduler hints
var server = value as ServerCreateDefinition;
if (server?.SchedulerHints != null)
{
writer.WritePropertyName("os:scheduler_hints");
base.WriteJson(writer, server.SchedulerHints, serializer);
}

writer.WriteEndObject();
}

/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return typeof (ServerCreateDefinition).IsAssignableFrom(objectType);
}
}
}
25 changes: 25 additions & 0 deletions src/corelib/Compute/v2_1/Serialization/ServerGroupCollection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using Newtonsoft.Json;
using OpenStack.Serialization;

namespace OpenStack.Compute.v2_1.Serialization
{
/// <summary>
/// Represents a collection of server group resources of the <see cref="ComputeService"/>.
/// </summary>
/// <exclude />
public class ServerGroupCollection<T> : ResourceCollection<T>
where T : IServiceResource
{
/// <summary>
/// The requested flavors.
/// </summary>
[JsonProperty("server_groups")]
protected IList<T> ServerGroups => Items;
}

/// <inheritdoc cref="ServerGroupCollection{T}" />
/// <exclude />
public class ServerGroupCollection : ServerGroupCollection<ServerGroup>
{ }
}
10 changes: 5 additions & 5 deletions src/corelib/Compute/v2_1/ServerCreateDefinition.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using System.Collections.Generic;
using Newtonsoft.Json;
using OpenStack.Serialization;
using OpenStack.Compute.v2_1.Serialization;

namespace OpenStack.Compute.v2_1
{
/// <summary />
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "server")]
[JsonConverter(typeof(ServerCreateDefinitionConverter))]
public class ServerCreateDefinition
{
/// <summary />
public ServerCreateDefinition(string name, Identifier imageId, string flavorId)
public ServerCreateDefinition(string name, Identifier imageId, Identifier flavorId)
{
Name = name;
ImageId = imageId;
Expand All @@ -31,7 +31,7 @@ public ServerCreateDefinition(string name, Identifier imageId, string flavorId)

/// <summary />
[JsonProperty("flavorRef")]
public string FlavorId { get; set; }
public Identifier FlavorId { get; set; }

/// <summary />
[JsonProperty("security_groups")]
Expand Down Expand Up @@ -70,7 +70,7 @@ public ServerCreateDefinition(string name, Identifier imageId, string flavorId)
public string KeyPairName { get; set; }

/// <summary />
[JsonProperty("os:scheduler_hints")]
[JsonIgnore] // Serialized at the same level as "server"
public SchedulerHints SchedulerHints { get; set; }

/// <summary />
Expand Down
57 changes: 57 additions & 0 deletions src/corelib/Compute/v2_1/ServerGroup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OpenStack.Serialization;

namespace OpenStack.Compute.v2_1
{
/// <summary />
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "server_group")]
public class ServerGroup : IHaveExtraData, IServiceResource
{
/// <summary>
/// Initializes a new instance of the <see cref="ServerGroup"/> class.
/// </summary>
public ServerGroup()
{
Policies = new List<string>();
}

/// <summary />
[JsonProperty("id")]
public Identifier Id { get; set; }

/// <summary>
/// The server group name.
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }

/// <summary>
/// A list of one or more policy names to associate with the server group.
/// </summary>
[JsonProperty("policies")]
public IList<string> Policies { get; set; }

/// <summary>
/// The servers included in the group.
/// </summary>
[JsonProperty("members")]
public IList<Identifier> Members { get; set; }

/// <summary />
[JsonExtensionData]
IDictionary<string, JToken> IHaveExtraData.Data { get; set; } = new Dictionary<string, JToken>();

object IServiceResource.Owner { get; set; }

/// <inheritdoc cref="ComputeApiBuilder.DeleteServerGroupAsync" />
public Task DeleteAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var owner = this.GetOwnerOrThrow<ComputeApiBuilder>();
return owner.DeleteServerGroupAsync(Id, cancellationToken);
}
}
}
Loading