def Run(self, args): api_client = appengine_api_client.GetApiClient() all_instances = api_client.GetAllInstances( args.service, args.version, version_filter=lambda v: util.Environment.IsFlexible(v.environment)) try: res = resources.REGISTRY.Parse(args.instance) except Exception: # pylint:disable=broad-except # Either the commandline argument is an instance ID, or is empty. # If empty, use interactive selection to choose an instance. instance = instances_util.GetMatchingInstance( all_instances, service=args.service, version=args.version, instance=args.instance) else: instance = instances_util.GetMatchingInstance( all_instances, service=res.servicesId, version=res.versionsId, instance=res.instancesId) console_io.PromptContinue( 'About to disable debug mode for instance [{0}].\n\n' 'Any local changes will be LOST. New instance(s) may spawn depending ' 'on the app\'s scaling settings.'.format(instance), cancel_on_no=True) message = 'Disabling debug mode for instance [{0}]'.format(instance) res = resources.REGISTRY.Parse(instance.id, params={'servicesId': instance.service, 'versionsId': instance.version}, collection='appengine.apps.services.' 'versions.instances') with progress_tracker.ProgressTracker(message): api_client.DeleteInstance(res)
def Run(self, args): api_client = appengine_api_client.GetApiClient() all_instances = api_client.GetAllInstances( args.service, args.version, version_filter=lambda v: util.Environment.IsFlexible(v.environment)) try: res = resources.REGISTRY.Parse(args.instance) except Exception: # pylint:disable=broad-except # If parsing fails, use interactive selection or provided instance ID. instance = instances_util.GetMatchingInstance( all_instances, service=args.service, version=args.version, instance=args.instance) else: instance = instances_util.GetMatchingInstance( all_instances, service=res.servicesId, version=res.versionsId, instance=res.instancesId) console_io.PromptContinue( 'About to enable debug mode for instance [{0}].'.format(instance), cancel_on_no=True) message = 'Enabling debug mode for instance [{0}]'.format(instance) res = resources.REGISTRY.Parse(instance.id, params={'versionsId': instance.version, 'instancesId': instance.id, 'servicesId': instance.service}, collection='appengine.apps.services.' 'versions.instances') with progress_tracker.ProgressTracker(message): api_client.DebugInstance(res)
def Run(self, args): api_client = appengine_api_client.GetApiClientForTrack(self.ReleaseTrack()) all_instances = list(api_client.GetAllInstances( args.service, args.version, version_filter=lambda v: v.environment in [env.FLEX, env.MANAGED_VMS])) try: res = resources.REGISTRY.Parse(args.instance) except Exception: # pylint:disable=broad-except # If parsing fails, use interactive selection or provided instance ID. instance = instances_util.GetMatchingInstance( all_instances, service=args.service, version=args.version, instance=args.instance) else: instance = instances_util.GetMatchingInstance( all_instances, service=res.servicesId, version=res.versionsId, instance=res.instancesId) console_io.PromptContinue( 'About to enable debug mode for instance [{0}].'.format(instance), cancel_on_no=True) message = 'Enabling debug mode for instance [{0}]'.format(instance) res = resources.REGISTRY.Parse( instance.id, params={ 'appsId': properties.VALUES.core.project.GetOrFail, 'versionsId': instance.version, 'instancesId': instance.id, 'servicesId': instance.service, }, collection='appengine.apps.services.versions.instances') with progress_tracker.ProgressTracker(message): api_client.DebugInstance(res)
def Run(self, args): client = appengine_client.AppengineClient() # --user-output-enabled=false prevents this from printing, as well as from # consuming the generator from the other command # The command being called here uses a cli.Execute call under-the-hood, so # in order to avoid leaking the abstraction we defer to the implementation # in `instances list`. all_instances = list( self.cli.Execute([ 'preview', 'app', 'instances', 'list', '--user-output-enabled=false', '--project', properties.VALUES.core.project.Get() ])) instance = instances_util.GetMatchingInstance(all_instances, service=args.service, version=args.version, instance=args.instance) console_io.PromptContinue( 'Enabling debug mode for instance [{0}].'.format(instance), cancel_on_no=True) client.SetManagedBySelf(module=instance.service, version=instance.version, instance=instance.id) log.status.Print( 'Enabled debug mode for instance [{0}].'.format(instance))
def testGetMatchingInstance_NonInteractiveNoMatches(self): with self.assertRaisesRegex( instances_util.InvalidInstanceSpecificationError, r'No instances match the given specification\.\n\n' r"All instances: \['service1/v1/i1', 'service1/v1/i2', " r"'service1/v2/i3', 'service2/v1/i4'\]"): instances_util.GetMatchingInstance(list(self.instances.values()), instance='bad')
def testGetMatchingInstance_Interactive(self): self.select_mock.return_value = self.instances['i1'] self.assertEqual( instances_util.GetMatchingInstance(list(self.instances.values())), self.instances['i1']) self.select_mock.assert_called_once_with(list(self.instances.values()), service=None, version=None)
def testGetMatchingInstance_NonInteractiveTooManyMatches(self): # In order to generate more than one match, we need more than one instance # with the same ID. We don't have that in self.instances because it makes # the other tests more difficult to write. instances = [ instances_util.Instance.FromResourcePath('service1/v1/abcd'), instances_util.Instance.FromResourcePath('service1/v2/abcd') ] with self.assertRaisesRegex( instances_util.InvalidInstanceSpecificationError, r'More than one instance matches the given specification\.\n\n' r"Matching instances: \['service1/v1/abcd', 'service1/v2/abcd'\]"): instances_util.GetMatchingInstance(instances, instance='abcd')
def Run(self, args): api_client = appengine_api_client.GetApiClient() all_instances = api_client.GetAllInstances(args.service, args.version) # Only VM instances can be placed in debug mode for now. all_instances = filter(operator.attrgetter('instance.vmName'), all_instances) instance = instances_util.GetMatchingInstance( all_instances, service=args.service, version=args.version, instance=args.instance) console_io.PromptContinue( 'About to disable debug mode for instance [{0}].\n\n' 'Any local changes will be LOST. New instance(s) may spawn depending ' 'on the app\'s scaling settings.'.format(instance), cancel_on_no=True) message = 'Disabling debug mode for instance [{0}]'.format(instance) with progress_tracker.ProgressTracker(message): api_client.DeleteInstance(service=instance.service, version=instance.version, instance=instance.id)
def Run(self, args): api_client = appengine_api_client.GetApiClient() all_instances = api_client.GetAllInstances(args.service, args.version) # Only VM instances can be placed in debug mode for now. all_instances = filter(operator.attrgetter('instance.vmName'), all_instances) instance = instances_util.GetMatchingInstance(all_instances, service=args.service, version=args.version, instance=args.instance) console_io.PromptContinue( 'About to enable debug mode for instance [{0}].'.format(instance), cancel_on_no=True) message = 'Enabling debug mode for instance [{0}]'.format(instance) with console_io.ProgressTracker(message): api_client.DebugInstance(service=instance.service, version=instance.version, instance=instance.id)
def testGetMatchingInstance_NonInteractive(self): for instance_id, instance in self.instances.items(): self.assertEqual( instances_util.GetMatchingInstance(list(self.instances.values()), instance=instance_id), instance)