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)
Beispiel #2
0
    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
Beispiel #3
0
    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)
Beispiel #4
0
    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