From aef4d7dcbf050f6eb9ce20da0ab569aa03e459f7 Mon Sep 17 00:00:00 2001 From: Jason Mitschke Date: Fri, 5 Apr 2013 16:25:05 -0500 Subject: [PATCH] [Delivers #43560237 #43560235] Add Show Volume List and Show Volume Methods --- src/corelib/Core/Domain/Volume.cs | 39 +++++++++++++++++++ .../Core/ICloudBlockStorageProvider.cs | 5 ++- .../Rackspace/CloudBlockStorageProvider.cs | 29 ++++++++++++++ .../CreateCloudBlockStorageVolumeDetails.cs} | 2 +- .../GetCloudBlockStorageVolumeResponse.cs | 9 +++++ .../Objects/Response/ListVolumeResponse.cs | 12 ++++++ src/corelib/corelib.csproj | 5 ++- .../Rackspace/CloudBlockStorageTests.cs | 29 ++++++++++++++ 8 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/corelib/Core/Domain/Volume.cs rename src/corelib/{Core/Domain/CloudBlockStorageVolume.cs => Providers/Rackspace/Objects/Request/CreateCloudBlockStorageVolumeDetails.cs} (90%) create mode 100644 src/corelib/Providers/Rackspace/Objects/Response/GetCloudBlockStorageVolumeResponse.cs create mode 100644 src/corelib/Providers/Rackspace/Objects/Response/ListVolumeResponse.cs diff --git a/src/corelib/Core/Domain/Volume.cs b/src/corelib/Core/Domain/Volume.cs new file mode 100644 index 000000000..58abcbfce --- /dev/null +++ b/src/corelib/Core/Domain/Volume.cs @@ -0,0 +1,39 @@ +using System; +using System.Runtime.Serialization; + +namespace net.openstack.Core.Domain +{ + [DataContract] + public class Volume + { + [DataMember] + public string Id { get; set; } + + [DataMember(Name = "display_name")] + public string DisplayName { get; set; } + + [DataMember(Name = "display_description")] + public string DisplayDescription { get; set; } + + [DataMember] + public int Size { get; set; } + + [DataMember(Name = "volume_type")] + public string VolumeType { get; set; } + + [DataMember(Name = "snapshot_id")] + public string SnapshotId { get; set; } + + [DataMember] + public string[] Attachments { get; set; } + + [DataMember] + public string Status { get; set; } + + [DataMember(Name = "availability_zone")] + public string AvailabilityZone { get; set; } + + [DataMember(Name = "created_at")] + public DateTime CreatedAt { get; set; } + } +} diff --git a/src/corelib/Core/ICloudBlockStorageProvider.cs b/src/corelib/Core/ICloudBlockStorageProvider.cs index bd2e5e2b3..06914845d 100644 --- a/src/corelib/Core/ICloudBlockStorageProvider.cs +++ b/src/corelib/Core/ICloudBlockStorageProvider.cs @@ -1,9 +1,12 @@ -using net.openstack.Core.Domain; +using System.Collections.Generic; +using net.openstack.Core.Domain; namespace net.openstack.Core { public interface ICloudBlockStorageProvider { bool CreateVolume(int size, string display_description = null, string display_name = null, string snapshot_id = null, string volume_type = null, string region = null, CloudIdentity identity = null); + IEnumerable ListVolumes(string region = null, CloudIdentity identity = null); + Volume ShowVolume(string volume_id, string region = null, CloudIdentity identity = null); } } diff --git a/src/corelib/Providers/Rackspace/CloudBlockStorageProvider.cs b/src/corelib/Providers/Rackspace/CloudBlockStorageProvider.cs index 1164eef6a..55f5984d7 100644 --- a/src/corelib/Providers/Rackspace/CloudBlockStorageProvider.cs +++ b/src/corelib/Providers/Rackspace/CloudBlockStorageProvider.cs @@ -1,11 +1,14 @@ using System; +using System.Collections.Generic; using System.Linq; using JSIStudios.SimpleRESTServices.Client; using JSIStudios.SimpleRESTServices.Client.Json; using net.openstack.Core; using net.openstack.Core.Domain; using net.openstack.Providers.Rackspace.Objects.Request; +using net.openstack.Providers.Rackspace.Objects.Response; using net.openstack.Providers.Rackspace.Validators; +using CreateCloudBlockStorageVolumeDetails = net.openstack.Providers.Rackspace.Objects.Request.CreateCloudBlockStorageVolumeDetails; namespace net.openstack.Providers.Rackspace { @@ -31,6 +34,8 @@ internal CloudBlockStorageProvider(CloudIdentity defaultIdentity, IIdentityProvi } + #region Volumes + public bool CreateVolume(int size, string display_description = null, string display_name = null, string snapshot_id = null, string volume_type = null, string region = null, CloudIdentity identity = null) { _cloudBlockStorageValidator.ValidateVolumeSize(size); @@ -42,6 +47,30 @@ public bool CreateVolume(int size, string display_description = null, string dis return response != null && _validResponseCode.Contains(response.StatusCode); } + public IEnumerable ListVolumes(string region = null, CloudIdentity identity = null) + { + var urlPath = new Uri(string.Format("{0}/volumes", GetServiceEndpoint(identity, region))); + var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.GET); + + if (response == null || response.Data == null) + return null; + + return response.Data.Volumes; + } + + public Volume ShowVolume(string volume_id, string region = null, CloudIdentity identity = null) + { + var urlPath = new Uri(string.Format("{0}/volumes/{1}", GetServiceEndpoint(identity, region), volume_id)); + var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.GET); + + if (response == null || response.Data == null) + return null; + + return response.Data.Volume; + } + + #endregion + #region Private methods protected string GetServiceEndpoint(CloudIdentity identity = null, string region = null) diff --git a/src/corelib/Core/Domain/CloudBlockStorageVolume.cs b/src/corelib/Providers/Rackspace/Objects/Request/CreateCloudBlockStorageVolumeDetails.cs similarity index 90% rename from src/corelib/Core/Domain/CloudBlockStorageVolume.cs rename to src/corelib/Providers/Rackspace/Objects/Request/CreateCloudBlockStorageVolumeDetails.cs index 8c5df39aa..7b2f49393 100644 --- a/src/corelib/Core/Domain/CloudBlockStorageVolume.cs +++ b/src/corelib/Providers/Rackspace/Objects/Request/CreateCloudBlockStorageVolumeDetails.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace net.openstack.Core.Domain +namespace net.openstack.Providers.Rackspace.Objects.Request { [DataContract] public class CreateCloudBlockStorageVolumeDetails diff --git a/src/corelib/Providers/Rackspace/Objects/Response/GetCloudBlockStorageVolumeResponse.cs b/src/corelib/Providers/Rackspace/Objects/Response/GetCloudBlockStorageVolumeResponse.cs new file mode 100644 index 000000000..a97155aa4 --- /dev/null +++ b/src/corelib/Providers/Rackspace/Objects/Response/GetCloudBlockStorageVolumeResponse.cs @@ -0,0 +1,9 @@ +using net.openstack.Core.Domain; + +namespace net.openstack.Providers.Rackspace.Objects.Response +{ + internal class GetCloudBlockStorageVolumeResponse + { + public Volume Volume { get; set; } + } +} diff --git a/src/corelib/Providers/Rackspace/Objects/Response/ListVolumeResponse.cs b/src/corelib/Providers/Rackspace/Objects/Response/ListVolumeResponse.cs new file mode 100644 index 000000000..4aa732e1c --- /dev/null +++ b/src/corelib/Providers/Rackspace/Objects/Response/ListVolumeResponse.cs @@ -0,0 +1,12 @@ +using System.Runtime.Serialization; +using net.openstack.Core.Domain; + +namespace net.openstack.Providers.Rackspace.Objects.Response +{ + [DataContract] + internal class ListVolumeResponse + { + [DataMember(Name = "volumes")] + public Volume[] Volumes { get; set; } + } +} diff --git a/src/corelib/corelib.csproj b/src/corelib/corelib.csproj index f0382d58e..e8834eea9 100644 --- a/src/corelib/corelib.csproj +++ b/src/corelib/corelib.csproj @@ -45,7 +45,7 @@ - + @@ -87,6 +87,7 @@ + @@ -97,6 +98,7 @@ + @@ -110,6 +112,7 @@ + diff --git a/src/testing/integration/Providers/Rackspace/CloudBlockStorageTests.cs b/src/testing/integration/Providers/Rackspace/CloudBlockStorageTests.cs index 0578c2d18..a62e8899b 100644 --- a/src/testing/integration/Providers/Rackspace/CloudBlockStorageTests.cs +++ b/src/testing/integration/Providers/Rackspace/CloudBlockStorageTests.cs @@ -55,5 +55,34 @@ public void Should_Create_Volume_Full_Parameters() Assert.IsTrue(volumeCreatedResponse); } #endregion + + + [TestMethod] + public void Should_Return_Volume_List() + { + var provider = new CloudBlockStorageProvider(); + var volumeListResponse = provider.ListVolumes(identity: _testIdentity); + Assert.IsNotNull(volumeListResponse); + Assert.IsTrue(volumeListResponse.Any()); + } + + [TestMethod] + public void Should_Return_Single_Volume() + { + var provider = new CloudBlockStorageProvider(); + + var volumeListResponse = provider.ListVolumes(identity: _testIdentity); + if (volumeListResponse != null && volumeListResponse.Any()) + { + var firstVolumeInList = volumeListResponse.First(); + var singleVolumeResponse = provider.ShowVolume(firstVolumeInList.Id, identity: _testIdentity); + Assert.IsNotNull(singleVolumeResponse); + Assert.IsTrue(singleVolumeResponse.Id == firstVolumeInList.Id); + } + else + { + Assert.Fail("No volumes present."); + } + } } }