File: //snap/google-cloud-cli/current/lib/googlecloudsdk/api_lib/domains/registrations.py
# -*- coding: utf-8 -*- #
# Copyright 2020 Google LLC. All Rights Reserved.
#
# 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.
"""API client library for Cloud Domains Registrations."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from apitools.base.py import list_pager
from googlecloudsdk.api_lib.util import apis
from googlecloudsdk.calliope import base
from googlecloudsdk.core import exceptions
from googlecloudsdk.core import log
ALPHA_API_VERSION = 'v1alpha2'
BETA_API_VERSION = 'v1beta1'
GA_API_VERSION = 'v1'
def GetApiVersionFromArgs(args):
"""Return API version based on args."""
release_track = args.calliope_command.ReleaseTrack()
if release_track == base.ReleaseTrack.ALPHA:
return ALPHA_API_VERSION
if release_track == base.ReleaseTrack.BETA:
return BETA_API_VERSION
if release_track == base.ReleaseTrack.GA:
return GA_API_VERSION
raise exceptions.UnsupportedReleaseTrackError(release_track)
def GetClientInstance(api_version):
return apis.GetClientInstance('domains', api_version)
def GetMessagesModule(api_version, client=None):
client = client or GetClientInstance(api_version)
return client.MESSAGES_MODULE
class RegistrationsClient(object):
"""Client for registrations service in the Cloud Domains API."""
def __init__(self, api_version, client=None, messages=None):
self.client = client or GetClientInstance(api_version)
self.messages = messages or GetMessagesModule(api_version, client)
self._service = self.client.projects_locations_registrations
def PrintSQSPAck(self):
"""Prints FYI acknowledgement about the Google Domains - Squarespace deal."""
ack_message = (
'Domain name registration services are provided by Squarespace '
'(https://domains.squarespace.com),\n'
'pursuant to the Squarespace Terms of Service '
'(https://www.squarespace.com/terms-of-service)\n'
'and Squarespace Domain Registration Agreement '
'(https://www.squarespace.com/domain-registration-agreement),\n'
'which Google resells pursuant to an agreement with Squarespace.\n'
'Google shares your name, contact information, and other '
'domain-related information with Squarespace.\n'
"You can review Squarespace's Privacy Policy "
'(https://www.squarespace.com/privacy) for details on how they '
'process your information.\n'
"Google's Privacy Policy (https://policies.google.com/privacy) "
'describes how Google handles this information as a reseller.\n'
"By choosing to continue, you (1) acknowledge receipt of Google's "
'Privacy Policy and direct us to share this information\n'
'with Squarespace; and (2) agree to the Squarespace Terms of Service '
'(https://www.squarespace.com/terms-of-service) and\n'
'Squarespace Domain Registration Agreement '
'(https://www.squarespace.com/domain-registration-agreement), and\n'
"acknowledge receipt of Squarespace's Privacy Policy "
'(https://www.squarespace.com/privacy).\n'
)
log.status.Print(ack_message)
def Register(
self,
parent_ref,
domain,
dns_settings,
contact_settings,
yearly_price,
labels=None,
hsts_notice_accepted=False,
public_privacy_accepted=False,
validate_only=False,
):
"""Creates a Registration.
Args:
parent_ref: a Resource reference to a domains.projects.locations resource
for the parent of this registration.
domain: str, the name of the domain to register. Used as resource name.
dns_settings: DnsSettings to be used.
contact_settings: ContactSettings to be used.
yearly_price: price for the domain registration and its cost for the
following years.
labels: Unified GCP Labels for the resource.
hsts_notice_accepted: bool, Whether HSTS notice was presented & accepted.
public_privacy_accepted: bool, Whether public privacy notice was presented
& accepted.
validate_only: If set to true, performs only validation, without creating.
Returns:
Operation: the long running operation to register a domain.
"""
domain_notices = []
if hsts_notice_accepted:
domain_notices = [
self.messages.RegisterDomainRequest.DomainNoticesValueListEntryValuesEnum.HSTS_PRELOADED
]
contact_notices = []
if public_privacy_accepted:
contact_notices = [
self.messages.RegisterDomainRequest.ContactNoticesValueListEntryValuesEnum.PUBLIC_CONTACT_DATA_ACKNOWLEDGEMENT
]
req = self.messages.DomainsProjectsLocationsRegistrationsRegisterRequest(
parent=parent_ref.RelativeName(),
registerDomainRequest=self.messages.RegisterDomainRequest(
registration=self.messages.Registration(
domainName=domain,
dnsSettings=dns_settings,
contactSettings=contact_settings,
labels=labels,
),
domainNotices=domain_notices,
contactNotices=contact_notices,
yearlyPrice=yearly_price,
validateOnly=validate_only,
),
)
return self._service.Register(req)
def Transfer(
self,
parent_ref,
domain,
dns_settings,
contact_settings,
authorization_code,
yearly_price,
labels=None,
public_privacy_accepted=False,
validate_only=False,
):
"""Transfers a domain and creates a new Registration.
Args:
parent_ref: a Resource reference to a domains.projects.locations resource
for the parent of this registration.
domain: str, the name of the domain to transfer. Used as resource name.
dns_settings: DnsSettings to be used.
contact_settings: ContactSettings to be used.
authorization_code: The authorization code needed to transfer the domain.
yearly_price: price for the domain transfer and its cost for the following
years.
labels: Unified GCP Labels for the resource.
public_privacy_accepted: bool, Whether public privacy notice was presented
& accepted.
validate_only: If set to true, performs only validation, without
transferring.
Returns:
Operation: the long running operation to transfer a domain.
"""
contact_notices = []
if public_privacy_accepted:
contact_notices = [
self.messages.TransferDomainRequest.ContactNoticesValueListEntryValuesEnum.PUBLIC_CONTACT_DATA_ACKNOWLEDGEMENT
]
registration = self.messages.Registration(
domainName=domain,
dnsSettings=dns_settings,
contactSettings=contact_settings,
labels=labels,
)
req = self.messages.DomainsProjectsLocationsRegistrationsTransferRequest(
parent=parent_ref.RelativeName(),
transferDomainRequest=self.messages.TransferDomainRequest(
registration=registration,
contactNotices=contact_notices,
authorizationCode=self.messages.AuthorizationCode(
code=authorization_code
),
yearlyPrice=yearly_price,
validateOnly=validate_only,
),
)
return self._service.Transfer(req)
def Import(self, parent_ref, domain, labels):
"""Imports a domain and creates a new Registration.
Args:
parent_ref: a Resource reference to a domains.projects.locations resource
for the parent of this registration.
domain: str, the name of the domain to import. Used as resource name.
labels: Unified GCP Labels for the resource.
Returns:
Operation: the long running operation to import a domain.
"""
req = self.messages.DomainsProjectsLocationsRegistrationsImportRequest(
parent=parent_ref.RelativeName(),
importDomainRequest=self.messages.ImportDomainRequest(
domainName=domain, labels=labels
),
)
return self._service.Import(req)
def Export(self, registration_ref):
req = self.messages.DomainsProjectsLocationsRegistrationsExportRequest(
name=registration_ref.RelativeName()
)
return self._service.Export(req)
def Renew(self, registration_ref, yearly_price, validate_only=False):
req = self.messages.DomainsProjectsLocationsRegistrationsRenewDomainRequest(
registration=registration_ref.RelativeName(),
renewDomainRequest=self.messages.RenewDomainRequest(
yearlyPrice=yearly_price, validateOnly=validate_only
),
)
return self._service.RenewDomain(req)
def Delete(self, registration_ref):
req = self.messages.DomainsProjectsLocationsRegistrationsDeleteRequest(
name=registration_ref.RelativeName()
)
return self._service.Delete(req)
def Get(self, registration_ref):
get_req = self.messages.DomainsProjectsLocationsRegistrationsGetRequest(
name=registration_ref.RelativeName()
)
return self._service.Get(get_req)
def RetrieveAuthorizationCode(self, registration_ref):
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsRetrieveAuthorizationCodeRequest(
registration=registration_ref.RelativeName()
)
return self._service.RetrieveAuthorizationCode(req)
def ResetAuthorizationCode(self, registration_ref):
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsResetAuthorizationCodeRequest(
registration=registration_ref.RelativeName()
)
return self._service.ResetAuthorizationCode(req)
def InitiatePushTransfer(self, registration_ref, tag):
req = self.messages.DomainsProjectsLocationsRegistrationsInitiatePushTransferRequest(
registration=registration_ref.RelativeName(),
initiatePushTransferRequest=self.messages.InitiatePushTransferRequest(
tag=tag
),
)
return self._service.InitiatePushTransfer(req)
def RetrieveImportableDomains(
self, parent_ref, limit=None, page_size=None, batch_size=None
):
request = self.messages.DomainsProjectsLocationsRegistrationsRetrieveImportableDomainsRequest(
location=parent_ref.RelativeName(), pageSize=page_size
)
return list_pager.YieldFromList(
self._service,
request,
method='RetrieveImportableDomains',
field='domains',
limit=limit,
batch_size=batch_size,
batch_size_attribute='pageSize',
)
def List(self, parent_ref, limit=None, page_size=None, list_filter=None):
"""List the domain registrations in a given project.
Args:
parent_ref: a Resource reference to a domains.projects.locations resource
to list registrations for.
limit: int, the total number of results to return from the API.
page_size: int, the number of results in each batch from the API.
list_filter: str, filter to apply in the list request.
Returns:
A generator of the domain registrations in the project.
"""
list_req = self.messages.DomainsProjectsLocationsRegistrationsListRequest(
parent=parent_ref.RelativeName(), filter=list_filter
)
return list_pager.YieldFromList(
self._service,
list_req,
batch_size=page_size,
limit=limit,
field='registrations',
batch_size_attribute='pageSize',
)
def Patch(self, registration_ref, labels=None):
"""Updates a Registration.
Used for updating labels.
Args:
registration_ref: a Resource reference to a
domains.projects.locations.registrations resource.
labels: Unified GCP Labels for the resource.
Returns:
Operation: the long running operation to patch registration.
"""
registration = self.messages.Registration()
registration.labels = labels
update_mask = 'labels'
patch_req = self.messages.DomainsProjectsLocationsRegistrationsPatchRequest(
registration=registration,
name=registration_ref.RelativeName(),
updateMask=update_mask,
)
return self._service.Patch(patch_req)
def ConfigureManagement(
self, registration_ref, transfer_lock, preferred_renewal_method
):
"""Updates management settings.
Args:
registration_ref: a Resource reference to a
domains.projects.locations.registrations resource.
transfer_lock: The transfer lock state.
preferred_renewal_method: The preferred Renewal Method.
Returns:
Operation: the long running operation to configure management
registration.
"""
management_settings = self.messages.ManagementSettings(
transferLockState=transfer_lock,
preferredRenewalMethod=preferred_renewal_method,
)
updated_list = []
if transfer_lock:
updated_list += ['transfer_lock_state']
if preferred_renewal_method:
updated_list += ['preferred_renewal_method']
update_mask = ','.join(updated_list)
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsConfigureManagementSettingsRequest(
registration=registration_ref.RelativeName(),
configureManagementSettingsRequest=self.messages.ConfigureManagementSettingsRequest(
managementSettings=management_settings, updateMask=update_mask
),
)
return self._service.ConfigureManagementSettings(req)
def ConfigureDNS(
self, registration_ref, dns_settings, updated, validate_only
):
"""Calls ConfigureDNSSettings method.
Args:
registration_ref: Registration resource reference.
dns_settings: New DNS Settings.
updated: dns_util.DnsUpdateMask object representing an update mask.
validate_only: validate_only flag.
Returns:
Long Running Operation reference.
"""
updated_list = []
if updated.glue_records:
updated_list += ['glue_records']
if updated.google_domains_dnssec:
if updated.name_servers:
updated_list += ['google_domains_dns']
else:
updated_list += ['google_domains_dns.ds_state']
if updated.custom_dnssec:
if updated.name_servers:
updated_list += ['custom_dns']
else:
updated_list += ['custom_dns.ds_records']
update_mask = ','.join(updated_list)
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsConfigureDnsSettingsRequest(
registration=registration_ref.RelativeName(),
configureDnsSettingsRequest=self.messages.ConfigureDnsSettingsRequest(
dnsSettings=dns_settings,
updateMask=update_mask,
validateOnly=validate_only,
),
)
return self._service.ConfigureDnsSettings(req)
def ConfigureContacts(
self,
registration_ref,
contacts,
contact_privacy,
public_contacts_ack,
validate_only,
):
"""Calls ConfigureContactSettings method.
Args:
registration_ref: Registration resource reference.
contacts: New Contacts.
contact_privacy: New Contact privacy.
public_contacts_ack: Whether the user accepted public privacy.
validate_only: validate_only flag.
Returns:
Long Running Operation reference.
"""
updated_list = []
if contact_privacy:
updated_list += ['privacy']
if contacts is None:
contact_settings = self.messages.ContactSettings(privacy=contact_privacy)
else:
contact_settings = self.messages.ContactSettings(
privacy=contact_privacy,
registrantContact=contacts.registrantContact,
adminContact=contacts.adminContact,
technicalContact=contacts.technicalContact,
)
if contacts.registrantContact:
updated_list += ['registrant_contact']
if contacts.adminContact:
updated_list += ['admin_contact']
if contacts.technicalContact:
updated_list += ['technical_contact']
update_mask = ','.join(updated_list)
notices = []
if public_contacts_ack:
notices = [
self.messages.ConfigureContactSettingsRequest.ContactNoticesValueListEntryValuesEnum.PUBLIC_CONTACT_DATA_ACKNOWLEDGEMENT
]
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsConfigureContactSettingsRequest(
registration=registration_ref.RelativeName(),
configureContactSettingsRequest=self.messages.ConfigureContactSettingsRequest(
contactSettings=contact_settings,
updateMask=update_mask,
contactNotices=notices,
validateOnly=validate_only,
),
)
return self._service.ConfigureContactSettings(req)
def ConfigureRegistrantEmail(self, registration_ref, registrant_email):
"""Sets a registrant contact.
This resends registrant email confirmation.
It's done by updating registrant email to the current value.
Args:
registration_ref: a Resource reference to a
domains.projects.locations.registrations resource.
registrant_email: The registrant email.
Returns:
Operation: the long running operation to configure contacts registration.
"""
contact_settings = self.messages.ContactSettings(
registrantContact=self.messages.Contact(email=registrant_email)
)
# pylint: disable=line-too-long
req = self.messages.DomainsProjectsLocationsRegistrationsConfigureContactSettingsRequest(
registration=registration_ref.RelativeName(),
configureContactSettingsRequest=self.messages.ConfigureContactSettingsRequest(
contactSettings=contact_settings,
updateMask='registrant_contact.email',
),
)
return self._service.ConfigureContactSettings(req)
def RetrieveRegisterParameters(self, parent_ref, domain):
# pylint: disable=line-too-long
request = self.messages.DomainsProjectsLocationsRegistrationsRetrieveRegisterParametersRequest(
location=parent_ref.RelativeName(), domainName=domain
)
return self._service.RetrieveRegisterParameters(request).registerParameters
def RetrieveTransferParameters(self, parent_ref, domain):
# pylint: disable=line-too-long
request = self.messages.DomainsProjectsLocationsRegistrationsRetrieveTransferParametersRequest(
location=parent_ref.RelativeName(), domainName=domain
)
return self._service.RetrieveTransferParameters(request).transferParameters
def SearchDomains(self, parent_ref, query):
# pylint: disable=line-too-long
request = (
self.messages.DomainsProjectsLocationsRegistrationsSearchDomainsRequest(
location=parent_ref.RelativeName(), query=query
)
)
return self._service.SearchDomains(request).registerParameters
def RetrieveGoogleDomainsDnsRecords(
self, registration_ref, page_size, page_token
):
# pylint: disable=line-too-long
request = self.messages.DomainsProjectsLocationsRegistrationsRetrieveGoogleDomainsDnsRecordsRequest(
registration=registration_ref.RelativeName(),
pageToken=page_token,
pageSize=page_size,
)
return self._service.RetrieveGoogleDomainsDnsRecords(request)
def RetrieveGoogleDomainsForwardingConfig(self, registration_ref):
# pylint: disable=line-too-long
request = self.messages.DomainsProjectsLocationsRegistrationsRetrieveGoogleDomainsForwardingConfigRequest(
registration=registration_ref.RelativeName(),
)
return self._service.RetrieveGoogleDomainsForwardingConfig(request)