Commit fe39b46f authored by Pedro Pombeiro's avatar Pedro Pombeiro Committed by Kushal Pandya

GraphQL: Add NEVER_CONTACTED runner status

parent 6c8c11ed
...@@ -9,6 +9,7 @@ import { ...@@ -9,6 +9,7 @@ import {
I18N_STALE_RUNNER_DESCRIPTION, I18N_STALE_RUNNER_DESCRIPTION,
STATUS_ONLINE, STATUS_ONLINE,
STATUS_NOT_CONNECTED, STATUS_NOT_CONNECTED,
STATUS_NEVER_CONTACTED,
STATUS_OFFLINE, STATUS_OFFLINE,
STATUS_STALE, STATUS_STALE,
} from '../constants'; } from '../constants';
...@@ -45,6 +46,7 @@ export default { ...@@ -45,6 +46,7 @@ export default {
}), }),
}; };
case STATUS_NOT_CONNECTED: case STATUS_NOT_CONNECTED:
case STATUS_NEVER_CONTACTED:
return { return {
variant: 'muted', variant: 'muted',
label: s__('Runners|not connected'), label: s__('Runners|not connected'),
......
...@@ -61,6 +61,7 @@ export const STATUS_PAUSED = 'PAUSED'; ...@@ -61,6 +61,7 @@ export const STATUS_PAUSED = 'PAUSED';
export const STATUS_ONLINE = 'ONLINE'; export const STATUS_ONLINE = 'ONLINE';
export const STATUS_NOT_CONNECTED = 'NOT_CONNECTED'; export const STATUS_NOT_CONNECTED = 'NOT_CONNECTED';
export const STATUS_NEVER_CONTACTED = 'NEVER_CONTACTED';
export const STATUS_OFFLINE = 'OFFLINE'; export const STATUS_OFFLINE = 'OFFLINE';
export const STATUS_STALE = 'STALE'; export const STATUS_STALE = 'STALE';
......
...@@ -25,13 +25,17 @@ module Types ...@@ -25,13 +25,17 @@ module Types
value: :offline value: :offline
value 'STALE', value 'STALE',
description: "Runner that has not contacted this instance within the last #{::Ci::Runner::STALE_TIMEOUT.inspect}. Only available if legacyMode is null. Will be a possible return value starting in 15.0", description: "Runner that has not contacted this instance within the last #{::Ci::Runner::STALE_TIMEOUT.inspect}. Only available if legacyMode is null. Will be a possible return value starting in 15.0.",
value: :stale value: :stale
value 'NOT_CONNECTED', value 'NOT_CONNECTED',
description: 'Runner that has never contacted this instance.', description: 'Runner that has never contacted this instance.',
deprecated: { reason: 'This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period of no contact', milestone: '14.6' }, deprecated: { reason: "Use NEVER_CONTACTED instead. NEVER_CONTACTED will have a slightly different scope starting in 15.0, with STALE being returned instead after #{::Ci::Runner::STALE_TIMEOUT.inspect} of no contact", milestone: '14.6' },
value: :not_connected value: :not_connected
value 'NEVER_CONTACTED',
description: 'Runner that has never contacted this instance. Set legacyMode to null to utilize this value. Will replace NOT_CONNECTED starting in 15.0.',
value: :never_contacted
end end
end end
end end
...@@ -23,7 +23,7 @@ module Ci ...@@ -23,7 +23,7 @@ module Ci
icon = 'status-paused' icon = 'status-paused'
span_class = 'gl-text-gray-600' span_class = 'gl-text-gray-600'
end end
when :not_connected when :not_connected, :never_contacted
title = s_("Runners|New runner, has not connected yet") title = s_("Runners|New runner, has not connected yet")
icon = 'warning-solid' icon = 'warning-solid'
when :offline when :offline
......
...@@ -44,7 +44,7 @@ module Ci ...@@ -44,7 +44,7 @@ module Ci
AVAILABLE_TYPES_LEGACY = %w[specific shared].freeze AVAILABLE_TYPES_LEGACY = %w[specific shared].freeze
AVAILABLE_TYPES = runner_types.keys.freeze AVAILABLE_TYPES = runner_types.keys.freeze
AVAILABLE_STATUSES = %w[active paused online offline not_connected stale].freeze AVAILABLE_STATUSES = %w[active paused online offline not_connected never_contacted stale].freeze # TODO: Remove in %15.0: active, paused, not_connected. Relevant issues: https://gitlab.com/gitlab-org/gitlab/-/issues/347303, https://gitlab.com/gitlab-org/gitlab/-/issues/347305, https://gitlab.com/gitlab-org/gitlab/-/issues/344648
AVAILABLE_SCOPES = (AVAILABLE_TYPES_LEGACY + AVAILABLE_TYPES + AVAILABLE_STATUSES).freeze AVAILABLE_SCOPES = (AVAILABLE_TYPES_LEGACY + AVAILABLE_TYPES + AVAILABLE_STATUSES).freeze
FORM_EDITABLE = %i[description tag_list active run_untagged locked access_level maximum_timeout_human_readable].freeze FORM_EDITABLE = %i[description tag_list active run_untagged locked access_level maximum_timeout_human_readable].freeze
...@@ -66,7 +66,8 @@ module Ci ...@@ -66,7 +66,8 @@ module Ci
scope :recent, -> { where('ci_runners.created_at >= :date OR ci_runners.contacted_at >= :date', date: stale_deadline) } scope :recent, -> { where('ci_runners.created_at >= :date OR ci_runners.contacted_at >= :date', date: stale_deadline) }
scope :stale, -> { where('ci_runners.created_at < :date AND (ci_runners.contacted_at IS NULL OR ci_runners.contacted_at < :date)', date: stale_deadline) } scope :stale, -> { where('ci_runners.created_at < :date AND (ci_runners.contacted_at IS NULL OR ci_runners.contacted_at < :date)', date: stale_deadline) }
scope :offline, -> { where(arel_table[:contacted_at].lteq(online_contact_time_deadline)) } scope :offline, -> { where(arel_table[:contacted_at].lteq(online_contact_time_deadline)) }
scope :not_connected, -> { where(contacted_at: nil) } scope :not_connected, -> { where(contacted_at: nil) } # TODO: Remove in 15.0
scope :never_contacted, -> { where(contacted_at: nil) }
scope :ordered, -> { order(id: :desc) } scope :ordered, -> { order(id: :desc) }
scope :with_recent_runner_queue, -> { where('contacted_at > ?', recent_queue_deadline) } scope :with_recent_runner_queue, -> { where('contacted_at > ?', recent_queue_deadline) }
...@@ -284,7 +285,7 @@ module Ci ...@@ -284,7 +285,7 @@ module Ci
return deprecated_rest_status if legacy_mode == '14.5' return deprecated_rest_status if legacy_mode == '14.5'
return :stale if stale? return :stale if stale?
return :not_connected unless contacted_at return :never_contacted unless contacted_at
online? ? :online : :offline online? ? :online : :offline
end end
......
- name: "Deprecation of Runner status `not_connected` API value"
announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
body: | # Do not modify this line, instead modify the lines below.
The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
will return `never_contacted` instead of `not_connected` as the status values in 15.0.
Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
stage: Verify
tiers: [Core, Premium, Ultimate]
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347305
documentation_url: https://docs.gitlab.com/ee/api/runners.html
announcement_date: "2021-12-22"
...@@ -15975,7 +15975,8 @@ Values for sorting runners. ...@@ -15975,7 +15975,8 @@ Values for sorting runners.
| Value | Description | | Value | Description |
| ----- | ----------- | | ----- | ----------- |
| <a id="cirunnerstatusactive"></a>`ACTIVE` **{warning-solid}** | **Deprecated** in 14.6. Use CiRunnerType.active instead. | | <a id="cirunnerstatusactive"></a>`ACTIVE` **{warning-solid}** | **Deprecated** in 14.6. Use CiRunnerType.active instead. |
| <a id="cirunnerstatusnot_connected"></a>`NOT_CONNECTED` **{warning-solid}** | **Deprecated** in 14.6. This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period of no contact. | | <a id="cirunnerstatusnever_contacted"></a>`NEVER_CONTACTED` | Runner that has never contacted this instance. Set legacyMode to null to utilize this value. Will replace NOT_CONNECTED starting in 15.0. |
| <a id="cirunnerstatusnot_connected"></a>`NOT_CONNECTED` **{warning-solid}** | **Deprecated** in 14.6. Use NEVER_CONTACTED instead. NEVER_CONTACTED will have a slightly different scope starting in 15.0, with STALE being returned instead after 3 months of no contact. |
| <a id="cirunnerstatusoffline"></a>`OFFLINE` **{warning-solid}** | **Deprecated** in 14.6. This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period offline. | | <a id="cirunnerstatusoffline"></a>`OFFLINE` **{warning-solid}** | **Deprecated** in 14.6. This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period offline. |
| <a id="cirunnerstatusonline"></a>`ONLINE` | Runner that contacted this instance within the last 2 hours. | | <a id="cirunnerstatusonline"></a>`ONLINE` | Runner that contacted this instance within the last 2 hours. |
| <a id="cirunnerstatuspaused"></a>`PAUSED` **{warning-solid}** | **Deprecated** in 14.6. Use CiRunnerType.active instead. | | <a id="cirunnerstatuspaused"></a>`PAUSED` **{warning-solid}** | **Deprecated** in 14.6. Use CiRunnerType.active instead. |
...@@ -124,6 +124,15 @@ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 ...@@ -124,6 +124,15 @@ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12
Announced: 2021-11-22 Announced: 2021-11-22
### Deprecation of Runner status `not_connected` API value
The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
will return `never_contacted` instead of `not_connected` as the status values in 15.0.
Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
Announced: 2021-12-22
### Deprecation of bundler-audit Dependency Scanning tool ### Deprecation of bundler-audit Dependency Scanning tool
As of 14.6 bundler-audit is being deprecated from Dependency Scanning. It will continue to be in our CI/CD template while deprecated. We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal Ruby scanning functionality will not be affected as it is still being covered by Gemnasium. As of 14.6 bundler-audit is being deprecated from Dependency Scanning. It will continue to be in our CI/CD template while deprecated. We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal Ruby scanning functionality will not be affected as it is still being covered by Gemnasium.
......
...@@ -7,6 +7,7 @@ import { ...@@ -7,6 +7,7 @@ import {
STATUS_OFFLINE, STATUS_OFFLINE,
STATUS_STALE, STATUS_STALE,
STATUS_NOT_CONNECTED, STATUS_NOT_CONNECTED,
STATUS_NEVER_CONTACTED,
} from '~/runner/constants'; } from '~/runner/constants';
describe('RunnerTypeBadge', () => { describe('RunnerTypeBadge', () => {
...@@ -62,6 +63,19 @@ describe('RunnerTypeBadge', () => { ...@@ -62,6 +63,19 @@ describe('RunnerTypeBadge', () => {
expect(getTooltip().value).toMatch('This runner has never connected'); expect(getTooltip().value).toMatch('This runner has never connected');
}); });
it('renders never contacted state as not connected, for backwards compatibility', () => {
createComponent({
runner: {
contactedAt: null,
status: STATUS_NEVER_CONTACTED,
},
});
expect(wrapper.text()).toBe('not connected');
expect(findBadge().props('variant')).toBe('muted');
expect(getTooltip().value).toMatch('This runner has never connected');
});
it('renders offline state', () => { it('renders offline state', () => {
createComponent({ createComponent({
runner: { runner: {
......
...@@ -753,7 +753,7 @@ RSpec.describe Ci::Runner do ...@@ -753,7 +753,7 @@ RSpec.describe Ci::Runner do
runner.created_at = 1.day.ago runner.created_at = 1.day.ago
end end
it { is_expected.to eq(:not_connected) } it { is_expected.to eq(:never_contacted) }
end end
end end
......
...@@ -223,20 +223,22 @@ RSpec.describe 'Query.runner(id)' do ...@@ -223,20 +223,22 @@ RSpec.describe 'Query.runner(id)' do
describe 'for runner with status' do describe 'for runner with status' do
let_it_be(:stale_runner) { create(:ci_runner, description: 'Stale runner 1', created_at: 3.months.ago) } let_it_be(:stale_runner) { create(:ci_runner, description: 'Stale runner 1', created_at: 3.months.ago) }
let_it_be(:never_contacted_instance_runner) { create(:ci_runner, description: 'Missing runner 1', created_at: 1.month.ago, contacted_at: nil) }
let(:status_fragment) do
%(
status
legacyStatusWithExplicitVersion: status(legacyMode: "14.5")
newStatus: status(legacyMode: null)
)
end
let(:query) do let(:query) do
%( %(
query { query {
staleRunner: runner(id: "#{stale_runner.to_global_id}") { staleRunner: runner(id: "#{stale_runner.to_global_id}") { #{status_fragment} }
status pausedRunner: runner(id: "#{inactive_instance_runner.to_global_id}") { #{status_fragment} }
legacyStatusWithExplicitVersion: status(legacyMode: "14.5") neverContactedInstanceRunner: runner(id: "#{never_contacted_instance_runner.to_global_id}") { #{status_fragment} }
newStatus: status(legacyMode: null)
}
pausedRunner: runner(id: "#{inactive_instance_runner.to_global_id}") {
status
legacyStatusWithExplicitVersion: status(legacyMode: "14.5")
newStatus: status(legacyMode: null)
}
} }
) )
end end
...@@ -257,6 +259,13 @@ RSpec.describe 'Query.runner(id)' do ...@@ -257,6 +259,13 @@ RSpec.describe 'Query.runner(id)' do
'legacyStatusWithExplicitVersion' => 'PAUSED', 'legacyStatusWithExplicitVersion' => 'PAUSED',
'newStatus' => 'OFFLINE' 'newStatus' => 'OFFLINE'
) )
never_contacted_instance_runner_data = graphql_data_at(:never_contacted_instance_runner)
expect(never_contacted_instance_runner_data).to match a_hash_including(
'status' => 'NOT_CONNECTED',
'legacyStatusWithExplicitVersion' => 'NOT_CONNECTED',
'newStatus' => 'NEVER_CONTACTED'
)
end end
end end
......
...@@ -62,6 +62,15 @@ RSpec.describe 'Query.runners' do ...@@ -62,6 +62,15 @@ RSpec.describe 'Query.runners' do
it_behaves_like 'a working graphql query returning expected runner' it_behaves_like 'a working graphql query returning expected runner'
end end
context 'runner_type is PROJECT_TYPE and status is NEVER_CONTACTED' do
let(:runner_type) { 'PROJECT_TYPE' }
let(:status) { 'NEVER_CONTACTED' }
let!(:expected_runner) { project_runner }
it_behaves_like 'a working graphql query returning expected runner'
end
end end
describe 'pagination' do describe 'pagination' do
......
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