Esempio n. 1
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
Esempio 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.
    """
    # 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
 def testSetsServiceUrl(self):
     traffic_pairs = traffic_pair.GetTrafficTargetPairs(
         spec_traffic=TrafficTargets(
             [TrafficTarget('s1-r1', 10),
              TrafficTarget('s1-r2', 90)]),
         status_traffic=TrafficTargets([]),
         is_platform_managed=False,
         latest_ready_revision_name=None,
         service_url='<url>')
     self.assertEqual(traffic_pairs[0].serviceUrl, '<url>')
     self.assertEqual(traffic_pairs[1].serviceUrl, '<url>')
 def testLatestByNameOnlyManaged(self, targets):
     traffic_pairs = traffic_pair.GetTrafficTargetPairs(
         spec_traffic=TrafficTargets(targets),
         status_traffic=TrafficTargets(targets),
         is_platform_managed=True,
         latest_ready_revision_name='s1-r1')
     self.assertEqual(len(traffic_pairs), 1)
     target_pair = traffic_pairs[0]
     self.assertEqual(target_pair.key, 's1-r1')
     self.assertFalse(target_pair.latestRevision)
     self.assertEqual(target_pair.revisionName, 's1-r1')
     self.assertEqual(target_pair.specPercent, '100')
     self.assertEqual(target_pair.statusPercent, '100')
     self.assertEqual(target_pair.displayRevisionId, 's1-r1')
 def testLatestImplicitManaged(self, spec_targets, status_targets):
     traffic_pairs = traffic_pair.GetTrafficTargetPairs(
         spec_traffic=TrafficTargets(spec_targets),
         status_traffic=TrafficTargets(status_targets),
         is_platform_managed=True,
         latest_ready_revision_name='s1-r1')
     self.assertEqual(len(traffic_pairs), 1)
     target_pair = traffic_pairs[0]
     self.assertEqual(target_pair.key, traffic.LATEST_REVISION_KEY)
     self.assertTrue(target_pair.latestRevision)
     self.assertEqual(target_pair.revisionName, 's1-r1')
     self.assertEqual(target_pair.specPercent, '100')
     self.assertEqual(target_pair.statusPercent, '100')
     self.assertEqual(target_pair.displayRevisionId,
                      'LATEST (currently s1-r1)')
 def Transform(self, record):
     """Transform a service into the output structure of marker classes."""
     pairs = traffic_pair.GetTrafficTargetPairs(
         record.spec_traffic, record.status_traffic, record.is_managed,
         record.status.latestReadyRevisionName)
     fmt = cp.Lines([
         self._GetServiceHeader(record),
         self._GetLabels(record.labels), record.status.url, ' ',
         cp.Labeled([('Traffic',
                      cp.Mapped((p.displayPercent, p.displayRevisionId)
                                for p in pairs))]), ' ',
         cp.Labeled([(self._GetLastUpdated(record),
                      self._RevisionPrinters(record))]),
         self._GetReadyMessage(record)
     ])
     return fmt
Esempio n. 7
0
def TransformTraffic(service):
    """Transforms a service's traffic into a marker class structure to print.

  Generates the custom printing format for a service's traffic using the marker
  classes defined in custom_printer_base.

  Args:
    service: A Service object.

  Returns:
    A custom printer marker object describing the traffic print format.
  """
    traffic_pairs = traffic_pair.GetTrafficTargetPairs(
        service.spec_traffic, service.status_traffic, service.is_managed,
        service.status.latestReadyRevisionName)
    return _TransformTrafficPairs(traffic_pairs)
 def testBothNoLatestNoMatch(self, spec_targets, status_targets):
     traffic_pairs = traffic_pair.GetTrafficTargetPairs(
         spec_traffic=TrafficTargets(spec_targets),
         status_traffic=TrafficTargets(status_targets),
         is_platform_managed=False,
         latest_ready_revision_name=None)
     self.assertEqual(len(traffic_pairs), 2)
     target_pair = traffic_pairs[0]
     self.assertEqual(target_pair.key, 's1-r1')
     self.assertFalse(target_pair.latestRevision)
     self.assertEqual(target_pair.revisionName, 's1-r1')
     self.assertEqual(target_pair.specPercent, '100')
     self.assertEqual(target_pair.statusPercent, '-')
     self.assertEqual(target_pair.displayRevisionId, 's1-r1')
     target_pair = traffic_pairs[1]
     self.assertEqual(target_pair.key, 's1-r2')
     self.assertFalse(target_pair.latestRevision)
     self.assertEqual(target_pair.revisionName, 's1-r2')
     self.assertEqual(target_pair.specPercent, '-')
     self.assertEqual(target_pair.statusPercent, '100')
     self.assertEqual(target_pair.displayRevisionId, 's1-r2')
Esempio n. 9
0
def TransformRouteFields(service_record):
  """Transforms a service's route fields into a marker class structure to print.

  Generates the custom printing format for a service's url, ingress, and traffic
  using the marker classes defined in custom_printer_base.

  Args:
    service_record: A Service object.

  Returns:
    A custom printer marker object describing the route fields print format.
  """
  no_status = service_record.status is None
  traffic_pairs = traffic_pair.GetTrafficTargetPairs(
      service_record.spec_traffic, service_record.status_traffic,
      service_record.is_managed,
      (_INGRESS_UNSPECIFIED
       if no_status else service_record.status.latestReadyRevisionName))
  return _TransformTrafficPairs(traffic_pairs,
                                '' if no_status else service_record.status.url,
                                _GetIngress(service_record))
    def testTraffic_consistentWithCloudRun(self):
        spec_traffic = _run_spec_traffic()
        status_traffic = _run_status_traffic()
        run_traf = run_traffic_pair.GetTrafficTargetPairs(
            runhelpers.TrafficTargets(spec_traffic,
                                      runhelpers.TestMessagesModule()),
            runhelpers.TrafficTargets(status_traffic,
                                      runhelpers.TestMessagesModule()), False,
            "rev1", "service.example.com")
        run_printer = run_traf_printer.TrafficPrinter()
        run_printer.AddRecord(run_traf)
        run_printer.Finish()
        run_out = self.GetOutput()
        self.ClearOutput()

        kuberun_traf = traffic_pair.GetTrafficTargetPairs(
            KUBERUN_SERVICE_TRAFFIC.spec_traffic,
            KUBERUN_SERVICE_TRAFFIC.status_traffic, "rev1",
            "service.example.com")
        self._printer.AddRecord(kuberun_traf)
        self._printer.Finish()

        self.AssertOutputEquals(run_out)