# -*- coding: utf-8 -*- # # Copyright 2015 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Command to assist user in submitting feedback about gcloud. Does one of two things: 1. If invoked in the context of a recent gcloud crash (i.e. an exception that was not caught anywhere in the Cloud SDK), will direct the user to the Cloud SDK bug tracker, with a partly pre-filled form. 2. Otherwise, directs the user to either the Cloud SDK bug tracker, StackOverflow, or the Cloud SDK groups page. """ from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals import datetime import textwrap from googlecloudsdk.calliope import base from googlecloudsdk.command_lib import feedback_util from googlecloudsdk.command_lib import info_holder from googlecloudsdk.core import log from googlecloudsdk.core.console import console_io from googlecloudsdk.core.util import files from googlecloudsdk.core.util import text as text_util import six from six.moves import map STACKOVERFLOW_URL = 'http://stackoverflow.com/questions/tagged/gcloud' GROUPS_PAGE_URL = ('https://groups.google.com/forum/?fromgroups#!forum/' 'google-cloud-dev') FEEDBACK_MESSAGE = """\ We appreciate your feedback. If you have a question, post it on Stack Overflow using the "gcloud" tag at [{0}]. For general feedback, use our groups page [{1}], send a mail to [google-cloud-dev@googlegroups.com] or visit the [#gcloud] IRC channel on freenode. """.format(STACKOVERFLOW_URL, GROUPS_PAGE_URL) FEEDBACK_PROMPT = """\ Would you like to file a bug using our issue tracker site at [{0}] \ (will open a new browser tab)?\ """.format(feedback_util.ISSUE_TRACKER_URL) def _PrintQuiet(info_str, log_data): """Print message referring to various feedback resources for quiet execution. Args: info_str: str, the output of `gcloud info` log_data: info_holder.LogData, log data for the provided log file """ if log_data: if not log_data.traceback: log.Print(('Please consider including the log file [{0}] in any ' 'feedback you submit.').format(log_data.filename)) log.Print(textwrap.dedent("""\ If you have a question, post it on Stack Overflow using the "gcloud" tag at [{0}]. For general feedback, use our groups page [{1}], send a mail to [google-cloud-dev@googlegroups.com], or visit the [#gcloud] IRC channel on freenode. If you have found a bug, file it using our issue tracker site at [{2}]. Please include the following information when filing a bug report:\ """).format(STACKOVERFLOW_URL, GROUPS_PAGE_URL, feedback_util.ISSUE_TRACKER_URL)) divider = feedback_util.GetDivider() log.Print(divider) if log_data and log_data.traceback: log.Print(log_data.traceback) log.Print(info_str.strip()) log.Print(divider) def _SuggestIncludeRecentLogs(): recent_runs = info_holder.LogsInfo().GetRecentRuns() if recent_runs: now = datetime.datetime.now() def _FormatLogData(run): crash = ' (crash detected)' if run.traceback else '' time = 'Unknown time' if run.date: time = text_util.PrettyTimeDelta(now - run.date) + ' ago' return '[{0}]{1}: {2}'.format(run.command, crash, time) idx = console_io.PromptChoice( list(map(_FormatLogData, recent_runs)) + ['None of these'], default=0, message=('Which recent gcloud invocation would you like to provide ' 'feedback about? This will open a new browser tab.')) if idx < len(recent_runs): return recent_runs[idx] @base.ReleaseTracks(base.ReleaseTrack.GA) class Feedback(base.Command): """Provide feedback to the Google Cloud CLI team. The Google Cloud CLI team offers support through a number of channels: * Google Cloud CLI Issue Tracker * Stack Overflow "#gcloud" tag * google-cloud-dev Google group This command lists the available channels and facilitates getting help through one of them by opening a web browser to the relevant page, possibly with information relevant to the current install and configuration pre-populated in form fields on that page. """ detailed_help = { 'EXAMPLES': """ To send feedback, including the log file for the most recent command, run: $ {command} To send feedback with a previously generated log file named 'my-logfile', run: $ {command} --log-file=my-logfile """, } category = base.SDK_TOOLS_CATEGORY @staticmethod def Args(parser): parser.add_argument( '--log-file', help='Path to the log file from a prior gcloud run.') def Run(self, args): info = info_holder.InfoHolder(anonymizer=info_holder.Anonymizer()) log_data = None if args.log_file: try: log_data = info_holder.LogData.FromFile(args.log_file) except files.Error as err: log.warning('Error reading the specified file [{0}]: ' '{1}\n'.format(args.log_file, err)) if args.quiet: _PrintQuiet(six.text_type(info), log_data) else: log.status.Print(FEEDBACK_MESSAGE) if not log_data: log_data = _SuggestIncludeRecentLogs() if log_data or console_io.PromptContinue( prompt_string=('No invocation selected. Would you still like to file ' 'a bug (will open a new browser tab)')): feedback_util.OpenNewIssueInBrowser(info, log_data)