Commit 4688eb47 authored by Shinya Maeda's avatar Shinya Maeda

Rename cron_time_zone to cron_timezone. Separate add_concurrent_foreign_key.

parent 1dbc888e
...@@ -12,13 +12,13 @@ module Ci ...@@ -12,13 +12,13 @@ module Ci
validates :trigger, presence: { unless: :importing? } validates :trigger, presence: { unless: :importing? }
validates :cron, cron: true, presence: { unless: :importing? } validates :cron, cron: true, presence: { unless: :importing? }
validates :cron_time_zone, cron_time_zone: true, presence: { unless: :importing? } validates :cron_timezone, cron_timezone: true, presence: { unless: :importing? }
validates :ref, presence: { unless: :importing? } validates :ref, presence: { unless: :importing? }
after_create :schedule_next_run! after_create :schedule_next_run!
def schedule_next_run! def schedule_next_run!
next_time = Gitlab::Ci::CronParser.new(cron, cron_time_zone).next_time_from(Time.now) next_time = Gitlab::Ci::CronParser.new(cron, cron_timezone).next_time_from(Time.now)
update!(next_run_at: next_time) if next_time.present? update!(next_run_at: next_time) if next_time.present?
end end
end end
......
# CronTimeZoneValidator # CronTimezoneValidator
# #
# Custom validator for CronTimeZone. # Custom validator for CronTimezone.
class CronTimeZoneValidator < ActiveModel::EachValidator class CronTimezoneValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
cron_parser = Gitlab::Ci::CronParser.new(record.cron, record.cron_time_zone) cron_parser = Gitlab::Ci::CronParser.new(record.cron, record.cron_timezone)
record.errors.add(attribute, " is invalid syntax") unless cron_parser.cron_time_zone_valid? record.errors.add(attribute, " is invalid syntax") unless cron_parser.cron_timezone_valid?
end end
end end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# Custom validator for Cron. # Custom validator for Cron.
class CronValidator < ActiveModel::EachValidator class CronValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
cron_parser = Gitlab::Ci::CronParser.new(record.cron, record.cron_time_zone) cron_parser = Gitlab::Ci::CronParser.new(record.cron, record.cron_timezone)
record.errors.add(attribute, " is invalid syntax") unless cron_parser.cron_valid? record.errors.add(attribute, " is invalid syntax") unless cron_parser.cron_valid?
end end
end end
...@@ -3,9 +3,7 @@ class CreateCiTriggerSchedules < ActiveRecord::Migration ...@@ -3,9 +3,7 @@ class CreateCiTriggerSchedules < ActiveRecord::Migration
DOWNTIME = false DOWNTIME = false
disable_ddl_transaction! def change
def up
create_table :ci_trigger_schedules do |t| create_table :ci_trigger_schedules do |t|
t.integer "project_id" t.integer "project_id"
t.integer "trigger_id", null: false t.integer "trigger_id", null: false
...@@ -13,17 +11,11 @@ class CreateCiTriggerSchedules < ActiveRecord::Migration ...@@ -13,17 +11,11 @@ class CreateCiTriggerSchedules < ActiveRecord::Migration
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "cron" t.string "cron"
t.string "cron_time_zone" t.string "cron_timezone"
t.datetime "next_run_at" t.datetime "next_run_at"
end end
add_index :ci_trigger_schedules, ["next_run_at"], name: "index_ci_trigger_schedules_on_next_run_at", using: :btree add_index :ci_trigger_schedules, :next_run_at
add_index :ci_trigger_schedules, ["project_id"], name: "index_ci_trigger_schedules_on_project_id", using: :btree add_index :ci_trigger_schedules, :project_id
add_concurrent_foreign_key :ci_trigger_schedules, :ci_triggers, column: :trigger_id, on_delete: :cascade
end
def down
remove_foreign_key :ci_trigger_schedules, column: :trigger_id
drop_table :ci_trigger_schedules
end end
end end
class AddTriggerIdForeignKey < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_foreign_key :ci_trigger_schedules, :ci_triggers, column: :trigger_id, on_delete: :cascade
end
def down
remove_foreign_key :ci_trigger_schedules, column: :trigger_id
end
end
...@@ -307,7 +307,7 @@ ActiveRecord::Schema.define(version: 20170405080720) do ...@@ -307,7 +307,7 @@ ActiveRecord::Schema.define(version: 20170405080720) do
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "cron" t.string "cron"
t.string "cron_time_zone" t.string "cron_timezone"
t.datetime "next_run_at" t.datetime "next_run_at"
end end
......
...@@ -4,13 +4,13 @@ module Gitlab ...@@ -4,13 +4,13 @@ module Gitlab
VALID_SYNTAX_SAMPLE_TIME_ZONE = 'UTC'.freeze VALID_SYNTAX_SAMPLE_TIME_ZONE = 'UTC'.freeze
VALID_SYNTAX_SAMPLE_CRON = '* * * * *'.freeze VALID_SYNTAX_SAMPLE_CRON = '* * * * *'.freeze
def initialize(cron, cron_time_zone = 'UTC') def initialize(cron, cron_timezone = 'UTC')
@cron = cron @cron = cron
@cron_time_zone = cron_time_zone @cron_timezone = cron_timezone
end end
def next_time_from(time) def next_time_from(time)
cron_line = try_parse_cron(@cron, @cron_time_zone) cron_line = try_parse_cron(@cron, @cron_timezone)
cron_line.next_time(time).in_time_zone(Time.zone) if cron_line.present? cron_line.next_time(time).in_time_zone(Time.zone) if cron_line.present?
end end
...@@ -18,14 +18,14 @@ module Gitlab ...@@ -18,14 +18,14 @@ module Gitlab
try_parse_cron(@cron, VALID_SYNTAX_SAMPLE_TIME_ZONE).present? try_parse_cron(@cron, VALID_SYNTAX_SAMPLE_TIME_ZONE).present?
end end
def cron_time_zone_valid? def cron_timezone_valid?
try_parse_cron(VALID_SYNTAX_SAMPLE_CRON, @cron_time_zone).present? try_parse_cron(VALID_SYNTAX_SAMPLE_CRON, @cron_timezone).present?
end end
private private
def try_parse_cron(cron, cron_time_zone) def try_parse_cron(cron, cron_timezone)
Rufus::Scheduler.parse("#{cron} #{cron_time_zone}") Rufus::Scheduler.parse("#{cron} #{cron_timezone}")
rescue rescue
# noop # noop
end end
......
...@@ -2,7 +2,7 @@ FactoryGirl.define do ...@@ -2,7 +2,7 @@ FactoryGirl.define do
factory :ci_trigger_schedule, class: Ci::TriggerSchedule do factory :ci_trigger_schedule, class: Ci::TriggerSchedule do
trigger factory: :ci_trigger_for_trigger_schedule trigger factory: :ci_trigger_for_trigger_schedule
cron '0 1 * * *' cron '0 1 * * *'
cron_time_zone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE cron_timezone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE
after(:build) do |trigger_schedule, evaluator| after(:build) do |trigger_schedule, evaluator|
trigger_schedule.update!(project: trigger_schedule.trigger.project) trigger_schedule.update!(project: trigger_schedule.trigger.project)
...@@ -16,17 +16,17 @@ FactoryGirl.define do ...@@ -16,17 +16,17 @@ FactoryGirl.define do
trait :nightly do trait :nightly do
cron '0 1 * * *' cron '0 1 * * *'
cron_time_zone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE cron_timezone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE
end end
trait :weekly do trait :weekly do
cron '0 1 * * 6' cron '0 1 * * 6'
cron_time_zone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE cron_timezone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE
end end
trait :monthly do trait :monthly do
cron '0 1 22 * *' cron '0 1 22 * *'
cron_time_zone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE cron_timezone Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_TIME_ZONE
end end
end end
end end
...@@ -6,12 +6,12 @@ describe Gitlab::Ci::CronParser do ...@@ -6,12 +6,12 @@ describe Gitlab::Ci::CronParser do
end end
describe '#next_time_from' do describe '#next_time_from' do
subject { described_class.new(cron, cron_time_zone).next_time_from(Time.now) } subject { described_class.new(cron, cron_timezone).next_time_from(Time.now) }
context 'when cron and cron_time_zone are valid' do context 'when cron and cron_timezone are valid' do
context 'when specific time' do context 'when specific time' do
let(:cron) { '3 4 5 6 *' } let(:cron) { '3 4 5 6 *' }
let(:cron_time_zone) { 'UTC' } let(:cron_timezone) { 'UTC' }
it_behaves_like "returns time in the future" it_behaves_like "returns time in the future"
...@@ -25,7 +25,7 @@ describe Gitlab::Ci::CronParser do ...@@ -25,7 +25,7 @@ describe Gitlab::Ci::CronParser do
context 'when specific day of week' do context 'when specific day of week' do
let(:cron) { '* * * * 0' } let(:cron) { '* * * * 0' }
let(:cron_time_zone) { 'UTC' } let(:cron_timezone) { 'UTC' }
it_behaves_like "returns time in the future" it_behaves_like "returns time in the future"
...@@ -36,7 +36,7 @@ describe Gitlab::Ci::CronParser do ...@@ -36,7 +36,7 @@ describe Gitlab::Ci::CronParser do
context 'when slash used' do context 'when slash used' do
let(:cron) { '*/10 */6 */10 */10 *' } let(:cron) { '*/10 */6 */10 */10 *' }
let(:cron_time_zone) { 'UTC' } let(:cron_timezone) { 'UTC' }
it_behaves_like "returns time in the future" it_behaves_like "returns time in the future"
...@@ -50,7 +50,7 @@ describe Gitlab::Ci::CronParser do ...@@ -50,7 +50,7 @@ describe Gitlab::Ci::CronParser do
context 'when range used' do context 'when range used' do
let(:cron) { '0,20,40 * 1-5 * *' } let(:cron) { '0,20,40 * 1-5 * *' }
let(:cron_time_zone) { 'UTC' } let(:cron_timezone) { 'UTC' }
it_behaves_like "returns time in the future" it_behaves_like "returns time in the future"
...@@ -60,9 +60,9 @@ describe Gitlab::Ci::CronParser do ...@@ -60,9 +60,9 @@ describe Gitlab::Ci::CronParser do
end end
end end
context 'when cron_time_zone is US/Pacific' do context 'when cron_timezone is US/Pacific' do
let(:cron) { '0 0 * * *' } let(:cron) { '0 0 * * *' }
let(:cron_time_zone) { 'US/Pacific' } let(:cron_timezone) { 'US/Pacific' }
it_behaves_like "returns time in the future" it_behaves_like "returns time in the future"
...@@ -72,9 +72,9 @@ describe Gitlab::Ci::CronParser do ...@@ -72,9 +72,9 @@ describe Gitlab::Ci::CronParser do
end end
end end
context 'when cron and cron_time_zone are invalid' do context 'when cron and cron_timezone are invalid' do
let(:cron) { 'invalid_cron' } let(:cron) { 'invalid_cron' }
let(:cron_time_zone) { 'invalid_cron_time_zone' } let(:cron_timezone) { 'invalid_cron_timezone' }
it 'returns nil' do it 'returns nil' do
is_expected.to be_nil is_expected.to be_nil
...@@ -98,17 +98,17 @@ describe Gitlab::Ci::CronParser do ...@@ -98,17 +98,17 @@ describe Gitlab::Ci::CronParser do
end end
end end
describe '#cron_time_zone_valid?' do describe '#cron_timezone_valid?' do
subject { described_class.new(Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_CRON, cron_time_zone).cron_time_zone_valid? } subject { described_class.new(Gitlab::Ci::CronParser::VALID_SYNTAX_SAMPLE_CRON, cron_timezone).cron_timezone_valid? }
context 'when cron is valid' do context 'when cron is valid' do
let(:cron_time_zone) { 'Europe/Istanbul' } let(:cron_timezone) { 'Europe/Istanbul' }
it { is_expected.to eq(true) } it { is_expected.to eq(true) }
end end
context 'when cron is invalid' do context 'when cron is invalid' do
let(:cron_time_zone) { 'Invalid-zone' } let(:cron_timezone) { 'Invalid-zone' }
it { is_expected.to eq(false) } it { is_expected.to eq(false) }
end end
......
...@@ -249,7 +249,7 @@ Ci::TriggerSchedule: ...@@ -249,7 +249,7 @@ Ci::TriggerSchedule:
- created_at - created_at
- updated_at - updated_at
- cron - cron
- cron_time_zone - cron_timezone
- next_run_at - next_run_at
DeployKey: DeployKey:
- id - id
......
...@@ -13,7 +13,7 @@ describe Ci::TriggerSchedule, models: true do ...@@ -13,7 +13,7 @@ describe Ci::TriggerSchedule, models: true do
end end
it 'updates next_run_at' do it 'updates next_run_at' do
next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now)
expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time)
end end
end end
......
...@@ -23,7 +23,7 @@ describe TriggerScheduleWorker do ...@@ -23,7 +23,7 @@ describe TriggerScheduleWorker do
end end
it 'updates next_run_at' do it 'updates next_run_at' do
next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now)
expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time)
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment