...

Source file src/edge-infra.dev/pkg/lib/gcp/metricsscopes/metricsscopes.go

Documentation: edge-infra.dev/pkg/lib/gcp/metricsscopes

     1  // Package metricsscopes provides functions for working with GCP Metrics Scopes
     2  // TODO: add link to metrics scopes
     3  package metricsscopes
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  
     9  	metricsscope "cloud.google.com/go/monitoring/metricsscope/apiv1"
    10  	"cloud.google.com/go/monitoring/metricsscope/apiv1/metricsscopepb"
    11  	"google.golang.org/api/option"
    12  )
    13  
    14  // Client allows managing GCP Metrics Scopes for the configured scoping project
    15  type Client struct {
    16  	// ScopingProject can either be the project ID or the project number of the
    17  	// GCP project that will be monitoring other GCP projects
    18  	scopingProject string
    19  	options        []option.ClientOption
    20  }
    21  
    22  // New creates a metrics scopes Client for the provided scoping project +
    23  // client creation options.  When using GOOGLE_APPLICATION_CREDENTIALS or
    24  // workload identity, no options are required.
    25  func New(scopingProject string, opts ...option.ClientOption) *Client {
    26  	c := &Client{
    27  		scopingProject: scopingProject,
    28  		options:        opts,
    29  	}
    30  
    31  	return c
    32  }
    33  
    34  // createClient creates a metrics scopes client, reduces boilerplate in our
    35  // other methods
    36  func (c *Client) createClient(ctx context.Context) (client *metricsscope.MetricsScopesClient, err error) {
    37  	client, err = metricsscope.NewMetricsScopesClient(ctx, c.options...)
    38  	if err != nil {
    39  		return nil, fmt.Errorf("Error creating client: %w", err)
    40  	}
    41  	return
    42  }
    43  
    44  // Function AddMonitoredProject takes in Context, GoogleApplication Credentials and ProjectID of the Monitored Project and ProjectID
    45  // of Scoping Proejct and adds the Monitored Project to MetricsScopes of Scoping Prohect.
    46  func (c *Client) AddMonitoredProject(ctx context.Context, projectID string) (*metricsscope.CreateMonitoredProjectOperation, error) {
    47  	// Creates a client for MetricsScopes.
    48  	client, clientErr := c.createClient(ctx)
    49  	if clientErr != nil {
    50  		return nil, clientErr
    51  	}
    52  	defer client.Close()
    53  
    54  	// Creates a Request for Adding Monitored Project to Scoping Project MetricsScopes
    55  	createReq := &metricsscopepb.CreateMonitoredProjectRequest{
    56  		Parent: fmt.Sprintf("locations/global/metricsScopes/%s", c.scopingProject),
    57  		MonitoredProject: &metricsscopepb.MonitoredProject{
    58  			Name: fmt.Sprintf("locations/global/metricsScopes/%s/projects/%s", c.scopingProject, projectID),
    59  		},
    60  	}
    61  
    62  	createResp, createErr := client.CreateMonitoredProject(ctx, createReq)
    63  
    64  	return createResp, createErr
    65  }
    66  
    67  // QueryMetricsScope returns the list of projects currently being monitored by
    68  // the scoping project
    69  func (c *Client) QueryMetricsScope(ctx context.Context) (*metricsscopepb.MetricsScope, error) {
    70  	// Creates a client for MetricsScopes.
    71  	client, clientErr := c.createClient(ctx)
    72  	if clientErr != nil {
    73  		return nil, clientErr
    74  	}
    75  	defer client.Close()
    76  
    77  	//Creates a Request for getting Scoping Project MetricsScopes
    78  	scopesReq := &metricsscopepb.GetMetricsScopeRequest{
    79  		Name: fmt.Sprintf("locations/global/metricsScopes/%s", c.scopingProject),
    80  	}
    81  
    82  	scopesResp, scopesErr := client.GetMetricsScope(ctx, scopesReq)
    83  
    84  	return scopesResp, scopesErr
    85  }
    86  
    87  // ListMetricsScope returns the list of projects currently monitoring the input
    88  // project (i.e., the scoping projects for the input project ID)
    89  func (c *Client) ListMetricsScope(ctx context.Context, projectID string) (*metricsscopepb.ListMetricsScopesByMonitoredProjectResponse, error) {
    90  	// Creates a client for MetricsScopes.
    91  	client, clientErr := c.createClient(ctx)
    92  	if clientErr != nil {
    93  		return nil, clientErr
    94  	}
    95  	defer client.Close()
    96  
    97  	//Creates a Request for Listing MetricsScopes by Monitored Project.
    98  	listReq := &metricsscopepb.ListMetricsScopesByMonitoredProjectRequest{
    99  		MonitoredResourceContainer: fmt.Sprintf("projects/%s", projectID),
   100  	}
   101  
   102  	listResp, listErr := client.ListMetricsScopesByMonitoredProject(ctx, listReq)
   103  
   104  	return listResp, listErr
   105  }
   106  
   107  // RemoteMetricsScope removes a monitored project from a scoping project
   108  func (c *Client) RemoveMetricsScope(ctx context.Context, projectID string) (*metricsscope.DeleteMonitoredProjectOperation, error) {
   109  	// Creates a client for MetricsScopes.
   110  	client, clientErr := c.createClient(ctx)
   111  	if clientErr != nil {
   112  		return nil, clientErr
   113  	}
   114  	defer client.Close()
   115  
   116  	// Creates a request for deleting monitored project from the Scoping Project MetricsScopes.
   117  	deleteReq := &metricsscopepb.DeleteMonitoredProjectRequest{
   118  		Name: fmt.Sprintf("locations/global/metricsScopes/%s/projects/%s", c.scopingProject, projectID),
   119  	}
   120  
   121  	deleteResp, deleteErr := client.DeleteMonitoredProject(ctx, deleteReq)
   122  
   123  	return deleteResp, deleteErr
   124  }
   125  

View as plain text