summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/ci/runner.rb3
-rw-r--r--app/models/concerns/chronic_duration_attribute.rb25
-rw-r--r--spec/models/concerns/chronic_duration_attribute_spec.rb28
3 files changed, 56 insertions, 0 deletions
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index be15fb0f729..cf91ed3c9dc 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -3,6 +3,7 @@ module Ci
extend Gitlab::Ci::Model
include Gitlab::SQL::Pattern
include RedisCacheable
+ include ChronicDurationAttribute
RUNNER_QUEUE_EXPIRY_TIME = 60.minutes
ONLINE_CONTACT_TIMEOUT = 1.hour
@@ -51,6 +52,8 @@ module Ci
cached_attr_reader :version, :revision, :platform, :architecture, :contacted_at, :ip_address
+ chronic_duration_attribute :job_upper_timeout_user_readable, :job_upper_timeout
+
# Searches for runners matching the given query.
#
# This method uses ILIKE on PostgreSQL and LIKE on MySQL.
diff --git a/app/models/concerns/chronic_duration_attribute.rb b/app/models/concerns/chronic_duration_attribute.rb
new file mode 100644
index 00000000000..2bf33174640
--- /dev/null
+++ b/app/models/concerns/chronic_duration_attribute.rb
@@ -0,0 +1,25 @@
+module ChronicDurationAttribute
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def chronic_duration_attribute(virtual_attribute, source_attribute)
+ chronic_duration_attribute_reader(virtual_attribute, source_attribute)
+ chronic_duration_attribute_writer(virtual_attribute, source_attribute)
+ end
+
+ def chronic_duration_attribute_reader(virtual_attribute, source_attribute)
+ define_method(virtual_attribute) do
+ value = self.send(source_attribute) # rubocop:disable GitlabSecurity/PublicSend
+ ChronicDuration.output(value, format: :short) unless value.nil?
+ end
+ end
+
+ def chronic_duration_attribute_writer(virtual_attribute, source_attribute)
+ define_method("#{virtual_attribute}=") do |value|
+ new_value = ChronicDuration.parse(value).to_i
+ self.send("#{source_attribute}=", new_value) # rubocop:disable GitlabSecurity/PublicSend
+ new_value
+ end
+ end
+ end
+end
diff --git a/spec/models/concerns/chronic_duration_attribute_spec.rb b/spec/models/concerns/chronic_duration_attribute_spec.rb
new file mode 100644
index 00000000000..1a352537aaf
--- /dev/null
+++ b/spec/models/concerns/chronic_duration_attribute_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+shared_examples 'ChronicDurationAttribute' do
+ describe 'dynamically defined methods' do
+ it { expect(subject.class).to be_public_method_defined(virtual_field) }
+ it { expect(subject.class).to be_public_method_defined("#{virtual_field}=") }
+
+ it 'parses chronic duration input' do
+ subject.send("#{virtual_field}=", "10m")
+
+ expect(subject.send(source_field)).to eq(600)
+ end
+
+ it 'outputs chronic duration formated value' do
+ subject.send("#{source_field}=", 120)
+
+ expect(subject.send(virtual_field)).to eq('2m')
+ end
+ end
+end
+
+describe 'ChronicDurationAttribute' do
+ let(:source_field) { :maximum_job_timeout }
+ let(:virtual_field) { :maximum_job_timeout_user_readable }
+ subject { Ci::Runner.new }
+
+ it_behaves_like 'ChronicDurationAttribute'
+end