Exemplo n.º 1
0
 def execute(self, context):
   cluster = context.options.cluster
   api = context.get_api(cluster)
   response = api.query_job_updates(
       role=context.options.role,
       job_key=context.options.jobspec,
       user=context.options.user,
       update_statuses=context.options.status)
   context.log_response_and_raise(response)
   if context.options.write_json:
     result = []
     for summary in response.result.getJobUpdateSummariesResult.updateSummaries:
       job_entry = {
           "jobkey": AuroraJobKey.from_thrift(cluster, summary.jobKey).to_path(),
           "id": summary.updateId,
           "user": summary.user,
           "started": summary.state.createdTimestampMs,
           "lastModified": summary.state.lastModifiedTimestampMs,
           "status": JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]
       }
       result.append(job_entry)
     context.print_out(json.dumps(result, indent=2, separators=[',', ': '], sort_keys=False))
   else:
     for summary in response.result.getJobUpdateSummariesResult.updateSummaries:
       created = summary.state.createdTimestampMs
       lastMod = summary.state.lastModifiedTimestampMs
       context.print_out("Job: %s, Id: %s, User: %s, Status: %s" % (
           AuroraJobKey.from_thrift(cluster, summary.jobKey).to_path(),
           summary.updateId,
           summary.user,
           JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]))
       context.print_out("Created: %s, Last Modified %s" % (created, lastMod), indent=2)
   return EXIT_OK
Exemplo n.º 2
0
  def execute(self, context):
    update_filter = context.options.filter
    cluster = update_filter.cluster
    if (update_filter.role is not None
        and update_filter.env is not None
        and update_filter.job is not None):

      job_key = AuroraJobKey(
          cluster=cluster,
          role=update_filter.role,
          env=update_filter.env,
          name=update_filter.job)
    else:
      job_key = None

    api = context.get_api(cluster)

    filter_statuses = set()
    for status in context.options.status:
      filter_statuses = filter_statuses.union(set(self.STATUS_GROUPS[status]))

    response = api.query_job_updates(
        role=update_filter.role if job_key is None else None,
        job_key=job_key,
        update_statuses=filter_statuses if filter_statuses else None,
        user=context.options.user)
    context.log_response_and_raise(response)

    # The API does not offer a way to query by environment, so if that filter is requested, we
    # perform a more broad role-based query and filter here.
    summaries = response.result.getJobUpdateSummariesResult.updateSummaries
    if job_key is None and update_filter.env is not None:
      summaries = [s for s in summaries if s.key.job.environment == update_filter.env]

    if context.options.write_json:
      result = []
      for summary in summaries:
        job_entry = {
            "job": AuroraJobKey.from_thrift(cluster, summary.key.job).to_path(),
            "id": summary.key.id,
            "user": summary.user,
            "started": format_timestamp(summary.state.createdTimestampMs),
            "last_modified": format_timestamp(summary.state.lastModifiedTimestampMs),
            "status": JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]
        }
        result.append(job_entry)
      context.print_out(json.dumps(result, indent=2, separators=[',', ': '], sort_keys=False))
    else:
      if summaries:
        context.print_out(self.HEADER)
      for summary in summaries:
        context.print_out(self.FORMAT_STR.format(
            AuroraJobKey.from_thrift(cluster, summary.key.job).to_path(),
            summary.key.id,
            JobUpdateStatus._VALUES_TO_NAMES[summary.state.status],
            summary.user,
            format_timestamp(summary.state.createdTimestampMs),
            format_timestamp(summary.state.lastModifiedTimestampMs))
        )
    return EXIT_OK
Exemplo n.º 3
0
  def execute(self, context):
    job = context.options.instance_spec.jobkey
    instances = (None if context.options.instance_spec.instance == ALL_INSTANCES else
        context.options.instance_spec.instance)
    config = context.get_job_config(job, context.options.config_file)
    if config.raw().has_cron_schedule():
      raise context.CommandError(
          EXIT_COMMAND_FAILURE,
          "Cron jobs may only be updated with \"aurora cron schedule\" command")

    api = context.get_api(config.cluster())
    try:
      resp = api.start_job_update(config, context.options.message, instances)
    except AuroraClientAPI.UpdateConfigError as e:
      raise context.CommandError(EXIT_INVALID_CONFIGURATION, e.message)

    context.log_response_and_raise(resp, err_code=EXIT_API_ERROR,
        err_msg="Failed to start update due to error:")

    if resp.result:
      update_key = resp.result.startJobUpdateResult.key
      url = get_update_page(
        api,
        AuroraJobKey.from_thrift(config.cluster(), update_key.job),
        resp.result.startJobUpdateResult.key.id)
      context.print_out(self.UPDATE_MSG_TEMPLATE % url)

      if context.options.wait:
        return wait_for_update(context, self._clock, api, update_key)
    else:
      context.print_out(combine_messages(resp))

    return EXIT_OK
Exemplo n.º 4
0
 def execute(self, context):
     cluster = context.options.cluster
     api = context.get_api(cluster)
     response = api.query_job_updates(
         role=context.options.role,
         job_key=context.options.jobspec,
         user=context.options.user,
         update_statuses=context.options.status)
     context.log_response_and_raise(response)
     if context.options.write_json:
         result = []
         for summary in response.result.getJobUpdateSummariesResult.updateSummaries:
             job_entry = {
                 "jobkey":
                 AuroraJobKey.from_thrift(cluster,
                                          summary.jobKey).to_path(),
                 "id":
                 summary.updateId,
                 "user":
                 summary.user,
                 "started":
                 summary.state.createdTimestampMs,
                 "lastModified":
                 summary.state.lastModifiedTimestampMs,
                 "status":
                 JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]
             }
             result.append(job_entry)
         context.print_out(
             json.dumps(result,
                        indent=2,
                        separators=[',', ': '],
                        sort_keys=False))
     else:
         for summary in response.result.getJobUpdateSummariesResult.updateSummaries:
             created = summary.state.createdTimestampMs
             lastMod = summary.state.lastModifiedTimestampMs
             context.print_out(
                 "Job: %s, Id: %s, User: %s, Status: %s" %
                 (AuroraJobKey.from_thrift(
                     cluster, summary.jobKey).to_path(), summary.updateId,
                  summary.user,
                  JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]))
             context.print_out("Created: %s, Last Modified %s" %
                               (created, lastMod),
                               indent=2)
     return EXIT_OK
Exemplo n.º 5
0
 def setUp(self):
     self._command = ListUpdates()
     self._job_key = AuroraJobKey.from_thrift("cluster", UPDATE_KEY.job)
     self._mock_options = mock_verb_options(self._command)
     self._mock_options.filter = UpdateFilter(cluster=self.TEST_CLUSTER, role=None, env=None, job=None)
     self._fake_context = FakeAuroraCommandContext()
     self._fake_context.set_options(self._mock_options)
     self._mock_api = self._fake_context.get_api("UNUSED")
Exemplo n.º 6
0
 def setUp(self):
     self._command = StartUpdate()
     self._job_key = AuroraJobKey.from_thrift("cluster", UPDATE_KEY.job)
     self._mock_options = mock_verb_options(self._command)
     self._mock_options.instance_spec = TaskInstanceKey(self._job_key, None)
     self._fake_context = FakeAuroraCommandContext()
     self._fake_context.set_options(self._mock_options)
     self._mock_api = self._fake_context.get_api('UNUSED')
Exemplo n.º 7
0
 def setUp(self):
   self._command = StartUpdate()
   self._job_key = AuroraJobKey.from_thrift("cluster", UPDATE_KEY.job)
   self._mock_options = mock_verb_options(self._command)
   self._mock_options.instance_spec = TaskInstanceKey(self._job_key, None)
   self._fake_context = FakeAuroraCommandContext()
   self._fake_context.set_options(self._mock_options)
   self._mock_api = self._fake_context.get_api('UNUSED')
Exemplo n.º 8
0
 def setUp(self):
   self._command = ListUpdates()
   self._job_key = AuroraJobKey.from_thrift("cluster", UPDATE_KEY.job)
   self._mock_options = mock_verb_options(self._command)
   self._mock_options.filter = UpdateFilter(
     cluster=self.TEST_CLUSTER, role=None, env=None, job=None)
   self._fake_context = FakeAuroraCommandContext()
   self._fake_context.set_options(self._mock_options)
   self._mock_api = self._fake_context.get_api('UNUSED')
Exemplo n.º 9
0
    def execute(self, context):
        job = context.options.instance_spec.jobkey
        instances = (None
                     if context.options.instance_spec.instance == ALL_INSTANCES
                     else context.options.instance_spec.instance)
        update_id = str(uuid.uuid4())
        config = context.get_job_config(job, context.options.config_file)
        if config.raw().has_cron_schedule():
            raise context.CommandError(
                EXIT_COMMAND_FAILURE,
                "Cron jobs may only be updated with \"aurora cron schedule\" command"
            )

        api = context.get_api(config.cluster())
        formatter = DiffFormatter(context, config)
        formatter.show_job_update_diff(instances)

        try:
            resp = api.start_job_update(config, context.options.message,
                                        instances,
                                        {CLIENT_UPDATE_ID: update_id})
        except AuroraClientAPI.UpdateConfigError as e:
            raise context.CommandError(EXIT_INVALID_CONFIGURATION, e.message)

        if not self._is_update_already_in_progress(resp, update_id):
            context.log_response_and_raise(
                resp,
                err_code=EXIT_API_ERROR,
                err_msg=self.FAILED_TO_START_UPDATE_ERROR_MSG)

        if resp.result:
            update_key = resp.result.startJobUpdateResult.key
            url = get_update_page(
                api, AuroraJobKey.from_thrift(config.cluster(),
                                              update_key.job),
                resp.result.startJobUpdateResult.key.id)
            context.print_out(self.UPDATE_MSG_TEMPLATE % url)

            if context.options.open_browser:
                webbrowser.open_new_tab(url)

            if context.options.wait:
                return wait_for_update(context, self._clock, api, update_key,
                                       update_state_to_err_code)
        else:
            context.print_out(combine_messages(resp))

        return EXIT_OK
Exemplo n.º 10
0
  def execute(self, context):
    job = context.options.instance_spec.jobkey
    instances = (None if context.options.instance_spec.instance == ALL_INSTANCES else
        context.options.instance_spec.instance)
    update_id = str(uuid.uuid4())
    config = context.get_job_config(job, context.options.config_file)
    if config.raw().has_cron_schedule():
      raise context.CommandError(
          EXIT_COMMAND_FAILURE,
          "Cron jobs may only be updated with \"aurora cron schedule\" command")

    api = context.get_api(config.cluster())
    formatter = DiffFormatter(context, config)
    formatter.show_job_update_diff(instances)

    try:
      resp = api.start_job_update(config, context.options.message, instances,
          {CLIENT_UPDATE_ID: update_id})
    except AuroraClientAPI.UpdateConfigError as e:
      raise context.CommandError(EXIT_INVALID_CONFIGURATION, e.message)

    if not self._is_update_already_in_progress(resp, update_id):
      context.log_response_and_raise(resp, err_code=EXIT_API_ERROR,
          err_msg=self.FAILED_TO_START_UPDATE_ERROR_MSG)

    if resp.result:
      update_key = resp.result.startJobUpdateResult.key
      url = get_update_page(
        api,
        AuroraJobKey.from_thrift(config.cluster(), update_key.job),
        resp.result.startJobUpdateResult.key.id)
      context.print_out(self.UPDATE_MSG_TEMPLATE % url)

      if context.options.open_browser:
        webbrowser.open_new_tab(url)

      if context.options.wait:
        return wait_for_update(context, self._clock, api, update_key, update_state_to_err_code)
    else:
      context.print_out(combine_messages(resp))

    return EXIT_OK
Exemplo n.º 11
0
    def execute(self, context):
        update_filter = context.options.filter
        cluster = update_filter.cluster
        if (update_filter.role is not None and update_filter.env is not None
                and update_filter.job is not None):

            job_key = AuroraJobKey(cluster=cluster,
                                   role=update_filter.role,
                                   env=update_filter.env,
                                   name=update_filter.job)
        else:
            job_key = None

        api = context.get_api(cluster)

        filter_statuses = set()
        for status in context.options.status:
            filter_statuses = filter_statuses.union(
                set(self.STATUS_GROUPS[status]))

        response = api.query_job_updates(
            role=update_filter.role if job_key is None else None,
            job_key=job_key,
            update_statuses=filter_statuses if filter_statuses else None,
            user=context.options.user)
        context.log_response_and_raise(response)

        # The API does not offer a way to query by environment, so if that filter is requested, we
        # perform a more broad role-based query and filter here.
        summaries = response.result.getJobUpdateSummariesResult.updateSummaries
        if job_key is None and update_filter.env is not None:
            summaries = [
                s for s in summaries
                if s.key.job.environment == update_filter.env
            ]

        if context.options.write_json:
            result = []
            for summary in summaries:
                job_entry = {
                    "job":
                    AuroraJobKey.from_thrift(cluster,
                                             summary.key.job).to_path(),
                    "id":
                    summary.key.id,
                    "user":
                    summary.user,
                    "started":
                    format_timestamp(summary.state.createdTimestampMs),
                    "last_modified":
                    format_timestamp(summary.state.lastModifiedTimestampMs),
                    "status":
                    JobUpdateStatus._VALUES_TO_NAMES[summary.state.status]
                }
                result.append(job_entry)
            context.print_out(
                json.dumps(result,
                           indent=2,
                           separators=[',', ': '],
                           sort_keys=False))
        else:
            if summaries:
                context.print_out(self.HEADER)
            for summary in summaries:
                context.print_out(
                    self.FORMAT_STR.format(
                        AuroraJobKey.from_thrift(cluster,
                                                 summary.key.job).to_path(),
                        summary.key.id,
                        JobUpdateStatus._VALUES_TO_NAMES[summary.state.status],
                        summary.user,
                        format_timestamp(summary.state.createdTimestampMs),
                        format_timestamp(
                            summary.state.lastModifiedTimestampMs)))
        return EXIT_OK
Exemplo n.º 12
0
 def get_update_page(self, api, cluster, update_key):
     return "%s/%s" % (self.get_job_page(
         api, AuroraJobKey.from_thrift(cluster,
                                       update_key.job)), update_key.id)