Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gcp - service mgmt switch to service usage api #6320

Merged
merged 5 commits into from
Dec 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 30 additions & 16 deletions tools/c7n_gcp/c7n_gcp/resources/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,41 @@
from c7n_gcp.actions import MethodAction
from c7n_gcp.provider import resources
from c7n_gcp.query import QueryResourceManager, TypeInfo
from c7n.utils import type_schema, local_session
from c7n.utils import type_schema


@resources.register('service')
class Service(QueryResourceManager):
"""GCP Service Management
"""GCP Service Usage Management

https://cloud.google.com/service-usage/docs/reference/rest
https://cloud.google.com/service-infrastructure/docs/service-management/reference/rest/v1/services
"""
class resource_type(TypeInfo):
service = 'servicemanagement'
service = 'serviceusage'
version = 'v1'
component = 'services'
enum_spec = ('list', 'services[]', None)
scope = 'project'
scope_key = 'consumerId'
scope_template = 'project:{}'
name = id = 'serviceName'
default_report_fields = [name, "producerProjectId"]
scope_key = 'parent'
scope_template = 'projects/{}'
name = id = 'name'
default_report_fields = [name, "state"]
asset_type = 'serviceusage.googleapis.com/Service'

@staticmethod
def get(client, resource_info):
serviceName = resource_info['resourceName'].rsplit('/', 1)[-1][1:-1]
return {'serviceName': serviceName}
return client.execute_command('get', {'name': resource_info['resourceName']})

def get_resource_query(self):
# https://cloud.google.com/service-usage/docs/reference/rest/v1/services/list
# default to just listing enabled services, if we add in support for enabling
# services we would want to add some user specified query filtering capability
# here, ala
# use::
# query:
# - filter: "state:DISABLED"
return {'filter': 'state:ENABLED'}


@Service.action_registry.register('disable')
Expand All @@ -44,18 +55,21 @@ class Disable(MethodAction):
methods:
- google.api.servicemanagement.v1.ServiceManagerV1.ActivateServices
filters:
- serviceName: translate.googleapis.com
- config.name: translate.googleapis.com
actions:
- disable
"""

schema = type_schema('disable')
schema = type_schema(
'disable',
dependents={'type': 'boolean', 'default': False},
usage={'enum': ['SKIP', 'CHECK']})

method_spec = {'op': 'disable'}
method_perm = 'update'

def get_resource_params(self, model, resource):
session = local_session(self.manager.session_factory)
return {'serviceName': resource['serviceName'],
return {'name': resource['name'],
'body': {
'consumerId': 'project:{}'.format(
session.get_default_project())}}
'disableDependentServices': self.data.get('dependents', False),
'checkIfServiceHasUsage': self.data.get(
'usage', 'CHECK_IF_SERVICE_HAS_USAGE_UNSPECIFIED')}}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
{
"headers": {
"content-type": "application/json; charset=UTF-8",
"vary": "Origin, X-Origin, Referer",
"date": "Wed, 02 Dec 2020 14:32:14 GMT",
"server": "ESF",
"cache-control": "private",
"x-xss-protection": "0",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"",
"transfer-encoding": "chunked",
"status": "200",
"content-length": "230339",
"-content-encoding": "gzip",
"content-location": "https://serviceusage.googleapis.com/v1/projects/cloud-custodian/services?alt=json&pageToken=EkkKR3R5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLmFwaS5zZXJ2aWNlbWFuYWdlbWVudC52MS5MaXN0U2VydmljZXNSZXF1ZXN0GqwBQ244S1hadWVpNTZaaW95V2tKSFJtSkNRbUpPYW5vLVdqTkdja0pMX0FQN19fdmZIa1dyX19fOGJnWXlhalltV25KcVNucEdlbUpxU21wR0wwWXlhalltV25KcU14WnVlaTU2WmlveVdrSkhSbUpDUW1KT2Fuby1Xak5HY2tKTF9faEJrSVhuclhGVVZDbm1uVUFCYUN3bGoyRnlNUnI5RDBoQURZSWF6NU9rSA%3D%3D"
},
"body": {
"services": [
{
"name": "projects/cloud-custodian/services/deploymentmanager.googleapis.com",
"config": {
"name": "deploymentmanager.googleapis.com",
"title": "Cloud Deployment Manager V2 API",
"documentation": {
"summary": "The Google Cloud Deployment Manager v2 API provides services for configuring, deploying, and\nviewing Google Cloud services and APIs via templates which specify deployments of Cloud\nresources."
},
"quota": {},
"authentication": {},
"usage": {
"requirements": [
"serviceusage.googleapis.com/tos/cloud"
]
},
"monitoredResources": [
{
"type": "serviceruntime.googleapis.com/api",
"labels": [
{
"key": "cloud.googleapis.com/location"
},
{
"key": "cloud.googleapis.com/uid"
},
{
"key": "serviceruntime.googleapis.com/api_version"
},
{
"key": "serviceruntime.googleapis.com/api_method"
},
{
"key": "serviceruntime.googleapis.com/consumer_project"
},
{
"key": "cloud.googleapis.com/project"
},
{
"key": "cloud.googleapis.com/service"
}
]
},
{
"type": "serviceruntime.googleapis.com/consumer_quota",
"labels": [
{
"key": "cloud.googleapis.com/location"
},
{
"key": "cloud.googleapis.com/uid"
},
{
"key": "cloud.googleapis.com/service"
},
{
"key": "cloud.googleapis.com/resource_id"
},
{
"key": "cloud.googleapis.com/resource_node"
},
{
"key": "cloud.googleapis.com/quota_metric"
},
{
"key": "cloud.googleapis.com/quota_location"
}
]
},
{
"type": "serviceruntime.googleapis.com/producer_quota",
"labels": [
{
"key": "cloud.googleapis.com/location"
},
{
"key": "cloud.googleapis.com/uid"
},
{
"key": "cloud.googleapis.com/service"
},
{
"key": "cloud.googleapis.com/resource_id"
},
{
"key": "cloud.googleapis.com/resource_node"
},
{
"key": "cloud.googleapis.com/consumer_resource_node"
},
{
"key": "cloud.googleapis.com/quota_metric"
},
{
"key": "cloud.googleapis.com/quota_location"
}
]
}
],
"monitoring": {
"consumerDestinations": [
{
"monitoredResource": "serviceruntime.googleapis.com/api",
"metrics": [
"serviceruntime.googleapis.com/api/consumer/quota_used_count",
"serviceruntime.googleapis.com/api/consumer/quota_refund_count",
"serviceruntime.googleapis.com/quota/used",
"serviceruntime.googleapis.com/quota/limit",
"serviceruntime.googleapis.com/quota/exceeded",
"serviceruntime.googleapis.com/allocation/consumer/quota_used_count"
]
},
{
"monitoredResource": "serviceruntime.googleapis.com/consumer_quota",
"metrics": [
"serviceruntime.googleapis.com/quota/rate/consumer/used_count",
"serviceruntime.googleapis.com/quota/rate/consumer/refund_count",
"serviceruntime.googleapis.com/quota/allocation/consumer/usage",
"serviceruntime.googleapis.com/quota/consumer/limit",
"serviceruntime.googleapis.com/quota/consumer/exceeded"
]
}
]
}
},
"state": "ENABLED",
"parent": "projects/926761696986"
}
]
}
}

This file was deleted.

This file was deleted.