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
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
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')
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)