def CreateDomainMapping(self, domain_mapping_ref, service_name, config_changes, force_override=False): """Create a domain mapping. Args: domain_mapping_ref: Resource, domainmapping resource. service_name: str, the service to which to map domain. config_changes: list of ConfigChanger to modify the domainmapping with force_override: bool, override an existing mapping of this domain. Returns: A domain_mapping.DomainMapping object. """ messages = self.messages_module new_mapping = domain_mapping.DomainMapping.New( self._client, domain_mapping_ref.namespacesId) new_mapping.name = domain_mapping_ref.domainmappingsId new_mapping.route_name = service_name new_mapping.force_override = force_override for config_change in config_changes: new_mapping = config_change.Adjust(new_mapping) request = messages.RunNamespacesDomainmappingsCreateRequest( domainMapping=new_mapping.Message(), parent=domain_mapping_ref.Parent().RelativeName()) with metrics.RecordDuration(metric_names.CREATE_DOMAIN_MAPPING): try: response = self._client.namespaces_domainmappings.Create(request) except api_exceptions.HttpConflictError: raise serverless_exceptions.DomainMappingCreationError( 'Domain mapping to [{}] for service [{}] already exists.'.format( domain_mapping_ref.Name(), service_name)) # 'run domain-mappings create' is synchronous. Poll for its completion.x with progress_tracker.ProgressTracker('Creating...'): mapping = waiter.PollUntilDone( DomainMappingResourceRecordPoller(self), domain_mapping_ref) ready = mapping.conditions.get('Ready') message = None if ready and ready.get('message'): message = ready['message'] if not mapping.records: if (mapping.ready_condition['reason'] == domain_mapping.MAPPING_ALREADY_EXISTS_CONDITION_REASON): raise serverless_exceptions.DomainMappingAlreadyExistsError( 'Domain mapping to [{}] is already in use elsewhere.'.format( domain_mapping_ref.Name())) raise serverless_exceptions.DomainMappingCreationError( message or 'Could not create domain mapping.') if message: log.status.Print(message) return mapping return domain_mapping.DomainMapping(response, messages)
def Run(self, args): """Create a domain mapping.""" conn_context = connection_context.GetConnectionContext( args, product=flags.Product.RUN) domain_mapping_ref = args.CONCEPTS.domain.Parse() # Check if the provided domain has already been verified # if mapping to a non-CRoGKE service if flags.GetPlatform() == flags.PLATFORM_MANAGED: client = global_methods.GetServerlessClientInstance() all_domains = global_methods.ListVerifiedDomains( client, flags.GetRegion(args)) # If not already verified, explain and error out if all(d.id not in domain_mapping_ref.Name() for d in all_domains): if not all_domains: domains_text = 'You currently have no verified domains.' else: domains = ['* {}'.format(d.id) for d in all_domains] domains_text = ('Currently verified domains:\n{}'.format( '\n'.join(domains))) raise exceptions.DomainMappingCreationError( 'The provided domain does not appear to be verified ' 'for the current account so a domain mapping ' 'cannot be created. Visit [{help}] for more information.' '\n{domains}'.format(help=DOMAIN_MAPPINGS_HELP_DOCS_URL, domains=domains_text)) with serverless_operations.Connect(conn_context) as client: mapping = client.CreateDomainMapping(domain_mapping_ref, args.service, args.force_override) for record in mapping.records: record.name = record.name or mapping.route_name return mapping.records
def CreateDomainMapping(self, domain_mapping_ref, service_name): """Create a domain mapping. Args: domain_mapping_ref: Resource, domainmapping resource. service_name: str, the service to which to map domain. Returns: A domain_mapping.DomainMapping object. """ messages = self._messages_module new_mapping = domain_mapping.DomainMapping.New( self._client, domain_mapping_ref.namespacesId) new_mapping.name = domain_mapping_ref.domainmappingsId new_mapping.route_name = service_name request = messages.RunNamespacesDomainmappingsCreateRequest( domainMapping=new_mapping.Message(), parent=domain_mapping_ref.Parent().RelativeName()) with metrics.RecordDuration(metric_names.CREATE_DOMAIN_MAPPING): try: response = self._client.namespaces_domainmappings.Create( request) except api_exceptions.HttpConflictError: raise serverless_exceptions.DomainMappingCreationError( 'Domain mapping to [{}] for service [{}] already exists.'. format(domain_mapping_ref.Name(), service_name)) # 'run domain-mappings create' is synchronous. Poll for its completion.x with progress_tracker.ProgressTracker('Creating...'): mapping = waiter.PollUntilDone( DomainMappingResourceRecordPoller(self), domain_mapping_ref) ready = mapping.conditions.get('Ready') records = getattr(mapping.status, 'resourceRecords', None) message = None if ready and ready.get('message'): message = ready['message'] if not records: raise serverless_exceptions.DomainMappingCreationError( message or 'Could not create domain mapping.') if message: log.status.Print(message) return records return domain_mapping.DomainMapping(response, messages)
def Run(self, args): """Create a domain mapping.""" # domains.cloudrun.com api group only supports v1alpha1 on clusters. conn_context = connection_context.GetConnectionContext( args, flags.Product.RUN, self.ReleaseTrack(), version_override=('v1alpha1' if platforms.GetPlatform() != platforms.PLATFORM_MANAGED else None)) domain_mapping_ref = args.CONCEPTS.domain.Parse() changes = [ config_changes.SetLaunchStageAnnotationChange(self.ReleaseTrack()) ] # Check if the provided domain has already been verified # if mapping to a non-CRoGKE service if platforms.GetPlatform() == platforms.PLATFORM_MANAGED: client = global_methods.GetServerlessClientInstance() all_domains = global_methods.ListVerifiedDomains(client) # If not already verified, explain and error out if all(d.id not in domain_mapping_ref.Name() for d in all_domains): if not all_domains: domains_text = 'You currently have no verified domains.' else: domains = ['* {}'.format(d.id) for d in all_domains] domains_text = ('Currently verified domains:\n{}'.format( '\n'.join(domains))) raise exceptions.DomainMappingCreationError( 'The provided domain does not appear to be verified ' 'for the current account so a domain mapping ' 'cannot be created. Visit [{help}] for more information.' '\n{domains}'.format(help=DOMAIN_MAPPINGS_HELP_DOCS_URL, domains=domains_text)) with serverless_operations.Connect(conn_context) as client: try: mapping = client.CreateDomainMapping(domain_mapping_ref, args.service, changes, args.force_override) except exceptions.DomainMappingAlreadyExistsError as e: if console_io.CanPrompt() and console_io.PromptContinue( ('This domain is already being used as a mapping elsewhere. ' 'The existing mapping can be overriden by passing ' '`--force-override` or by continuing at the prompt below.' ), prompt_string='Override the existing mapping'): deletion.Delete(domain_mapping_ref, client.GetDomainMapping, client.DeleteDomainMapping, async_=False) mapping = client.CreateDomainMapping( domain_mapping_ref, args.service, changes, True) else: raise e for record in mapping.records: record.name = record.name or mapping.route_name return mapping.records