Ejemplo n.º 1
0
    def Run(self, args):
        """This is what gets called when the user runs this command.

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

    Returns:
      Some value that we want to have printed later.
    """
        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]
        resource = resource_parser.Parse(args.table_or_view,
                                         collection='bigquery.tables')
        reference = message_conversions.TableResourceToReference(
            bigquery_messages, resource)

        if args.expiration:
            expiration_instant_in_millis = int(
                (bigquery.CurrentTimeInSec() + args.expiration) * 1000)
        else:
            expiration_instant_in_millis = None

        if args.schema:
            new_schema = bigquery_schemas.ReadSchema(args.schema,
                                                     bigquery_messages)
        elif args.schema_file:
            new_schema = bigquery_schemas.ReadSchemaFile(
                args.schema_file, bigquery_messages)
        else:
            new_schema = None

        request = bigquery_messages.BigqueryTablesPatchRequest(
            projectId=reference.projectId,
            datasetId=reference.datasetId,
            tableId=reference.tableId,
            table=bigquery_messages.Table(
                tableReference=reference,
                description=args.description,
                expirationTime=expiration_instant_in_millis,
                friendlyName=args.friendly_name,
                schema=new_schema))

        try:
            apitools_client.tables.Patch(request)
        except apitools_base.HttpError as e:
            raise bigquery.Error.ForHttpError(e)
        log.UpdatedResource(reference)
Ejemplo n.º 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.

    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