Skip to content

Commit dba436d

Browse files
committed
Merge pull request #585 from carolynvs/server-groups
Server groups
2 parents b187ae7 + dc620c3 commit dba436d

17 files changed

Lines changed: 566 additions & 7 deletions

src/corelib/Compute/v2_1/ComputeApiBuilder.cs

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,15 +1151,15 @@ public virtual async Task<TPage> ListImageDetailsAsync<TPage>(Url url, Cancellat
11511151
public virtual async Task<T> ListSecurityGroupsAsync<T>(string serverId = null, CancellationToken cancellationToken = default(CancellationToken))
11521152
where T : IEnumerable<IServiceResource>
11531153
{
1154-
var result = await BuildListSecurityGropusAsync(serverId, cancellationToken)
1154+
var result = await BuildListSecurityGroupsAsync(serverId, cancellationToken)
11551155
.SendAsync()
11561156
.ReceiveJson<T>();
11571157
result.PropogateOwner(this);
11581158
return result;
11591159
}
11601160

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

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

12471247
#endregion
12481248

1249+
#region Server Groups
1250+
1251+
/// <summary />
1252+
public virtual async Task<T> GetServerGroupAsync<T>(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
1253+
where T : IServiceResource
1254+
{
1255+
var result = await BuildGetServerGroupsAsync(serverGroupId, cancellationToken)
1256+
.SendAsync()
1257+
.ReceiveJson<T>();
1258+
result.PropogateOwner(this);
1259+
return result;
1260+
}
1261+
1262+
/// <summary />
1263+
public virtual async Task<PreparedRequest> BuildGetServerGroupsAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
1264+
{
1265+
if (serverGroupId == null)
1266+
throw new ArgumentNullException("serverGroupId");
1267+
1268+
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);
1269+
1270+
return endpoint
1271+
.AppendPathSegment($"os-server-groups/{serverGroupId}")
1272+
.Authenticate(AuthenticationProvider)
1273+
.SetMicroversion(this)
1274+
.PrepareGet(cancellationToken);
1275+
}
1276+
1277+
/// <summary />
1278+
public virtual async Task<T> CreateServerGroupAsync<T>(object serverGroup, CancellationToken cancellationToken = default(CancellationToken))
1279+
where T : IServiceResource
1280+
{
1281+
var result = await BuildCreateServerGroupAsync(serverGroup, cancellationToken).SendAsync().ReceiveJson<T>();
1282+
result.PropogateOwner(this);
1283+
return result;
1284+
}
1285+
1286+
/// <summary />
1287+
public virtual async Task<PreparedRequest> BuildCreateServerGroupAsync(object serverGroup, CancellationToken cancellationToken = default(CancellationToken))
1288+
{
1289+
if (serverGroup == null)
1290+
throw new ArgumentNullException("serverGroup");
1291+
1292+
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);
1293+
1294+
return endpoint
1295+
.AppendPathSegments("os-server-groups")
1296+
.Authenticate(AuthenticationProvider)
1297+
.SetMicroversion(this)
1298+
.PreparePostJson(serverGroup, cancellationToken);
1299+
}
1300+
1301+
/// <summary />
1302+
public virtual async Task<T> ListServerGroupsAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
1303+
where T : IEnumerable<IServiceResource>
1304+
{
1305+
var result = await BuildListServerGroupsAsync(cancellationToken)
1306+
.SendAsync()
1307+
.ReceiveJson<T>();
1308+
result.PropogateOwner(this);
1309+
return result;
1310+
}
1311+
1312+
/// <summary />
1313+
public virtual async Task<PreparedRequest> BuildListServerGroupsAsync(CancellationToken cancellationToken = default(CancellationToken))
1314+
{
1315+
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);
1316+
1317+
return endpoint
1318+
.AppendPathSegment("os-server-groups")
1319+
.Authenticate(AuthenticationProvider)
1320+
.SetMicroversion(this)
1321+
.PrepareGet(cancellationToken);
1322+
}
1323+
1324+
/// <summary />
1325+
public virtual Task DeleteServerGroupAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
1326+
{
1327+
return BuildDeleteServerGroupAsync(serverGroupId, cancellationToken).SendAsync();
1328+
}
1329+
1330+
/// <summary />
1331+
public virtual async Task<PreparedRequest> BuildDeleteServerGroupAsync(string serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
1332+
{
1333+
if (serverGroupId == null)
1334+
throw new ArgumentNullException("serverGroupId");
1335+
1336+
Url endpoint = await UrlBuilder.GetEndpoint(cancellationToken).ConfigureAwait(false);
1337+
1338+
return (PreparedRequest)endpoint
1339+
.AppendPathSegment($"os-server-groups/{serverGroupId}")
1340+
.Authenticate(AuthenticationProvider)
1341+
.SetMicroversion(this)
1342+
.PrepareDelete(cancellationToken)
1343+
.AllowHttpStatus(HttpStatusCode.NotFound);
1344+
}
1345+
1346+
#endregion
1347+
12491348
#region Compute Service
12501349
/// <summary />
12511350
public virtual Task<T> GetLimitsAsync<T>(CancellationToken cancellationToken = default(CancellationToken))

src/corelib/Compute/v2_1/ComputeService.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,34 @@ public ComputeService(IAuthenticationProvider authenticationProvider, string reg
386386

387387
#endregion
388388

389+
#region Sever Groups
390+
391+
/// <inheritdoc cref="ComputeApiBuilder.GetServerGroupAsync{T}" />
392+
public Task<ServerGroup> GetServerGroupAsync(Identifier serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
393+
{
394+
return _computeApi.GetServerGroupAsync<ServerGroup>(serverGroupId, cancellationToken);
395+
}
396+
397+
/// <inheritdoc cref="ComputeApiBuilder.CreateServerGroupAsync{T}" />
398+
public Task<ServerGroup> CreateServerGroupAsync(ServerGroupDefinition serverGroup, CancellationToken cancellationToken = default(CancellationToken))
399+
{
400+
return _computeApi.CreateServerGroupAsync<ServerGroup>(serverGroup, cancellationToken);
401+
}
402+
403+
/// <inheritdoc cref="ComputeApiBuilder.ListServerGroupsAsync{T}" />
404+
public async Task<IEnumerable<ServerGroup>> ListServerGroupsAsync(CancellationToken cancellationToken = default(CancellationToken))
405+
{
406+
return await _computeApi.ListServerGroupsAsync<ServerGroupCollection>(cancellationToken);
407+
}
408+
409+
/// <inheritdoc cref="ComputeApiBuilder.DeleteServerGroupAsync" />
410+
public Task DeleteServerGroupAsync(Identifier serverGroupId, CancellationToken cancellationToken = default(CancellationToken))
411+
{
412+
return _computeApi.DeleteServerGroupAsync(serverGroupId, cancellationToken);
413+
}
414+
415+
#endregion
416+
389417
#region Compute Service
390418
/// <inheritdoc cref="ComputeApiBuilder.GetLimitsAsync{T}" />
391419
public Task<ServiceLimits> GetLimitsAsync(CancellationToken cancellationToken = default(CancellationToken))

src/corelib/Compute/v2_1/ComputeServiceExtensions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,34 @@ public static void DeleteSecurityGroup(this ComputeService service, Identifier s
366366

367367
#endregion
368368

369+
#region Server Groups
370+
371+
/// <inheritdoc cref="ComputeService.GetServerGroupAsync" />
372+
public static ServerGroup GetServerGroup(this ComputeService service, Identifier severGroupId)
373+
{
374+
return service.GetServerGroupAsync(severGroupId).ForceSynchronous();
375+
}
376+
377+
/// <inheritdoc cref="ComputeService.CreateServerGroupAsync" />
378+
public static ServerGroup CreateServerGroup(this ComputeService service, ServerGroupDefinition severGroup)
379+
{
380+
return service.CreateServerGroupAsync(severGroup).ForceSynchronous();
381+
}
382+
383+
/// <inheritdoc cref="ComputeService.ListServerGroupsAsync" />
384+
public static IEnumerable<ServerGroup> ListServerGroups(this ComputeService service)
385+
{
386+
return service.ListServerGroupsAsync().ForceSynchronous();
387+
}
388+
389+
/// <inheritdoc cref="ComputeService.DeleteServerGroupAsync" />
390+
public static void DeleteServerGroup(this ComputeService service, Identifier severGroupId)
391+
{
392+
service.DeleteServerGroupAsync(severGroupId).ForceSynchronous();
393+
}
394+
395+
#endregion
396+
369397
#region Compute Service
370398
/// <inheritdoc cref="ComputeService.GetLimitsAsync" />
371399
public static ServiceLimits GetLimits(this ComputeService service)

src/corelib/Compute/v2_1/SchedulerHints.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,15 @@ public SchedulerHints()
3838
/// <summary />
3939
[JsonExtensionData]
4040
public IDictionary<string, JToken> Data { get; set; } = new Dictionary<string, JToken>();
41+
42+
/// <summary>
43+
/// Adds a custom scheduling hint.
44+
/// </summary>
45+
/// <param name="hint">The hint key.</param>
46+
/// <param name="value">The hint value.</param>
47+
public void Add(string hint, object value)
48+
{
49+
Data.Add(hint, JToken.FromObject(value));
50+
}
4151
}
4252
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using OpenStack.Serialization;
4+
5+
namespace OpenStack.Compute.v2_1.Serialization
6+
{
7+
/// <summary />
8+
public class ServerCreateDefinitionConverter : DefaultJsonConverter
9+
{
10+
/// <inheritdoc />
11+
public override bool CanRead => false;
12+
13+
/// <inheritdoc />
14+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
15+
{
16+
writer.WriteStartObject();
17+
// Serialize server
18+
writer.WritePropertyName("server");
19+
base.WriteJson(writer, value, serializer);
20+
21+
// Serialize scheduler hints
22+
var server = value as ServerCreateDefinition;
23+
if (server?.SchedulerHints != null)
24+
{
25+
writer.WritePropertyName("os:scheduler_hints");
26+
base.WriteJson(writer, server.SchedulerHints, serializer);
27+
}
28+
29+
writer.WriteEndObject();
30+
}
31+
32+
/// <inheritdoc />
33+
public override bool CanConvert(Type objectType)
34+
{
35+
return typeof (ServerCreateDefinition).IsAssignableFrom(objectType);
36+
}
37+
}
38+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Collections.Generic;
2+
using Newtonsoft.Json;
3+
using OpenStack.Serialization;
4+
5+
namespace OpenStack.Compute.v2_1.Serialization
6+
{
7+
/// <summary>
8+
/// Represents a collection of server group resources of the <see cref="ComputeService"/>.
9+
/// </summary>
10+
/// <exclude />
11+
public class ServerGroupCollection<T> : ResourceCollection<T>
12+
where T : IServiceResource
13+
{
14+
/// <summary>
15+
/// The requested flavors.
16+
/// </summary>
17+
[JsonProperty("server_groups")]
18+
protected IList<T> ServerGroups => Items;
19+
}
20+
21+
/// <inheritdoc cref="ServerGroupCollection{T}" />
22+
/// <exclude />
23+
public class ServerGroupCollection : ServerGroupCollection<ServerGroup>
24+
{ }
25+
}

src/corelib/Compute/v2_1/ServerCreateDefinition.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
using System.Collections.Generic;
22
using Newtonsoft.Json;
3-
using OpenStack.Serialization;
3+
using OpenStack.Compute.v2_1.Serialization;
44

55
namespace OpenStack.Compute.v2_1
66
{
77
/// <summary />
8-
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "server")]
8+
[JsonConverter(typeof(ServerCreateDefinitionConverter))]
99
public class ServerCreateDefinition
1010
{
1111
/// <summary />
12-
public ServerCreateDefinition(string name, Identifier imageId, string flavorId)
12+
public ServerCreateDefinition(string name, Identifier imageId, Identifier flavorId)
1313
{
1414
Name = name;
1515
ImageId = imageId;
@@ -31,7 +31,7 @@ public ServerCreateDefinition(string name, Identifier imageId, string flavorId)
3131

3232
/// <summary />
3333
[JsonProperty("flavorRef")]
34-
public string FlavorId { get; set; }
34+
public Identifier FlavorId { get; set; }
3535

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

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

7676
/// <summary />
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System.Collections.Generic;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Newtonsoft.Json;
5+
using Newtonsoft.Json.Linq;
6+
using OpenStack.Serialization;
7+
8+
namespace OpenStack.Compute.v2_1
9+
{
10+
/// <summary />
11+
[JsonConverterWithConstructor(typeof(RootWrapperConverter), "server_group")]
12+
public class ServerGroup : IHaveExtraData, IServiceResource
13+
{
14+
/// <summary>
15+
/// Initializes a new instance of the <see cref="ServerGroup"/> class.
16+
/// </summary>
17+
public ServerGroup()
18+
{
19+
Policies = new List<string>();
20+
}
21+
22+
/// <summary />
23+
[JsonProperty("id")]
24+
public Identifier Id { get; set; }
25+
26+
/// <summary>
27+
/// The server group name.
28+
/// </summary>
29+
[JsonProperty("name")]
30+
public string Name { get; set; }
31+
32+
/// <summary>
33+
/// A list of one or more policy names to associate with the server group.
34+
/// </summary>
35+
[JsonProperty("policies")]
36+
public IList<string> Policies { get; set; }
37+
38+
/// <summary>
39+
/// The servers included in the group.
40+
/// </summary>
41+
[JsonProperty("members")]
42+
public IList<Identifier> Members { get; set; }
43+
44+
/// <summary />
45+
[JsonExtensionData]
46+
IDictionary<string, JToken> IHaveExtraData.Data { get; set; } = new Dictionary<string, JToken>();
47+
48+
object IServiceResource.Owner { get; set; }
49+
50+
/// <inheritdoc cref="ComputeApiBuilder.DeleteServerGroupAsync" />
51+
public Task DeleteAsync(CancellationToken cancellationToken = default(CancellationToken))
52+
{
53+
var owner = this.GetOwnerOrThrow<ComputeApiBuilder>();
54+
return owner.DeleteServerGroupAsync(Id, cancellationToken);
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)