bigtable/api/TableAdminExample/TableAdmin.cs (469 lines of code) (raw):

// Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using System; using System.Collections.Generic; using System.Linq; using CommandLine; using Google.Api.Gax; using Google.LongRunning; using Google.Cloud.Bigtable.Admin.V2; using Google.Cloud.Bigtable.Common.V2; using Google.Protobuf.WellKnownTypes; using Grpc.Core; namespace GoogleCloudSamples.Bigtable { [Verb("createTable", HelpText = "Creates a table in the Instance.")] class CreateTableOptions { [Value(0, HelpText = "The tableId to create.", Required = true)] public string tableId { get; set; } } [Verb("listTables", HelpText = "Lists tables in the Instance.")] class ListTablesOptions { } [Verb("getTable", HelpText = "Gets information about a table.")] class GetTableOptions { [Value(0, HelpText = "The tableId to get.", Required = true)] public string tableId { get; set; } } [Verb("createMaxAgeFamily", HelpText = "Creates a column family with max age GC rule.")] class CreateMaxAgeFamilyOptions { [Value(0, HelpText = "The tableId to use.", Required = true)] public string tableId { get; set; } } [Verb("createMaxVersionsFamily", HelpText = "Creates a column family with max versions GC rule.")] class CreateMaxVersionsFamilyOptions { [Value(0, HelpText = "The tableId to use.", Required = true)] public string tableId { get; set; } } [Verb("createUnionFamily", HelpText = "Creates a column family with union GC rule.")] class CreateUnionFamilyOptions { [Value(0, HelpText = "The tableId to use.", Required = true)] public string tableId { get; set; } } [Verb("createIntersectionFamily", HelpText = "Creates a column family with intersection GC rule.")] class CreateIntersectionFamilyOptions { [Value(0, HelpText = "The tableId to use.", Required = true)] public string tableId { get; set; } } [Verb("createNestedFamily", HelpText = "Creates a column family with nested GC rules.")] class CreateNestedFamilyOptions { [Value(0, HelpText = "The tableId to use.", Required = true)] public string tableId { get; set; } } [Verb("updateFamily", HelpText = "Update the column family metadata to update the GC rule.")] class UpdateFamilyOptions { [Value(0, HelpText = "The table to use", Required = true)] public string tableId { get; set; } } [Verb("deleteFamily", HelpText = "Deletes a columnFamily.")] class DeleteFamilyOptions { [Value(0, HelpText = "The table to use.", Required = true)] public string tableId { get; set; } } [Verb("deleteTable", HelpText = "Deletes a table from the Instance.")] class DeleteTableOptions { [Value(0, HelpText = "The tableId to delete.", Required = true)] public string tableId { get; set; } } public class TableAdmin { private const string projectId = "YOUR-PROJECT-ID"; private const string instanceId = "YOUR-INSTANCE-ID"; private static readonly InstanceName s_instanceName = new InstanceName(projectId, instanceId); private static object CreateTable(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating table"); // [START bigtable_create_table] // Creates table if doesn't exist. // Initialize request argument(s). // Table to create Table table = new Table { Granularity = Table.Types.TimestampGranularity.Millis }; CreateTableRequest request = new CreateTableRequest { ParentAsInstanceName = s_instanceName, Table = table, TableId = tableId }; try { if (!TableExist(bigtableTableAdminClient, tableId)) { // Make the request. Table response = bigtableTableAdminClient.CreateTable(request); // [END bigtable_create_table] // Print table information. GetTable(tableId); // [START bigtable_create_table] } else { Console.WriteLine("Table exists"); } } catch (Exception ex) { Console.WriteLine($"Error creating table {ex.Message}"); } // [END bigtable_create_table] return 0; } private static object ListTables() { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Listing tables"); // [START bigtable_list_tables] // Lists tables in intance. // Initialize request argument(s). ListTablesRequest request = new ListTablesRequest { ParentAsInstanceName = s_instanceName }; try { // Make the request. PagedEnumerable<ListTablesResponse, Table> response = bigtableTableAdminClient.ListTables(request); // [END bigtable_list_tables] // Iterate over all response items, lazily performing RPCs as required foreach (Table table in response) { // Print table information. PrintTableInfo(table); } // [START bigtable_list_tables] } catch (Exception ex) { Console.WriteLine($"Error listing tables {ex.Message}"); } // [END bigtable_list_tables] return 0; } private static object GetTable(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Getting table"); // [START bigtable_get_table] // Getting information about a table. // Initialize request argument(s). // Table to get. TableName tableName = new TableName(projectId, instanceId, tableId); GetTableRequest request = new GetTableRequest { TableName = tableName }; try { // Make the request Table table = bigtableTableAdminClient.GetTable(request); // [END bigtable_get_table] // Print table information. PrintTableInfo(table); // [START bigtable_get_table] } catch (Exception ex) { Console.WriteLine($"Error getting table {ex.Message}"); } // [END bigtable_get_table] return 0; } private static object CreateMaxAgeFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating column family cf1 with max age GC rule..."); // [START bigtable_create_family_gc_max_age] // Create a column family with GC policy : maximum age // where age = current time minus cell timestamp // Initialize request argument(s). // Define the GC rule to retain data with max age of 5 days GcRule MaxAgeRule = new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5.0)) }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = MaxAgeRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to create column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Create = columnFamily, Id = "cf1" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Created column family"); // Print table information. GetTable(tableId); } catch (Exception ex) { Console.WriteLine($"Error creating column family {ex.Message}"); } // [END bigtable_create_family_gc_max_age] return 0; } private static object CreateMaxVersionsFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating column family cf2 with max versions GC rule..."); // [START bigtable_create_family_gc_max_versions] // Create a column family with GC policy : most recent N versions // where 1 = most recent version // Initialize request argument(s). // Define the GC policy to retain only the most recent 2 versions GcRule maxVersionsRule = new GcRule { MaxNumVersions = 2 }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = maxVersionsRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to create column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Create = columnFamily, Id = "cf2" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Created column family"); // [END bigtable_create_family_gc_max_versions] // Print table information. GetTable(tableId); // [START bigtable_create_family_gc_max_versions] } catch (Exception ex) { Console.WriteLine($"Error creating column family {ex.Message}"); } // [END bigtable_create_family_gc_max_versions] return 0; } private static object CreateUnionFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating column family cf3 with union GC rule..."); // [START bigtable_create_family_gc_union] // Create a column family with GC policy to drop data that matches at least one condition. // Initialize request argument(s). // Define a GC rule to drop cells older than 5 days or not the most recent version. GcRule.Types.Union unionRule = new GcRule.Types.Union { Rules = { new GcRule { MaxNumVersions = 1 }, new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) } } }; GcRule gcRule = new GcRule { Union = unionRule }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to create column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Create = columnFamily, Id = "cf3" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Created column family"); // [END bigtable_create_family_gc_union] // Print table information. GetTable(tableId); // [START bigtable_create_family_gc_union] } catch (Exception ex) { Console.WriteLine($"Error creating column family {ex.Message}"); } // [END bigtable_create_family_gc_union] return 0; } private static object CreateIntersectionFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating column family cf4 with intersect GC rule..."); // [START bigtable_create_family_gc_intersection] // Create a column family with GC policy to drop data that matches all conditions. // Initialize request argument(s). // GC rule: Drop cells older than 5 days AND older than the most recent 2 versions. GcRule.Types.Intersection intersectionRule = new GcRule.Types.Intersection { Rules = { new GcRule { MaxNumVersions = 2 }, new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) } } }; GcRule gcRule = new GcRule { Intersection = intersectionRule }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to create column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Create = columnFamily, Id = "cf4" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Created column family"); // [END bigtable_create_family_gc_intersection] // Print table information. GetTable(tableId); // [START bigtable_create_family_gc_intersection] } catch (Exception ex) { Console.WriteLine($"Error creating column family {ex.Message}"); } // [END bigtable_create_family_gc_intersection] return 0; } private static object CreateNestedFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Creating column family cf5 with a nested GC rule..."); // [START bigtable_create_family_gc_nested] // Create a nested GC rule: // Drop cells that are either older than the 10 recent versions // OR // Drop cells that are older than 5 days AND older than the 2 recent versions. // Initialize request argument(s). GcRule.Types.Intersection intersectionRule = new GcRule.Types.Intersection { Rules = { new GcRule { MaxNumVersions = 2 }, new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) } } }; GcRule.Types.Union nestedRule = new GcRule.Types.Union { Rules = { new GcRule { MaxNumVersions = 10 }, new GcRule { Intersection = intersectionRule } } }; GcRule gcRule = new GcRule { Union = nestedRule }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to create column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Create = columnFamily, Id = "cf5" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Created column family"); // [END bigtable_create_family_gc_nested] // Print table information. GetTable(tableId); // [START bigtable_create_family_gc_nested] } catch (Exception ex) { Console.WriteLine($"Error creating column family {ex.Message}"); } // [END bigtable_create_family_gc_nested] return 0; } private static object UpdateFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Updating column family cf1 GC rule..."); // [START bigtable_update_gc_rule] // Update the column family metadata to update the GC rule. // Initialize request argument(s). // Updated column family GC rule. GcRule maxVersionsRule = new GcRule { MaxNumVersions = 1 }; // Column family to create ColumnFamily columnFamily = new ColumnFamily { GcRule = maxVersionsRule }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to update column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Update = columnFamily, Id = "cf1" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Updated column family"); // [END bigtable_update_gc_rule] // Print table information. GetTable(tableId); // [START bigtable_update_gc_rule] } catch (Exception ex) { Console.WriteLine($"Error updating column family {ex.Message}"); } // [END bigtable_update_gc_rule] return 0; } private static object DeleteFamily(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Deleting column family cf2 GC rule..."); // [START bigtable_delete_family] // Delete a column family. // Initialize request argument(s). GcRule maxVersionsRule = new GcRule { MaxNumVersions = 1 }; TableName tableName = new TableName(projectId, instanceId, tableId); // Modification to update column family ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification { Drop = true, Id = "cf2" }; ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest { TableName = tableName, Modifications = { modification } }; try { // Make the request Table response = bigtableTableAdminClient.ModifyColumnFamilies(request); Console.WriteLine("Deleted column family"); // [END bigtable_delete_family] // Print table information. GetTable(tableId); // [START bigtable_delete_family] } catch (Exception ex) { Console.WriteLine($"Error deleting column family {ex.Message}"); } // [END bigtable_delete_family] return 0; } private static object DeleteTable(string tableId) { BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create(); Console.WriteLine("Deleting table"); // [START bigtable_delete_table] // Delete the entire table. // Initialize request argument(s). // Table to delete TableName tableName = new TableName(projectId, instanceId, tableId); DeleteTableRequest request = new DeleteTableRequest { TableName = tableName }; try { // Make the request. bigtableTableAdminClient.DeleteTable(request); // [END bigtable_delete_table] // Check if table still exists. if (!TableExist(bigtableTableAdminClient, tableId)) { Console.WriteLine($"Table {tableId} deleted successfully"); } else { Console.WriteLine($"Table {tableId} was not deleted"); } // [START bigtable_delete_table] } catch (Exception ex) { Console.WriteLine($"Error creating table {ex.Message}"); GetTable(tableId); } // [END bigtable_delete_table] return 0; } private static bool TableExist(BigtableTableAdminClient bigtableTableAdminClient, string tableId) { // Check if table exists Console.WriteLine("Checking if table exists..."); var tables = bigtableTableAdminClient.ListTables(s_instanceName); return tables.Any(x => x.TableName.TableId == tableId); } private static void PrintTableInfo(Table table) { Console.WriteLine(new string('-', 50)); Console.WriteLine("Printing table information"); Console.WriteLine($"{"Table ID:",-30}{table.TableName.TableId}"); foreach (KeyValuePair<string, ColumnFamily> ColumnFamily in table.ColumnFamilies) { Console.WriteLine($"{"Column family:",-30}{ColumnFamily.Key}"); PrintGcRuleInfo(ColumnFamily.Value); } } private static void PrintGcRuleInfo(ColumnFamily family) { Console.WriteLine($"{"GC Rule:",-30}{family.GcRule}"); } public static int Main(string[] args) { if (projectId == "YOUR-PROJECT" + "-ID") { Console.WriteLine("Edit TableAdmin.cs and replace YOUR-PROJECT-ID with your project id."); return -1; } if (instanceId == "YOUR-INSTANCE" + "-ID") { Console.WriteLine("Edit TableAdmin.cs and replace YOUR-INSTANCE-ID with your instance id."); return -1; } var verbMap = new VerbMap<object>(); verbMap .Add((CreateTableOptions opts) => CreateTable(opts.tableId)) .Add((ListTablesOptions opts) => ListTables()) .Add((GetTableOptions opts) => GetTable(opts.tableId)) .Add((CreateMaxAgeFamilyOptions opts) => CreateMaxAgeFamily(opts.tableId)) .Add((CreateMaxVersionsFamilyOptions opts) => CreateMaxVersionsFamily(opts.tableId)) .Add((CreateUnionFamilyOptions opts) => CreateUnionFamily(opts.tableId)) .Add((CreateIntersectionFamilyOptions opts) => CreateIntersectionFamily(opts.tableId)) .Add((CreateNestedFamilyOptions opts) => CreateNestedFamily(opts.tableId)) .Add((UpdateFamilyOptions opts) => UpdateFamily(opts.tableId)) .Add((DeleteFamilyOptions opts) => DeleteFamily(opts.tableId)) .Add((DeleteTableOptions opts) => DeleteTable(opts.tableId)) .NotParsedFunc = (err) => 1; return (int)verbMap.Run(args); } } }