Example #1
0
    def Build(self, json_text):
        """Builds a Bigquery JsonObject message from JSON text.

    Args:
      json_text: the JSON text, expected to represent an object
    Returns:
      The message in the Bigquery API messages module representing that object.
    Raises:
      bigquery.ClientError if the JSON text is not the valid
        representation of a JSON object
    """
        try:
            json_proto = extra_types.JsonProtoDecoder(json_text)
            util.Typecheck(json_proto, extra_types.JsonObject,
                           'JSON value is not an object.')
        except ValueError as e:
            raise bigquery.ClientError(str(e))
        except exceptions.TypecheckError as e:
            raise bigquery.ClientError(str(e))
        except exceptions.InvalidDataError as e:
            raise bigquery.ClientError(str(e))
        # Convert the top-level extra_types.JsonObject into a
        # self._bigquery_messages.JsonObject. This is a shallow conversion: Both
        # JsonObject classes represent their property values as
        # extra_types.JsonValue objects.
        bigquery_properties = [
            self._bigquery_messages.JsonObject.AdditionalProperty(
                key=proto_property.key, value=proto_property.value)
            for proto_property in json_proto.properties
        ]
        return self._bigquery_messages.JsonObject(
            additionalProperties=bigquery_properties)
Example #2
0
    def Run(self, args):
        """This is what gets called when the user runs this command.

    Args:
      args: an argparse namespace, All the arguments that were provided to this
        command invocation.

    Returns:
      None
    """
        try:
            if args.file:
                with open(args.file, 'r') as json_file:
                    return self._DoAddRows(json_file, args)
            else:
                return self._DoAddRows(sys.stdin, args)
        except IOError as e:
            raise bigquery.ClientError(e)
Example #3
0
    def Run(self, args):
        """This is what gets called when the user runs this command.

    Args:
      args: an argparse namespace, All the arguments that were provided to this
        command invocation.

    Raises:
      bigquery.Error: if no job id was provided and no jobs were running.
      bigquery.TimeoutError: on time out.
    Returns:
      A Job message for the job we were waiting for.
    """
        apitools_client = self.context[commands.APITOOLS_CLIENT_KEY]
        bigquery_messages = self.context[commands.BIGQUERY_MESSAGES_MODULE_KEY]
        resource_parser = self.context[commands.BIGQUERY_REGISTRY_KEY]
        project_id = properties.VALUES.core.project.Get(required=True)

        try:
            max_wait = int(args.max_wait) if args.max_wait else sys.maxint
        except ValueError:
            raise bigquery.ClientError('Invalid wait time: {0}'.format(
                args.max_wait))

        if args.job_id:
            job_resource = resource_parser.Parse(args.job_id,
                                                 collection='bigquery.jobs')
            job_reference = message_conversions.JobResourceToReference(
                bigquery_messages, job_resource)
        else:
            project = bigquery.Project(project_id)
            running_jobs = [
                job for job in project.GetCurrentJobsGenerator()
                if job.state in ('PENDING', 'RUNNING')
            ]
            if len(running_jobs) != 1:
                raise bigquery.Error(
                    'No job ID provided, found {0} running jobs'.format(
                        len(running_jobs)))
            job_reference = running_jobs[0].jobReference

        start_time = bigquery.CurrentTimeInSec()
        job = None
        progress_reporter = job_progress.ProgressReporter(
            job_progress.STATUS_REPORTING_CHANGES if args.
            changed_status_only else job_progress.STATUS_REPORTING_PERIODIC)

        # Create an iterator for polling intervals that yields 1,1,1,1,1,1,1,1,
        # 2,5,8,11,14,17,20,23,26,29, 30,30,30,...
        polling_intervals = itertools.chain(itertools.repeat(1, 8),
                                            xrange(2, 30, 3),
                                            itertools.repeat(30))

        total_wait_so_far = 0
        current_status = 'UNKNOWN'

        while total_wait_so_far < max_wait:

            try:
                request = bigquery_messages.BigqueryJobsGetRequest(
                    projectId=job_reference.projectId,
                    jobId=job_reference.jobId)
                job = apitools_client.jobs.Get(request)
                current_status = job.status.state
                if current_status == 'DONE':
                    progress_reporter.Print(job_reference.jobId,
                                            total_wait_so_far, current_status)
                    break
            except apitools_base.HttpError as server_error:
                try:
                    raise bigquery.Error.ForHttpError(server_error)
                except bigquery.CommunicationError as e:
                    # Communication errors while waiting on a job are okay.
                    log.status.Print(
                        'Transient error during job status check: {0}'.format(
                            e))
                except bigquery.BackendError as e:
                    # Temporary server errors while waiting on a job are okay.
                    log.status.Print(
                        'Transient error during job status check: {0}'.format(
                            e))

            # Every second of this polling interval, update the display of the time
            # waited so far:
            seconds_in_interval = polling_intervals.next()
            total_wait_so_far = bigquery.CurrentTimeInSec() - start_time
            for _ in xrange(seconds_in_interval):
                progress_reporter.Print(job_reference.jobId, total_wait_so_far,
                                        current_status)
                bigquery.Wait(1)
                total_wait_so_far = bigquery.CurrentTimeInSec() - start_time

        else:
            raise bigquery.TimeoutError(
                ('Wait timed out. Operation not finished, in state {0}'.format(
                    current_status)), None, [])
        progress_reporter.Done()
        return job