Exemplo n.º 1
0
    def UpdateTraffic(self, service_ref, config_changes, tracker, asyn):
        """Update traffic splits for service."""
        if tracker is None:
            tracker = progress_tracker.NoOpStagedProgressTracker(
                stages.UpdateTrafficStages(),
                interruptable=True,
                aborted_message='aborted')
        serv = self.GetService(service_ref)
        if not serv:
            raise serverless_exceptions.ServiceNotFoundError(
                'Service [{}] could not be found.'.format(
                    service_ref.servicesId))

        if serv.configuration:
            raise serverless_exceptions.UnsupportedOperationError(
                'This service is using an old version of Cloud Run for Anthos '
                'that does not support traffic features. Please upgrade to 0.8 '
                'or later.')

        self._UpdateOrCreateService(service_ref, config_changes, False, serv)

        if not asyn:
            getter = functools.partial(self.GetService, service_ref)
            self.WaitForCondition(
                ServiceConditionPoller(getter, tracker, serv=serv))
Exemplo n.º 2
0
  def Run(self, args):
    """Update the traffic split for the service.

    Args:
      args: Args!

    Returns:
      List of traffic.TrafficTargetStatus instances reflecting the change.
    """
    conn_context = connection_context.GetConnectionContext(
        args, flags.Product.RUN, self.ReleaseTrack())
    service_ref = args.CONCEPTS.service.Parse()
    flags.ValidateResource(service_ref)

    changes = flags.GetServiceConfigurationChanges(args)
    if not changes:
      raise exceptions.NoConfigurationChangeError(
          'No traffic configuration change requested.')
    changes.insert(
        0,
        config_changes.DeleteAnnotationChange(
            k8s_object.BINAUTHZ_BREAKGLASS_ANNOTATION))
    changes.append(
        config_changes.SetLaunchStageAnnotationChange(self.ReleaseTrack()))

    is_managed = platforms.GetPlatform() == platforms.PLATFORM_MANAGED
    with serverless_operations.Connect(conn_context) as client:
      deployment_stages = stages.UpdateTrafficStages()
      try:
        with progress_tracker.StagedProgressTracker(
            'Updating traffic...',
            deployment_stages,
            failure_message='Updating traffic failed',
            suppress_output=args.async_) as tracker:
          client.UpdateTraffic(service_ref, changes, tracker, args.async_)
      except:
        serv = client.GetService(service_ref)
        if serv:
          resources = traffic_pair.GetTrafficTargetPairs(
              serv.spec_traffic,
              serv.status_traffic,
              is_managed,
              serv.status.latestReadyRevisionName,
              serv.status.url)
          display.Displayer(
              self, args, resources,
              display_info=args.GetDisplayInfo()).Display()
        raise

      if args.async_:
        pretty_print.Success('Updating traffic asynchronously.')
      else:
        serv = client.GetService(service_ref)
        resources = traffic_pair.GetTrafficTargetPairs(
            serv.spec_traffic,
            serv.status_traffic,
            is_managed,
            serv.status.latestReadyRevisionName,
            serv.status.url)
        return resources
Exemplo n.º 3
0
    def UpdateTraffic(self, service_ref, config_changes, tracker, asyn,
                      is_managed):
        """Update traffic splits for service."""
        if tracker is None:
            tracker = progress_tracker.NoOpStagedProgressTracker(
                stages.UpdateTrafficStages(),
                interruptable=True,
                aborted_message='aborted')
        serv = self.GetService(service_ref)
        if not serv:
            raise serverless_exceptions.ServiceNotFoundError(
                'Service [{}] could not be found.'.format(
                    service_ref.servicesId))

        if not serv.spec.template:
            if is_managed:
                raise serverless_exceptions.UnsupportedOperationError(
                    'Your provider does not support updating traffic for this service.'
                )
            else:
                raise serverless_exceptions.UnsupportedOperationError(
                    'You must upgrade your cluster to version 0.61 or greater '
                    'to update traffic.')
        self._UpdateOrCreateService(service_ref, config_changes, False, serv)

        if not asyn:
            getter = functools.partial(self.GetService, service_ref)
            self.WaitForCondition(ServiceConditionPoller(getter, tracker))
Exemplo n.º 4
0
  def Run(self, args):
    """Update the traffic split for the service.

    Args:
      args: Args!

    Returns:
      List of traffic.TrafficTargetStatus instances reflecting the change.
    """
    # TODO(b/143898356) Begin code that should be in Args
    resource_printer.RegisterFormatter(
        traffic_printer.TRAFFIC_PRINTER_FORMAT,
        traffic_printer.TrafficPrinter)
    args.GetDisplayInfo().AddFormat('traffic')
    # End code that should be in Args

    conn_context = connection_context.GetConnectionContext(
        args, flags.Product.RUN, self.ReleaseTrack())
    service_ref = flags.GetService(args)

    changes = flags.GetConfigurationChanges(args)
    if not changes:
      raise exceptions.NoConfigurationChangeError(
          'No traffic configuration change requested.')

    is_managed = flags.GetPlatform() == flags.PLATFORM_MANAGED
    with serverless_operations.Connect(conn_context) as client:
      deployment_stages = stages.UpdateTrafficStages()
      try:
        with progress_tracker.StagedProgressTracker(
            'Updating traffic...',
            deployment_stages,
            failure_message='Updating traffic failed',
            suppress_output=args.async_) as tracker:
          client.UpdateTraffic(service_ref, changes, tracker, args.async_)
      except:
        serv = client.GetService(service_ref)
        if serv:
          resources = traffic_pair.GetTrafficTargetPairs(
              serv.spec_traffic,
              serv.status_traffic,
              is_managed,
              serv.status.latestReadyRevisionName,
              serv.status.url)
          display.Displayer(
              self, args, resources,
              display_info=args.GetDisplayInfo()).Display()
        raise

    if args.async_:
      pretty_print.Success('Updating traffic asynchronously.')
    else:
      serv = client.GetService(service_ref)
      resources = traffic_pair.GetTrafficTargetPairs(
          serv.spec_traffic,
          serv.status_traffic,
          is_managed,
          serv.status.latestReadyRevisionName,
          serv.status.url)
      return resources
Exemplo n.º 5
0
    def Run(self, args):
        """Update the traffic split for the service.

    Args:
      args: Args!

    Returns:
      List of traffic.TrafficTargetStatus instances reflecting the change.
    """
        conn_context = connection_context.GetConnectionContext(args)
        service_ref = flags.GetService(args)

        if conn_context.supports_one_platform:
            flags.VerifyOnePlatformFlags(args)
        else:
            flags.VerifyGKEFlags(args)

        changes = flags.GetConfigurationChanges(args)
        if not changes:
            raise exceptions.NoConfigurationChangeError(
                'No traffic configuration change requested.')

        self._SetFormat(args)

        with serverless_operations.Connect(conn_context) as client:
            deployment_stages = stages.UpdateTrafficStages()
            try:
                with progress_tracker.StagedProgressTracker(
                        'Updating traffic...',
                        deployment_stages,
                        failure_message='Updating traffic failed',
                        suppress_output=args.async_) as tracker:
                    client.UpdateTraffic(service_ref, changes, tracker,
                                         args.async_)
            except:
                serv = client.GetService(service_ref)
                resources = traffic.GetTrafficTargetPairs(
                    serv.spec.traffic, serv.status.traffic,
                    flags.IsManaged(args), serv.status.latestReadyRevisionName)
                display.Displayer(
                    self, args, resources,
                    display_info=args.GetDisplayInfo()).Display()
                raise

        if args.async_:
            pretty_print.Success('Updating traffic asynchronously.')
        else:
            serv = client.GetService(service_ref)
            resources = traffic.GetTrafficTargetPairs(
                serv.spec.traffic, serv.status.traffic, flags.IsManaged(args),
                serv.status.latestReadyRevisionName)
            return resources
Exemplo n.º 6
0
    def Run(self, args):
        """Update the traffic split for the service.

    Args:
      args: Args!
    """
        conn_context = connection_context.GetConnectionContext(args)
        service_ref = flags.GetService(args)

        if conn_context.supports_one_platform:
            flags.VerifyOnePlatformFlags(args)
        else:
            flags.VerifyGKEFlags(args)

        changes = flags.GetConfigurationChanges(args)
        if not changes:
            raise exceptions.NoConfigurationChangeError(
                'No traffic configuration change requested.')

        with serverless_operations.Connect(conn_context) as client:
            deployment_stages = stages.UpdateTrafficStages()
            with progress_tracker.StagedProgressTracker(
                    'Updating traffic...',
                    deployment_stages,
                    failure_message='Updating traffic failed',
                    suppress_output=args. async) as tracker:
                client.UpdateTraffic(service_ref, changes, tracker,
                                     args. async, flags.IsManaged(args))
                if args. async:
                    pretty_print.Success('Updating traffic asynchronously.')
                else:
                    serv = client.GetService(service_ref)
                    splits = [
                        '{{bold}}{rev}{{reset}}={percent}'.format(
                            rev='latest'
                            if target.latestRevision else target.revisionName,
                            percent=target.percent)
                        for target in serv.spec.traffic
                    ]
                    msg = 'Traffic set to %s.' % ', '.join(splits)

            pretty_print.Success(msg)