GCP .NET - 1.0

Extension ID

com.castsoftware.dotnet.gcp

What’s new

See Release Notes.

In what situation should you install this extension?

This extension should be used for analyzing .NET source code using any of the supported Google Cloud Platform Bigtable and CloudStorage services. 

Supported services and frameworks

Framework →

Services ↓
SDK

2.x
SDK

3.x
SDK

4.x
Bigtable N/A
CloudStorage
PubSub N/A

Compatibility

Core release Operating System Supported
8.4.x Microsoft Windows / Linux
8.3.x Microsoft Windows

Objects

Icon Description
DotNet GCP Bigtable Table
DotNet GCP Unknown Bigtable Table
DotNet GCP CloudStorage Bucket
DotNet GCP CloudStorage Unknown Bucket
DotNet GCP PubSub Publisher
DotNet GCP PubSub Unknown Publisher
DotNet GCP PubSub Receiver
DotNet GCP PubSub Unknown Receiver

Support for SDK

Support for Cloud Bigtable APIs for SDK v2

For the following methods of the clients Google.Cloud.Bigtable.V2.BigtableClient and Google.Cloud.Bigtable.Admin.V2.BigtableTableAdminClient, links are created to the Table:

Link Type Client Methods
useInsertLink

Google.Cloud.Bigtable.V2.BigtableClient

mutateRow, mutateRows, mutateRowAsync, mutateRowsAsync

checkAndMutateRow, checkAndMutateRowAsync

useUpdateLink Google.Cloud.Bigtable.V2.BigtableClient

readModifyWriteRow, readModifyWriteRowAsync

mutateRow, mutateRows, mutateRowAsync, mutateRowsAsync

checkAndMutateRow, checkAndMutateRowAsync

useSelectLink

Google.Cloud.Bigtable.V2.BigtableClient

readRow, readRowAsync, readRows, SampleRowKeys

useDeleteLink

Google.Cloud.Bigtable.V2.BigtableClient

mutateRow, mutateRows,  mutateRowAsync, mutateRowsAsync

checkAndMutateRow, checkAndMutateRowAsync

useDeleteLink Google.Cloud.Bigtable.Admin.V2.BigtableTableAdminClient

dropAllRows, dropAllRowsAsync, dropRowRange, dropRowRangeAsync

What results you can expect?

The analysis of the following source code will create a Dotnet GCP Bigtable Table object named Hello-Bigtable with a useSelectLink.

When the name of a given referred table in the code is not resolved, an unknown table object will be created with name Unknown. There can be a maximum of one unknown table per project.

Example:

using Google.Cloud.Bigtable.Admin.V2;
using Google.Cloud.Bigtable.V2;
using System;

namespace GoogleCloudSamples.Bigtable
{
    public class HelloWorld
    {

        private const string projectId = "YOUR-PROJECT-ID";
        private const string instanceId = "YOUR-INSTANCE-ID";
        private const string tableId = "Hello-Bigtable";

        Google.Cloud.Bigtable.Common.V2.TableName tableName = new Google.Cloud.Bigtable.Common.V2.TableName(projectId, instanceId, tableId);
        BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create();
        BigtableClient bigtableClient = BigtableClient.Create();

        bigtableTableAdminClient.CreateTable(new InstanceName(projectId, instanceId,tableId)
                        
        private static void ReadRowMethod()
        {
            
            RowFilter filter = RowFilters.CellsPerRowLimit(1);
            int rowIndex = 0;

            Row rowRead = bigtableClient.ReadRow(tableName, rowKey: rowKeyPrefix + rowIndex, filter: filter); 
        }
     }
}

Support for CloudStorage

Supported CloudStorage APIs for SDK v2, v3 and v4

For the following methods of the client Google.Cloud.Storage.V1.StorageClient, we create links to the Bucket:

Link Type Client Methods
useInsertLink

Google.Cloud.Storage.V1.StorageClient

UploadObject, UploadObjectAsync

useUpdateLink

Google.Cloud.Storage.V1.StorageClient

CopyObject

useSelectLink

Google.Cloud.Storage.V1.StorageClient

DowloadObject, DownloadObjectAsync

CopyObject

useDeleteLink

Google.Cloud.Storage.V1.StorageClient

DeleteObject, DeleteObjectAsync

What results you can expect?

The analysis of the following source code will create a Dotnet GCP CloudStorage Bucket object named your-unique-bucket-name with a useDeleteLink.

When the name of a given referred bucket in the code is not resolved, an unknown bucket object will be created with name Unknown. There can be a maximum of one unknown bucket per project.

Example:

using Google.Cloud.Storage.V1;
using System;

public class DeleteFileSample
{
    public void DeleteFile(
        string bucketName = "your-unique-bucket-name",
        string objectName = "your-object-name")
    {
        var storage = StorageClient.Create();
        storage.DeleteObject(bucketName, objectName);
        Console.WriteLine($"Deleted {objectName}.");
    }
}

Support for PubSub

Supported PubSub APIs for SDK v2 and v3

The following APIs are supported:

Object Created Methods
Publisher

Google.Cloud.PubSub.V1.PublisherServiceApiClient.Publish

Google.Cloud.PubSub.V1.PublisherServiceApiClient.PublishAsync

Google.Cloud.PubSub.V1.PublisherClient.PublishAsync

Google.Cloud.PubSub.V1.PublisherClientImpl.PublishAsync

Subscription

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.CreateSubscription

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.CreateSubscriptionAsync

Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.CreateSubscription

Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.CreateSubscriptionAsync

Receiver

Google.Cloud.PubSub.V1.SubscriberClient.StartAsync

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.StartAsync

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.Pull

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.PullAsync

Google.Cloud.PubSub.V1.SubscriberServiceApiClient.StreamingPull

Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.Pull

Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.PullAsync

Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.StreamingPull

  • For the Publisher methods, a Dotnet GCP PubSub Publisher object is created. Its name is that of the topic.
  • For the Receiver methods, a Dotnet GCP PubSub Receiver object is created. Its name is that of the subscription. 
  • For the create subscription method, this extension evaluates the subscription name as well as the name of the topic to which the subscription is made. This information is used by the com.castsoftware.wbslinker extension to link publishers with matching receivers.

What results you can expect?

The analysis of the following source code will create a Dotnet GCP PubSub Publisher object named topicId with a callLink to a Dotnet GCP PubSub Receiver.

When the name of a given referred publisher in the code is not resolved, an unknown publisher object will be created with name Unknown. When the name of a given referred subscriber in the code is not resolved, an unknown receiver object will be created with name Unknown.

Publisher example:

public class PublishMessagesAsyncSample
{
    public async Task<int> PublishMessagesAsync(string project, string topic, IEnumerable<string> messageTexts)
    {
        TopicName topicName = TopicName.FromProjectTopic("projectId", "topicId");
        PublisherClient publisher = await PublisherClient.CreateAsync(topicName);

        int publishedMessageCount = 0;
        var publishTasks = messageTexts.Select(async text =>
        {
            try
            {
                string message = await publisher.PublishAsync(text);
                Console.WriteLine($"Published message {message}");
                Interlocked.Increment(ref publishedMessageCount);
            }
            catch (Exception exception)
            {
                Console.WriteLine($"An error ocurred when publishing message {text}: {exception.Message}");
            }
        });
        await Task.WhenAll(publishTasks);
        return publishedMessageCount;
    }
}

Subscription example:

public class CreateSubscriptionSample
{
    public Subscription CreateSubscription(string project, string topic, string subscription)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic("projectId", "topicId");

        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription("projectId", "subscriptionId");
        Subscription subscription = null;

        try
        {
            subscription = subscriber.CreateSubscription(subscriptionName, topicName, pushConfig: null, ackDeadlineSeconds: 60);
        }
        catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
        {
            // Already exists.  That's fine.
        }
        return subscription;
    }
}

Receiver example:

public class PullMessagesAsyncSample
{
    public async Task<int> PullMessagesAsync(string project, string subscription, bool acknowledge)
    {
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription("projectId", "subscriptionId");
        SubscriberClient subscriber = await SubscriberClient.CreateAsync(subscriptionName);
        // SubscriberClient runs your message handle function on multiple
        // threads to maximize throughput.
        int messageCount = 0;
        Task startTask = subscriber.StartAsync((PubsubMessage message, CancellationToken cancel) =>
        {
            string text = System.Text.Encoding.UTF8.GetString(message.Data.ToArray());
            Console.WriteLine($"Message {message.MessageId}: {text}");
            Interlocked.Increment(ref messageCount);
            return Task.FromResult(acknowledge ? SubscriberClient.Reply.Ack : SubscriberClient.Reply.Nack);
        });
        // Run for 5 seconds.
        await Task.Delay(5000);
        await subscriber.StopAsync(CancellationToken.None);
        // Lets make sure that the start task finished successfully after the call to stop.
        await startTask;
        return messageCount;
    }
}

Data sensitivity

This extension is capable of setting a property on GCP Cloud Storage Bucket objects for the following:

  • custom sensitivity
  • GDPR
  • PCI-DSS

See Data Sensitivity for more information.

Known limitations

  • LinkType is not evaluated for mutateRow calls, all linkTypes are created by default for bigtable.