Skip to content

Commit

Permalink
NCBC-143: Provide UpdateBucket functionality
Browse files Browse the repository at this point in the history
Change-Id: I5615574e49f58a4fada7fb9bb92a2a13dfd486fb
Reviewed-on: http://review.couchbase.org/22182
Reviewed-by: Matt Ingenthron <matt@couchbase.com>
Tested-by: John C. Zablocki <john@couchbase.com>
  • Loading branch information
jzablocki authored and John C. Zablocki committed Nov 21, 2012
1 parent 55d3a42 commit 52e912b
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 39 deletions.
84 changes: 66 additions & 18 deletions src/Couchbase.Tests/CouchbaseClusterBucketAdminTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ public void When_Getting_Bucket_That_Bucket_Is_Not_Null()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand All @@ -91,12 +92,12 @@ public void When_Getting_Invalid_Bucket_Web_Exception_Is_Thrown()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

var bucket = waitForBucket(bucketName);

Assert.That(bucket, Is.Not.Null);

_Cluster.DeleteBucket(bucketName);
Expand All @@ -113,7 +114,8 @@ public void When_Try_Getting_Bucket_That_Bucket_Is_Not_Null()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand All @@ -134,7 +136,8 @@ public void When_Getting_Bucket_Item_Count_Count_Matches_Basic_Stats()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand All @@ -157,7 +160,8 @@ public void When_Getting_Cluster_Item_Count_Count_Matches_Interesting_Stats()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand Down Expand Up @@ -213,7 +217,8 @@ public void When_Creating_New_Bucket_That_Bucket_Is_Listed()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand All @@ -225,6 +230,42 @@ public void When_Creating_New_Bucket_That_Bucket_Is_Listed()

}

[Test]
public void When_Updating_Bucket_That_Bucket_Is_Listed()
{
var bucketName = "Bucket-" + DateTime.Now.Ticks;

_Cluster.CreateBucket(new Bucket
{
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
}
);

var bucket = waitForListedBucket(bucketName);
Assert.That(bucket, Is.Not.Null);

_Cluster.UpdateBucket(new Bucket
{
Name = bucketName,
Quota = new Quota { RAM = 105 },
AuthType = AuthTypes.None,
ProxyPort = 8675
}
);

bucket = waitForListedBucket(bucketName);
Assert.That(bucket.Quota.RAM / 1024 / 1024, Is.EqualTo(105));
Assert.That(bucket.ProxyPort, Is.EqualTo(8675));
Assert.That(bucket.AuthType, Is.EqualTo(AuthTypes.None));

_Cluster.DeleteBucket(bucketName);

}

[Test]
public void When_Creating_New_Memcached_Bucket_That_Bucket_Is_Listed()
{
Expand All @@ -235,8 +276,9 @@ public void When_Creating_New_Memcached_Bucket_That_Bucket_Is_Listed()
Name = bucketName,
AuthType = AuthTypes.None,
BucketType = BucketTypes.Memcached,
RamQuotaMB = 100,
ProxyPort = 9090
Quota = new Quota { RAM = 100 },
ProxyPort = 9090,
ReplicaNumber = ReplicaNumbers.Zero
}
);

Expand All @@ -257,7 +299,8 @@ public void When_Creating_New_Bucket_With_Existing_Name_Web_Exception_Is_Thrown(
Name = "default",
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 128
Quota = new Quota { RAM = 128 },
ReplicaNumber = ReplicaNumbers.Zero
});
}

Expand All @@ -270,7 +313,8 @@ public void When_Creating_New_Bucket_With_Auth_Type_None_And_No_Port_Argument_Ex
Name = "default",
AuthType = AuthTypes.None,
BucketType = BucketTypes.Memcached,
RamQuotaMB = 128
Quota = new Quota { RAM = 128 },
ReplicaNumber = ReplicaNumbers.Zero
});
}

Expand All @@ -283,21 +327,23 @@ public void When_Creating_New_Bucket_With_Auth_Type_Sasl_And_Port_Argument_Excep
Name = "default",
AuthType = AuthTypes.None,
BucketType = BucketTypes.Memcached,
RamQuotaMB = 128
Quota = new Quota { RAM = 128 },
ReplicaNumber = ReplicaNumbers.Zero
});
}


[Test]
[ExpectedException(typeof(ArgumentException), ExpectedMessage = "RamQuotaMB", MatchType = MessageMatch.Contains)]
[ExpectedException(typeof(ArgumentException), ExpectedMessage = "Quota.RAM", MatchType = MessageMatch.Contains)]
public void When_Creating_New_Bucket_With_Ram_Quota_Less_Than_100_Argument_Exception_Is_Thrown()
{
_Cluster.CreateBucket(new Bucket
{
Name = "default",
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Memcached,
RamQuotaMB = 99
Quota = new Quota { RAM = 99 },
ReplicaNumber = ReplicaNumbers.Zero
});
}

Expand All @@ -311,7 +357,8 @@ public void When_Deleting_Bucket_Bucket_Is_No_Longer_Listed()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
});

var bucket = waitForListedBucket(bucketName);
Expand Down Expand Up @@ -344,7 +391,8 @@ public void When_Creating_New_Bucket_Item_Counts_Are_Set_On_Basic_Stats()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
ReplicaNumber = ReplicaNumbers.Zero
});

var bucket = waitForListedBucket(bucketName);
Expand Down Expand Up @@ -391,7 +439,7 @@ public void When_Listing_Bucket_Object_Graph_Is_Populated()
Name = bucketName,
AuthType = AuthTypes.Sasl,
BucketType = BucketTypes.Membase,
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
});

var bucket = waitForListedBucket(bucketName);
Expand Down Expand Up @@ -533,7 +581,7 @@ public void When_Managing_Design_Document_On_Non_Default_Bucket_Operation_Is_Suc
BucketType = BucketTypes.Membase,
Name = bucketName,
Password = "qwerty",
RamQuotaMB = 100
Quota = new Quota { RAM = 100 },
};

_Cluster.CreateBucket(bucket);
Expand Down
24 changes: 17 additions & 7 deletions src/Couchbase/Management/Bucket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ public class Bucket

public AuthTypes AuthType { get; set; }

public int RamQuotaMB { get; set; }

public int? ProxyPort { get; set; }
public int ProxyPort { get; set; }

public string Password { get; set; }

Expand Down Expand Up @@ -51,7 +49,7 @@ public class Bucket

public string UUID { get; set; }

public short ReplicaNumber { get; set; }
public ReplicaNumbers ReplicaNumber { get; set; }

public Quota Quota { get; set; }

Expand All @@ -65,16 +63,28 @@ public bool IsValid()
{
ValidationErrors = new Dictionary<string, string>();

if (AuthType == AuthTypes.Empty)
ValidationErrors["AuthType"] = "AuthType cannot be Empty";

if (BucketType == BucketTypes.Empty)
ValidationErrors["BucketType"] = "BucketType cannot be Empty";

if (ReplicaNumber == ReplicaNumbers.Empty)
ValidationErrors["ReplicaNumber"] = "ReplicaNumber cannot be Empty";

if (string.IsNullOrEmpty(Name))
ValidationErrors["Name"] = "Name must be specified";

if (RamQuotaMB < MIN_RAM_QUOTA)
if (Quota == null || Quota.RAM < MIN_RAM_QUOTA)
ValidationErrors["RamQuotaMB"] = "RamQuotaMB must be at least " + MIN_RAM_QUOTA;

if (AuthType == AuthTypes.None && (ProxyPort == null || !ProxyPort.HasValue))
if (ProxyPort < 0)
ValidationErrors["ProxyPort"] = "ProxyPort must be a greater than or equal to 0";

if (AuthType == AuthTypes.None && ProxyPort == 0)
ValidationErrors["ProxyPort"] = "ProxyPort is required when AuthType is 'none'";

if (AuthType == AuthTypes.Sasl && (ProxyPort != null && ProxyPort.HasValue))
if (AuthType == AuthTypes.Sasl && ProxyPort > 0)
ValidationErrors["ProxyPort"] = "ProxyPort may not be used with AuthType 'sasl'";

return ValidationErrors.Keys.Count == 0;
Expand Down
11 changes: 11 additions & 0 deletions src/Couchbase/Management/BucketEnums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,26 @@ namespace Couchbase.Management
{
public enum BucketTypes
{
Empty, //used to disallow defaulting to known type
Memcached,
Membase
}

public enum AuthTypes
{
Empty, //used to disallow defaulting to known type
None,
Sasl
}

public enum ReplicaNumbers
{
Empty=-1,
Zero,
One,
Two,
Three
}
}

#region [ License information ]
Expand Down
55 changes: 42 additions & 13 deletions src/Couchbase/Management/CouchbaseCluster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public CouchbaseCluster(ICouchbaseClientConfiguration config)
public CouchbaseCluster(string configSectionName) :
this((CouchbaseClientSection)ConfigurationManager.GetSection(configSectionName)) { }

#region ICouchbaseCluster ethods
#region ICouchbaseCluster Methods

public Bucket[] ListBuckets()
{
Expand Down Expand Up @@ -98,21 +98,32 @@ public void CreateBucket(Bucket bucket)
var message = string.Join(Environment.NewLine, bucket.ValidationErrors.Values.ToArray());
throw new ArgumentException(message);
}
var query = getCreateBucketQueryString(bucket);
HttpHelper.Post(_bucketUri, _username, _password, query, HttpHelper.CONTENT_TYPE_FORM);
}

var sb = new StringBuilder();
sb.AppendFormat("name={0}", bucket.Name);
sb.AppendFormat("&ramQuotaMB={0}", bucket.RamQuotaMB);

if (bucket.AuthType == AuthTypes.None)
sb.AppendFormat("&proxyPort={0}", bucket.ProxyPort);
if (bucket.AuthType == AuthTypes.Sasl && !string.IsNullOrEmpty(bucket.Password))
sb.AppendFormat("&saslPassword={0}", bucket.Password);
public void UpdateBucket(Bucket bucket)
{
Bucket existingBucket;
if (! TryGetBucket(bucket.Name, out existingBucket))
{
if (existingBucket == null)
throw new ApplicationException("Failed to find bucket named" + bucket);
}

sb.AppendFormat("&authType={0}", Enum.GetName(typeof(AuthTypes), bucket.AuthType).ToLower()); ;
sb.AppendFormat("&bucketType={0}", Enum.GetName(typeof(BucketTypes), bucket.BucketType).ToLower());
sb.AppendFormat("&replicaNumber={0}", bucket.ReplicaNumber);
existingBucket.Quota.RAM = bucket.Quota.RAM == 0 ? existingBucket.Quota.RAM : bucket.Quota.RAM;
existingBucket.AuthType = bucket.AuthType == AuthTypes.Empty ? existingBucket.AuthType : bucket.AuthType;
existingBucket.ProxyPort = bucket.ProxyPort == 0 ? existingBucket.ProxyPort : bucket.ProxyPort;
existingBucket.BucketType = bucket.BucketType == BucketTypes.Empty ? existingBucket.BucketType : bucket.BucketType;
existingBucket.ReplicaNumber = bucket.ReplicaNumber == ReplicaNumbers.Empty ? existingBucket.ReplicaNumber : bucket.ReplicaNumber;

HttpHelper.Post(_bucketUri, _username, _password, sb.ToString(), HttpHelper.CONTENT_TYPE_FORM);
if (!existingBucket.IsValid())
{
var message = string.Join(Environment.NewLine, bucket.ValidationErrors.Values.ToArray());
throw new ArgumentException(message);
}
var query = getCreateBucketQueryString(existingBucket, false);
HttpHelper.Post(UriHelper.Combine(_bucketUri, bucket.Name), _username, _password, query, HttpHelper.CONTENT_TYPE_FORM);
}

public void DeleteBucket(string bucketName)
Expand Down Expand Up @@ -144,6 +155,24 @@ public long GetItemCount()
return ListBuckets().First().Nodes.First().InterestingStats.Curr_Items_Tot;
}

private string getCreateBucketQueryString(Bucket bucket, bool includeName = true)
{
var sb = new StringBuilder();
if (includeName) sb.AppendFormat("name={0}&", bucket.Name);
sb.AppendFormat("ramQuotaMB={0}", bucket.Quota.RAM);

if (bucket.AuthType == AuthTypes.None)
sb.AppendFormat("&proxyPort={0}", bucket.ProxyPort);
if (bucket.AuthType == AuthTypes.Sasl && !string.IsNullOrEmpty(bucket.Password))
sb.AppendFormat("&saslPassword={0}", bucket.Password);

sb.AppendFormat("&authType={0}", Enum.GetName(typeof(AuthTypes), bucket.AuthType).ToLower()); ;
sb.AppendFormat("&bucketType={0}", Enum.GetName(typeof(BucketTypes), bucket.BucketType).ToLower());
sb.AppendFormat("&replicaNumber={0}", (short)bucket.ReplicaNumber);

return sb.ToString();
}

#endregion

#region Design Document methods
Expand Down
7 changes: 6 additions & 1 deletion src/Couchbase/Management/ICouchbaseCluster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,14 @@ interface ICouchbaseCluster
/// Create a new bucket on the server
/// </summary>
/// <param name="bucket">Bucket to create</param>
/// <returns>True if successful</returns>
void CreateBucket(Bucket bucket);

/// <summary>
/// Update a bucket on the server
/// </summary>
/// <param name="bucket">Bucket to create</param>
void UpdateBucket(Bucket bucket);

/// <summary>
/// Delete a bucket on the server
/// </summary>
Expand Down

0 comments on commit 52e912b

Please sign in to comment.