openSUSE/open-build-service

View on GitHub
src/api/app/models/event/build.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
97%
module Event
  class Build < Base
    self.description = 'Package finished building'
    self.abstract_class = true
    payload_keys :project, :package, :sender, :repository, :arch, :release, :readytime, :srcmd5,
                 :rev, :reason, :bcnt, :verifymd5, :hostarch, :starttime, :endtime, :workerid, :versrel, :previouslyfailed, :successive_failcount, :buildtype

    def subject
      raise AbstractMethodCalled
    end

    def custom_headers
      mid = my_message_id
      h = super
      h['In-Reply-To'] = mid
      h['References'] = mid
      h
    end

    def metric_measurement
      'build'
    end

    def metric_tags
      {
        namespace: ::Project.find_by_name(payload['project'])&.maintained_namespace,
        worker: payload['workerid'],
        arch: payload['arch'],
        reason: reason,
        state: state,
        buildtype: payload['buildtype']
      }
    end

    def metric_fields
      {
        duration: duration_in_seconds,
        latency: latency_in_seconds,
        total: total_in_seconds
      }
    end

    def parameters_for_notification
      super.merge(notifiable_type: 'Package',
                  notifiable_id: ::Package.find_by_project_and_name(payload['project'], payload['package'])&.id)
    end

    def involves_hidden_project?
      Project.unscoped.find_by(name: payload['project'])&.disabled_for?('access', nil, nil)
    end

    private

    # The seconds spent building
    def duration_in_seconds
      payload['endtime'].to_i - payload['starttime'].to_i
    end

    # The seconds spent waiting for a build slot
    def latency_in_seconds
      payload['starttime'].to_i - payload['readytime'].to_i
    end

    # The seconds spent waiting and building
    def total_in_seconds
      payload['endtime'].to_i - payload['readytime'].to_i
    end

    def reason
      payload['reason'].parameterize.underscore
    end

    def my_message_id
      # we put the verifymd5 sum in the message id, so new checkins get new thread, but it doesn't have to be very correct
      md5 = payload.fetch('verifymd5', 'NOVERIFY')[0..6]
      mid = Digest::MD5.hexdigest("#{payload['project']}-#{payload['package']}-#{payload['repository']}-#{md5}")
      "<build-#{mid}@#{URI.parse(Configuration.obs_url).host.downcase}>"
    end
  end
end