Commit cea7765c authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 4eb8816d 4ecc55da
// This file only applies to use of experiments through https://gitlab.com/gitlab-org/gitlab-experiment
import { get } from 'lodash';
import { get, pick } from 'lodash';
import { DEFAULT_VARIANT, CANDIDATE_VARIANT, TRACKING_CONTEXT_SCHEMA } from './constants';
function getExperimentsData() {
return get(window, ['gon', 'experiment'], {});
}
function convertExperimentDataToExperimentContext(experimentData) {
return { schema: TRACKING_CONTEXT_SCHEMA, data: experimentData };
}
export function getExperimentData(experimentName) {
return get(window, ['gon', 'experiment', experimentName]);
return getExperimentsData()[experimentName];
}
export function getExperimentContexts(...experimentNames) {
return experimentNames
.map((name) => {
const data = getExperimentData(name);
return data && { schema: TRACKING_CONTEXT_SCHEMA, data };
})
.filter((context) => context);
return Object.values(pick(getExperimentsData(), experimentNames)).map(
convertExperimentDataToExperimentContext,
);
}
export function getAllExperimentContexts() {
return Object.values(getExperimentsData()).map(convertExperimentDataToExperimentContext);
}
export function isExperimentVariant(experimentName, variantName) {
......
import { getAllExperimentContexts } from '~/experimentation/utils';
import { DEFAULT_SNOWPLOW_OPTIONS } from './constants';
import getStandardContext from './get_standard_context';
import Tracking from './tracking';
......@@ -41,7 +42,8 @@ export function initDefaultTrackers() {
window.snowplow('enableActivityTracking', 30, 30);
// must be after enableActivityTracking
const standardContext = getStandardContext();
window.snowplow('trackPageView', null, [standardContext]);
const experimentContexts = getAllExperimentContexts();
window.snowplow('trackPageView', null, [standardContext, ...experimentContexts]);
if (window.snowplowOptions.formTracking) {
Tracking.enableFormTracking(opts.formTrackingConfig);
......
......@@ -9,6 +9,7 @@ module Types
DEFAULT_COMPLEXITY = 1
attr_reader :deprecation, :doc_reference
attr_writer :max_page_size # Can be removed with :performance_roadmap feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/337198
def initialize(**kwargs, &block)
@calls_gitaly = !!kwargs.delete(:calls_gitaly)
......
......@@ -46,6 +46,7 @@ module Integrations
has_one :issue_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::IssueTrackerData'
has_one :jira_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::JiraTrackerData'
has_one :open_project_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::OpenProjectTrackerData'
has_one :zentao_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :integration_id, class_name: 'Integrations::ZentaoTrackerData'
def data_fields
raise NotImplementedError
......
# frozen_string_literal: true
module Integrations
class Zentao < Integration
data_field :url, :api_url, :api_token, :zentao_product_xid
validates :url, public_url: true, presence: true, if: :activated?
validates :api_url, public_url: true, allow_blank: true
validates :api_token, presence: true, if: :activated?
validates :zentao_product_xid, presence: true, if: :activated?
def data_fields
zentao_tracker_data || self.build_zentao_tracker_data
end
def title
self.class.name.demodulize
end
def description
s_("ZentaoIntegration|Use Zentao as this project's issue tracker.")
end
def self.to_param
name.demodulize.downcase
end
def test(*_args)
client.ping
end
def self.supported_events
%w()
end
def self.supported_event_actions
%w()
end
def fields
[
{
type: 'text',
name: 'url',
title: s_('ZentaoIntegration|Zentao Web URL'),
placeholder: 'https://www.zentao.net',
help: s_('ZentaoIntegration|Base URL of the Zentao instance.'),
required: true
},
{
type: 'text',
name: 'api_url',
title: s_('ZentaoIntegration|Zentao API URL (optional)'),
help: s_('ZentaoIntegration|If different from Web URL.')
},
{
type: 'password',
name: 'api_token',
title: s_('ZentaoIntegration|Zentao API token'),
non_empty_password_title: s_('ZentaoIntegration|Enter API token'),
required: true
},
{
type: 'text',
name: 'zentao_product_xid',
title: s_('ZentaoIntegration|Zentao Product ID'),
required: true
}
]
end
private
def client
@client ||= ::Gitlab::Zentao::Client.new(self)
end
end
end
# frozen_string_literal: true
module Integrations
class ZentaoTrackerData < ApplicationRecord
belongs_to :integration, inverse_of: :zentao_tracker_data, foreign_key: :integration_id
delegate :activated?, to: :integration
validates :integration, presence: true
scope :encryption_options, -> do
{
key: Settings.attr_encrypted_db_key_base_32,
encode: true,
mode: :per_attribute_iv,
algorithm: 'aes-256-gcm'
}
end
attr_encrypted :url, encryption_options
attr_encrypted :api_url, encryption_options
attr_encrypted :zentao_product_xid, encryption_options
attr_encrypted :api_token, encryption_options
end
end
......@@ -209,6 +209,7 @@ class Project < ApplicationRecord
has_one :unify_circuit_integration, class_name: 'Integrations::UnifyCircuit'
has_one :webex_teams_integration, class_name: 'Integrations::WebexTeams'
has_one :youtrack_integration, class_name: 'Integrations::Youtrack'
has_one :zentao_integration, class_name: 'Integrations::Zentao'
has_one :root_of_fork_network,
foreign_key: 'root_project_id',
......@@ -1455,7 +1456,7 @@ class Project < ApplicationRecord
end
def disabled_integrations
[]
[:zentao]
end
def find_or_initialize_integration(name)
......
......@@ -83,8 +83,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: chaos:chaos_db_spin
:worker_name: Chaos::DbSpinWorker
:feature_category: :not_owned
......@@ -93,8 +92,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: chaos:chaos_kill
:worker_name: Chaos::KillWorker
:feature_category: :not_owned
......@@ -103,8 +101,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: chaos:chaos_leak_mem
:worker_name: Chaos::LeakMemWorker
:feature_category: :not_owned
......@@ -113,8 +110,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: chaos:chaos_sleep
:worker_name: Chaos::SleepWorker
:feature_category: :not_owned
......@@ -123,8 +119,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: container_repository:cleanup_container_repository
:worker_name: CleanupContainerRepositoryWorker
:feature_category: :container_registry
......@@ -142,8 +137,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: container_repository:delete_container_repository
:worker_name: DeleteContainerRepositoryWorker
:feature_category: :container_registry
......@@ -170,8 +164,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:authorized_project_update_periodic_recalculate
:worker_name: AuthorizedProjectUpdate::PeriodicRecalculateWorker
:feature_category: :source_code_management
......@@ -207,8 +200,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:ci_platform_metrics_update_cron
:worker_name: CiPlatformMetricsUpdateCronWorker
:feature_category: :continuous_integration
......@@ -226,8 +218,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:container_expiration_policy
:worker_name: ContainerExpirationPolicyWorker
:feature_category: :container_registry
......@@ -245,8 +236,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:database_drop_detached_partitions
:worker_name: Database::DropDetachedPartitionsWorker
:feature_category: :database
......@@ -345,8 +335,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:metrics_dashboard_schedule_annotations_prune
:worker_name: Metrics::Dashboard::ScheduleAnnotationsPruneWorker
:feature_category: :metrics
......@@ -364,8 +353,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:namespaces_prune_aggregation_schedules
:worker_name: Namespaces::PruneAggregationSchedulesWorker
:feature_category: :source_code_management
......@@ -383,8 +371,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:pages_domain_removal_cron
:worker_name: PagesDomainRemovalCronWorker
:feature_category: :pages
......@@ -429,8 +416,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:personal_access_tokens_expiring
:worker_name: PersonalAccessTokens::ExpiringWorker
:feature_category: :authentication_and_authorization
......@@ -466,8 +452,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:remove_expired_group_links
:worker_name: RemoveExpiredGroupLinksWorker
:feature_category: :authentication_and_authorization
......@@ -494,8 +479,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:remove_unreferenced_lfs_objects
:worker_name: RemoveUnreferencedLfsObjectsWorker
:feature_category: :git_lfs
......@@ -540,8 +524,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:schedule_migrate_external_diffs
:worker_name: ScheduleMigrateExternalDiffsWorker
:feature_category: :code_review
......@@ -559,8 +542,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:ssh_keys_expiring_soon_notification
:worker_name: SshKeys::ExpiringSoonNotificationWorker
:feature_category: :compliance_management
......@@ -569,8 +551,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:stuck_ci_jobs
:worker_name: StuckCiJobsWorker
:feature_category: :continuous_integration
......@@ -624,8 +605,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:users_create_statistics
:worker_name: Users::CreateStatisticsWorker
:feature_category: :users
......@@ -643,8 +623,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:x509_issuer_crl_check
:worker_name: X509IssuerCrlCheckWorker
:feature_category: :source_code_management
......@@ -671,8 +650,7 @@
:resource_boundary: :unknown
:weight: 3
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: deployment:deployments_hooks
:worker_name: Deployments::HooksWorker
:feature_category: :continuous_delivery
......@@ -897,8 +875,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: github_importer:github_import_import_pull_request_review
:worker_name: Gitlab::GithubImport::ImportPullRequestReviewWorker
:feature_category: :importers
......@@ -907,8 +884,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: github_importer:github_import_refresh_import_jid
:worker_name: Gitlab::GithubImport::RefreshImportJidWorker
:feature_category: :importers
......@@ -980,8 +956,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: github_importer:github_import_stage_import_pull_requests_reviews
:worker_name: Gitlab::GithubImport::Stage::ImportPullRequestsReviewsWorker
:feature_category: :importers
......@@ -990,8 +965,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: github_importer:github_import_stage_import_repository
:worker_name: Gitlab::GithubImport::Stage::ImportRepositoryWorker
:feature_category: :importers
......@@ -1010,7 +984,6 @@
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
- :needs_own_queue
- :name: hashed_storage:hashed_storage_project_migrate
:worker_name: HashedStorage::ProjectMigrateWorker
......@@ -1021,7 +994,6 @@
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
- :needs_own_queue
- :name: hashed_storage:hashed_storage_project_rollback
:worker_name: HashedStorage::ProjectRollbackWorker
......@@ -1032,7 +1004,6 @@
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
- :needs_own_queue
- :name: hashed_storage:hashed_storage_rollbacker
:worker_name: HashedStorage::RollbackerWorker
......@@ -1043,7 +1014,6 @@
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
- :needs_own_queue
- :name: incident_management:clusters_applications_check_prometheus_health
:worker_name: Clusters::Applications::CheckPrometheusHealthWorker
......@@ -1062,8 +1032,7 @@
:resource_boundary: :cpu
:weight: 2
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: incident_management:incident_management_pager_duty_process_incident
:worker_name: IncidentManagement::PagerDuty::ProcessIncidentWorker
:feature_category: :incident_management
......@@ -1117,8 +1086,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: jira_connect:jira_connect_sync_deployments
:worker_name: JiraConnect::SyncDeploymentsWorker
:feature_category: :integrations
......@@ -1127,8 +1095,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: jira_connect:jira_connect_sync_feature_flags
:worker_name: JiraConnect::SyncFeatureFlagsWorker
:feature_category: :integrations
......@@ -1137,8 +1104,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: jira_connect:jira_connect_sync_merge_request
:worker_name: JiraConnect::SyncMergeRequestWorker
:feature_category: :integrations
......@@ -1156,8 +1122,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: jira_importer:jira_import_advance_stage
:worker_name: Gitlab::JiraImport::AdvanceStageWorker
:feature_category: :importers
......@@ -1319,8 +1284,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: package_repositories:packages_go_sync_packages
:worker_name: Packages::Go::SyncPackagesWorker
:feature_category: :package_registry
......@@ -1329,8 +1293,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: package_repositories:packages_helm_extraction
:worker_name: Packages::Helm::ExtractionWorker
:feature_category: :package_registry
......@@ -1348,8 +1311,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: package_repositories:packages_nuget_extraction
:worker_name: Packages::Nuget::ExtractionWorker
:feature_category: :package_registry
......@@ -1367,8 +1329,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pipeline_background:archive_trace
:worker_name: ArchiveTraceWorker
:feature_category: :continuous_integration
......@@ -1422,8 +1383,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pipeline_background:ci_pipeline_success_unlock_artifacts
:worker_name: Ci::PipelineSuccessUnlockArtifactsWorker
:feature_category: :continuous_integration
......@@ -1450,8 +1410,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pipeline_cache:expire_job_cache
:worker_name: ExpireJobCacheWorker
:feature_category: :continuous_integration
......@@ -1523,8 +1482,7 @@
:resource_boundary: :unknown
:weight: 3
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pipeline_default:ci_merge_requests_add_todo_when_build_fails
:worker_name: Ci::MergeRequests::AddTodoWhenBuildFailsWorker
:feature_category: :continuous_integration
......@@ -1533,8 +1491,7 @@
:resource_boundary: :unknown
:weight: 3
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pipeline_default:ci_pipeline_bridge_status
:worker_name: Ci::PipelineBridgeStatusWorker
:feature_category: :continuous_integration
......@@ -1732,8 +1689,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: todos_destroyer:todos_destroyer_entity_leave
:worker_name: TodosDestroyer::EntityLeaveWorker
:feature_category: :issue_tracking
......@@ -1805,8 +1761,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: approve_blocked_pending_approval_users
:worker_name: ApproveBlockedPendingApprovalUsersWorker
:feature_category: :users
......@@ -1815,8 +1770,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: authorized_keys
:worker_name: AuthorizedKeysWorker
:feature_category: :source_code_management
......@@ -1852,8 +1806,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: bulk_imports_entity
:worker_name: BulkImports::EntityWorker
:feature_category: :importers
......@@ -1862,8 +1815,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: bulk_imports_export_request
:worker_name: BulkImports::ExportRequestWorker
:feature_category: :importers
......@@ -1881,8 +1833,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: bulk_imports_relation_export
:worker_name: BulkImports::RelationExportWorker
:feature_category: :importers
......@@ -1891,8 +1842,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: chat_notification
:worker_name: ChatNotificationWorker
:feature_category: :chatops
......@@ -1910,8 +1860,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: create_commit_signature
:worker_name: CreateCommitSignatureWorker
:feature_category: :source_code_management
......@@ -1983,8 +1932,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: design_management_new_version
:worker_name: DesignManagement::NewVersionWorker
:feature_category: :design_management
......@@ -2002,8 +1950,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: detect_repository_languages
:worker_name: DetectRepositoryLanguagesWorker
:feature_category: :source_code_management
......@@ -2021,8 +1968,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: disallow_two_factor_for_subgroups
:worker_name: DisallowTwoFactorForSubgroupsWorker
:feature_category: :subgroups
......@@ -2031,8 +1977,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: email_receiver
:worker_name: EmailReceiverWorker
:feature_category: :issue_tracking
......@@ -2060,8 +2005,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: error_tracking_issue_link
:worker_name: ErrorTrackingIssueLinkWorker
:feature_category: :error_tracking
......@@ -2079,8 +2023,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: expire_build_instance_artifacts
:worker_name: ExpireBuildInstanceArtifactsWorker
:feature_category: :continuous_integration
......@@ -2125,8 +2068,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: github_import_advance_stage
:worker_name: Gitlab::GithubImport::AdvanceStageWorker
:feature_category: :importers
......@@ -2144,8 +2086,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: gitlab_shell
:worker_name: GitlabShellWorker
:feature_category: :source_code_management
......@@ -2163,9 +2104,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :requires_disk_io
- :exclude_from_kubernetes
:tags: []
- :name: group_export
:worker_name: GroupExportWorker
:feature_category: :importers
......@@ -2255,8 +2194,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: mailers
:worker_name: ActionMailer::MailDeliveryJob
:feature_category: :issue_tracking
......@@ -2283,8 +2221,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: merge_request_mergeability_check
:worker_name: MergeRequestMergeabilityCheckWorker
:feature_category: :code_review
......@@ -2338,8 +2275,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: migrate_external_diffs
:worker_name: MigrateExternalDiffsWorker
:feature_category: :code_review
......@@ -2366,8 +2302,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: namespaces_onboarding_pipeline_created
:worker_name: Namespaces::OnboardingPipelineCreatedWorker
:feature_category: :subgroups
......@@ -2376,8 +2311,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: namespaces_onboarding_progress
:worker_name: Namespaces::OnboardingProgressWorker
:feature_category: :product_analytics
......@@ -2386,8 +2320,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: namespaces_onboarding_user_added
:worker_name: Namespaces::OnboardingUserAddedWorker
:feature_category: :users
......@@ -2396,8 +2329,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: new_issue
:worker_name: NewIssueWorker
:feature_category: :issue_tracking
......@@ -2433,8 +2365,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pages
:worker_name: PagesWorker
:feature_category: :pages
......@@ -2443,9 +2374,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent:
:tags:
- :requires_disk_io
- :exclude_from_kubernetes
:tags: []
- :name: pages_domain_ssl_renewal
:worker_name: PagesDomainSslRenewalWorker
:feature_category: :pages
......@@ -2454,9 +2383,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :requires_disk_io
- :exclude_from_kubernetes
:tags: []
- :name: pages_domain_verification
:worker_name: PagesDomainVerificationWorker
:feature_category: :pages
......@@ -2465,9 +2392,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :requires_disk_io
- :exclude_from_kubernetes
:tags: []
- :name: pages_remove
:worker_name: PagesRemoveWorker
:feature_category: :pages
......@@ -2476,8 +2401,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pages_transfer
:worker_name: PagesTransferWorker
:feature_category: :pages
......@@ -2486,8 +2410,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: pages_update_configuration
:worker_name: PagesUpdateConfigurationWorker
:feature_category: :pages
......@@ -2496,8 +2419,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: phabricator_import_import_tasks
:worker_name: Gitlab::PhabricatorImport::ImportTasksWorker
:feature_category: :importers
......@@ -2551,9 +2473,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :requires_disk_io
- :exclude_from_kubernetes
:tags: []
- :name: project_export
:worker_name: ProjectExportWorker
:feature_category: :importers
......@@ -2580,8 +2500,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: projects_post_creation
:worker_name: Projects::PostCreationWorker
:feature_category: :source_code_management
......@@ -2590,8 +2509,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: projects_schedule_bulk_repository_shard_moves
:worker_name: Projects::ScheduleBulkRepositoryShardMovesWorker
:feature_category: :gitaly
......@@ -2636,8 +2554,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: propagate_integration_inherit
:worker_name: PropagateIntegrationInheritWorker
:feature_category: :integrations
......@@ -2646,8 +2563,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: propagate_integration_inherit_descendant
:worker_name: PropagateIntegrationInheritDescendantWorker
:feature_category: :integrations
......@@ -2656,8 +2572,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: propagate_integration_project
:worker_name: PropagateIntegrationProjectWorker
:feature_category: :integrations
......@@ -2666,8 +2581,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: propagate_service_template
:worker_name: PropagateServiceTemplateWorker
:feature_category: :integrations
......@@ -2703,8 +2617,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: remote_mirror_notification
:worker_name: RemoteMirrorNotificationWorker
:feature_category: :source_code_management
......@@ -2876,8 +2789,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: web_hooks_log_execution
:worker_name: WebHooks::LogExecutionWorker
:feature_category: :integrations
......@@ -2895,8 +2807,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: x509_certificate_revoke
:worker_name: X509CertificateRevokeWorker
:feature_category: :source_code_management
......
......@@ -13,7 +13,6 @@ module Analytics
DEFAULT_DELAY = 3.minutes.freeze
feature_category :devops_reports
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -12,7 +12,6 @@ module Analytics
feature_category :devops_reports
urgency :low
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,7 +10,6 @@ class ApproveBlockedPendingApprovalUsersWorker
idempotent!
feature_category :users
tags :exclude_from_kubernetes
def perform(current_user_id)
current_user = User.find(current_user_id)
......
......@@ -6,7 +6,6 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
data_consistency :always
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -7,7 +7,6 @@ module BulkImports
data_consistency :always
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -9,7 +9,6 @@ module BulkImports
NDJSON_PIPELINE_PERFORM_DELAY = 1.minute
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options retry: false, dead: false
......
......@@ -10,7 +10,6 @@ module BulkImports
idempotent!
loggable_arguments 2, 3
feature_category :importers
tags :exclude_from_kubernetes
sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION
def perform(user_id, portable_id, portable_class, relation)
......
......@@ -10,7 +10,6 @@ module Ci
include LimitedCapacity::Worker
feature_category :continuous_integration
tags :exclude_from_kubernetes
idempotent!
def perform_work(*args)
......
......@@ -9,8 +9,6 @@ module Ci
sidekiq_options retry: 3
include PipelineQueue
tags :exclude_from_kubernetes
idempotent!
def perform(pipeline_id, failure_reason)
......
......@@ -10,7 +10,6 @@ module Ci
include PipelineQueue
urgency :low
tags :exclude_from_kubernetes
idempotent!
def perform(job_id)
......
......@@ -11,7 +11,6 @@ module Ci
queue_namespace :pipeline_background
feature_category :code_testing
tags :exclude_from_kubernetes
idempotent!
......
......@@ -15,7 +15,6 @@ module Ci
deduplicate :until_executed, including_scheduled: true
idempotent!
feature_category :continuous_integration
tags :exclude_from_kubernetes
def perform
service = ::Ci::PipelineArtifacts::DestroyAllExpiredService.new
......
......@@ -12,7 +12,6 @@ module Ci
# rubocop:enable Scalability/CronWorkerContext
feature_category :continuous_integration
tags :exclude_from_kubernetes
idempotent!
def perform(*args)
......
......@@ -9,8 +9,6 @@ module Ci
sidekiq_options retry: 3
include PipelineBackgroundQueue
tags :exclude_from_kubernetes
idempotent!
def perform(pipeline_id)
......
......@@ -6,6 +6,5 @@ module ChaosQueue
included do
queue_namespace :chaos
feature_category_not_owned!
tags :exclude_from_gitlab_com
end
end
......@@ -12,7 +12,6 @@ module ContainerExpirationPolicies
queue_namespace :container_repository
feature_category :container_registry
tags :exclude_from_kubernetes
urgency :low
worker_resource_boundary :unknown
idempotent!
......
......@@ -9,7 +9,6 @@ module Database
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :database
tags :exclude_from_kubernetes
idempotent!
LEASE_TIMEOUT_MULTIPLIER = 3
......
......@@ -10,7 +10,6 @@ module Deployments
queue_namespace :deployment
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(deployment_id)
Deployments::OlderDeploymentsDropService.new(deployment_id).execute
......
......@@ -9,7 +9,6 @@ module DesignManagement
sidekiq_options retry: 3
feature_category :design_management
tags :exclude_from_kubernetes
idempotent!
urgency :low
......
......@@ -10,7 +10,6 @@ class DestroyPagesDeploymentsWorker
loggable_arguments 0, 1
sidekiq_options retry: 3
feature_category :pages
tags :exclude_from_kubernetes
def perform(project_id, last_deployment_id = nil)
project = Project.find_by_id(project_id)
......
......@@ -9,7 +9,6 @@ class DisallowTwoFactorForGroupWorker
include ExceptionBacktrace
feature_category :subgroups
tags :exclude_from_kubernetes
idempotent!
def perform(group_id)
......
......@@ -11,7 +11,6 @@ class DisallowTwoFactorForSubgroupsWorker
INTERVAL = 2.seconds.to_i
feature_category :subgroups
tags :exclude_from_kubernetes
idempotent!
def perform(group_id)
......
......@@ -11,7 +11,6 @@ module Environments
idempotent!
worker_has_external_dependencies!
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(environment_id, params)
Environment.find_by_id(environment_id).try do |environment|
......
......@@ -9,7 +9,6 @@ module Experiments
sidekiq_options retry: 3
feature_category :users
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -13,7 +13,6 @@ class FlushCounterIncrementsWorker
sidekiq_options retry: 3
feature_category_not_owned!
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing, including_scheduled: true
......
......@@ -5,7 +5,6 @@ module Gitlab
class ImportPullRequestMergedByWorker # rubocop:disable Scalability/IdempotentWorker
include ObjectImporter
tags :exclude_from_kubernetes
worker_resource_boundary :cpu
def representation_class
......
......@@ -5,7 +5,6 @@ module Gitlab
class ImportPullRequestReviewWorker # rubocop:disable Scalability/IdempotentWorker
include ObjectImporter
tags :exclude_from_kubernetes
worker_resource_boundary :cpu
def representation_class
......
......@@ -12,8 +12,6 @@ module Gitlab
include GithubImport::Queue
include StageMethods
tags :exclude_from_kubernetes
# client - An instance of Gitlab::GithubImport::Client.
# project - An instance of Project.
def import(client, project)
......
......@@ -12,8 +12,6 @@ module Gitlab
include GithubImport::Queue
include StageMethods
tags :exclude_from_kubernetes
# client - An instance of Gitlab::GithubImport::Client.
# project - An instance of Project.
def import(client, project)
......
......@@ -15,7 +15,6 @@ class GitlabPerformanceBarStatsWorker
STATS_KEY_EXPIRE = 30.minutes.to_i
feature_category :metrics
tags :exclude_from_kubernetes
idempotent!
def perform(lease_uuid)
......
......@@ -9,7 +9,6 @@ class GroupDestroyWorker # rubocop:disable Scalability/IdempotentWorker
include ExceptionBacktrace
feature_category :subgroups
tags :requires_disk_io, :exclude_from_kubernetes
def perform(group_id, user_id)
begin
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#migration_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
# @param [Integer] start initial ID of the batch
# @param [Integer] finish last ID of the batch
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#migration_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
attr_reader :project_id
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#rollback_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
attr_reader :project_id
......
......@@ -13,7 +13,7 @@ module HashedStorage
# Gitlab::HashedStorage::Migrator#rollback_pending? depends on the
# queue size of this worker.
tags :exclude_from_gitlab_com, :needs_own_queue
tags :needs_own_queue
# @param [Integer] start initial ID of the batch
# @param [Integer] finish last ID of the batch
......
......@@ -11,7 +11,6 @@ module IncidentManagement
queue_namespace :incident_management
feature_category :incident_management
tags :exclude_from_kubernetes
def perform(incident_id, user_id)
return if incident_id.blank? || user_id.blank?
......
......@@ -10,7 +10,6 @@ class IssueRebalancingWorker
idempotent!
urgency :low
feature_category :issue_tracking
tags :exclude_from_kubernetes
deduplicate :until_executed, including_scheduled: true
def perform(ignore = nil, project_id = nil, root_namespace_id = nil)
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ module JiraConnect
queue_namespace :jira_connect
feature_category :integrations
data_consistency :delayed
tags :exclude_from_kubernetes
urgency :low
worker_has_external_dependencies!
......
......@@ -8,7 +8,6 @@ class MemberInvitationReminderEmailsWorker # rubocop:disable Scalability/Idempot
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
def perform
......
......@@ -10,7 +10,6 @@ class MergeRequestCleanupRefsWorker
sidekiq_options retry: 3
feature_category :code_review
tags :exclude_from_kubernetes
idempotent!
# Hard-coded to 4 for now. Will be configurable later on via application settings.
......
......@@ -10,7 +10,6 @@ module Metrics
sidekiq_options retry: 3
feature_category :metrics
tags :exclude_from_kubernetes
idempotent!
......
......@@ -9,7 +9,6 @@ module Namespaces
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
def perform
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :issue_tracking
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :subgroups
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executing
......
......@@ -10,7 +10,6 @@ module Namespaces
feature_category :product_analytics
worker_resource_boundary :cpu
tags :exclude_from_kubernetes
urgency :low
deduplicate :until_executed
......
......@@ -9,7 +9,6 @@ module Namespaces
sidekiq_options retry: 3
feature_category :users
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -10,7 +10,6 @@ module Packages
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :package_registry
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,7 +10,6 @@ module Packages
sidekiq_options retry: 3
feature_category :package_registry
tags :exclude_from_kubernetes
idempotent!
......
......@@ -13,7 +13,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
def perform(package_file_id, user_id)
@package_file_id = package_file_id
......
......@@ -12,7 +12,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
idempotent!
......
......@@ -13,7 +13,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
idempotent!
......
......@@ -11,7 +11,6 @@ module Packages
queue_namespace :package_repositories
feature_category :package_registry
tags :exclude_from_kubernetes
deduplicate :until_executing
def perform(package_file_id)
......
......@@ -8,7 +8,6 @@ class PagesDomainSslRenewalWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
tags :requires_disk_io, :exclude_from_kubernetes
def perform(domain_id)
domain = PagesDomain.find_by_id(domain_id)
......
......@@ -8,7 +8,6 @@ class PagesDomainVerificationWorker # rubocop:disable Scalability/IdempotentWork
sidekiq_options retry: 3
feature_category :pages
tags :requires_disk_io, :exclude_from_kubernetes
# rubocop: disable CodeReuse/ActiveRecord
def perform(domain_id)
......
......@@ -8,7 +8,6 @@ class PagesRemoveWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
tags :exclude_from_kubernetes
loggable_arguments 0
def perform(project_id)
......
......@@ -10,7 +10,6 @@ class PagesTransferWorker # rubocop:disable Scalability/IdempotentWorker
TransferFailedError = Class.new(StandardError)
feature_category :pages
tags :exclude_from_kubernetes
loggable_arguments 0, 1
def perform(method, args)
......
......@@ -9,7 +9,6 @@ class PagesUpdateConfigurationWorker
idempotent!
feature_category :pages
tags :exclude_from_kubernetes
def self.perform_async(*args)
return unless ::Settings.pages.local_store.enabled
......
......@@ -8,7 +8,6 @@ class PagesWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
feature_category :pages
loggable_arguments 0, 1
tags :requires_disk_io, :exclude_from_kubernetes
worker_resource_boundary :cpu
def perform(action, *arg)
......
......@@ -9,7 +9,6 @@ module PersonalAccessTokens
include CronjobQueue
feature_category :authentication_and_authorization
tags :exclude_from_kubernetes
def perform(*args)
notification_service = NotificationService.new
......
......@@ -9,7 +9,6 @@ class ProjectDestroyWorker # rubocop:disable Scalability/IdempotentWorker
include ExceptionBacktrace
feature_category :source_code_management
tags :requires_disk_io, :exclude_from_kubernetes
def perform(project_id, user_id, params)
project = Project.find(project_id)
......
......@@ -5,8 +5,6 @@ module Projects
extend ::Gitlab::Utils::Override
include GitGarbageCollectMethods
tags :exclude_from_kubernetes
private
override :find_resource
......
......@@ -9,7 +9,6 @@ module Projects
sidekiq_options retry: 3
feature_category :source_code_management
tags :exclude_from_kubernetes
idempotent!
def perform(project_id)
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationGroupWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationInheritDescendantWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationInheritWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -6,7 +6,6 @@ class PropagateIntegrationProjectWorker
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -9,7 +9,6 @@ module Releases
sidekiq_options retry: 3
feature_category :release_evidence
tags :exclude_from_kubernetes
# pipeline_id is optional for backward compatibility with existing jobs
# caller should always try to provide the pipeline and pass nil only
......
......@@ -9,7 +9,6 @@ module Releases
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :release_evidence
tags :exclude_from_kubernetes
def perform
releases = Release.without_evidence.released_within_2hrs
......
......@@ -8,7 +8,6 @@ class RemoveUnacceptedMemberInvitesWorker # rubocop:disable Scalability/Idempote
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :authentication_and_authorization
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -8,7 +8,6 @@ class ScheduleMergeRequestCleanupRefsWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :code_review
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -9,7 +9,6 @@ module SshKeys
include CronjobQueue
feature_category :compliance_management
tags :exclude_from_kubernetes
idempotent!
BATCH_SIZE = 500
......
......@@ -9,7 +9,6 @@ module SshKeys
include CronjobQueue
feature_category :compliance_management
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -9,8 +9,6 @@ module TodosDestroyer
sidekiq_options retry: 3
include TodosDestroyerQueue
tags :exclude_from_kubernetes
idempotent!
def perform(target_id, target_type)
......
......@@ -12,7 +12,6 @@ module UserStatusCleanup
# rubocop:enable Scalability/CronWorkerContext
feature_category :users
tags :exclude_from_kubernetes
idempotent!
......
......@@ -9,7 +9,6 @@ module Users
include CronjobQueue
feature_category :utilization
tags :exclude_from_kubernetes
NUMBER_OF_BATCHES = 50
BATCH_SIZE = 200
......
......@@ -7,7 +7,6 @@ module WebHooks
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
tags :exclude_from_kubernetes
urgency :low
idempotent!
......
......@@ -5,8 +5,6 @@ module Wikis
extend ::Gitlab::Utils::Override
include GitGarbageCollectMethods
tags :exclude_from_kubernetes
private
override :find_resource
......
......@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337507
milestone: '14.2'
type: development
group: group::pipeline authoring
default_enabled: false
default_enabled: true
......@@ -450,12 +450,12 @@ that proposes expanding this feature to support more variables.
#### `rules` with `include`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276515) in GitLab 14.2.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276515) in GitLab 14.2.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3 and is ready for production use.
> - [Enabled with `ci_include_rules` flag](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) for self-managed GitLab in GitLab 14.3 and is ready for production use.
NOTE:
On self-managed GitLab, by default this feature is not available. To make it available,
ask an administrator to [enable the `ci_include_rules` flag](../../administration/feature_flags.md).
On GitLab.com, this feature is not available. The feature is not ready for production use.
FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, ask an administrator to [disable the `ci_include_rules` flag](../../administration/feature_flags.md). On GitLab.com, this feature is available.
You can use [`rules`](#rules) with `include` to conditionally include other configuration files.
You can only use `rules:if` in `include` with [certain variables](#variables-with-include).
......@@ -1627,7 +1627,7 @@ To disable directed acyclic graphs (DAG), set the limit to `0`.
#### Artifact downloads with `needs`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.6.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab 12.6.
When a job uses `needs`, it no longer downloads all artifacts from previous stages
by default, because jobs with `needs` can start before earlier stages complete. With
......@@ -1679,7 +1679,7 @@ with `needs`.
#### Cross project artifact downloads with `needs` **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.7.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab 12.7.
Use `needs` to download artifacts from up to five jobs in pipelines:
......@@ -1752,7 +1752,7 @@ pipelines running on the same ref could override the artifacts.
#### Artifact downloads to child pipelines
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab v13.7.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab 13.7.
A [child pipeline](../pipelines/parent_child_pipelines.md) can download artifacts from a job in
its parent pipeline or another child pipeline in the same parent-child pipeline hierarchy.
......@@ -2379,7 +2379,7 @@ cache-job:
##### `cache:key:files`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab 12.5.
Use the `cache:key:files` keyword to generate a new key when one or two specific files
change. `cache:key:files` lets you reuse some caches, and rebuild them less often,
......@@ -2417,7 +2417,7 @@ fallback key is `default`.
##### `cache:key:prefix`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab 12.5.
Use `cache:key:prefix` to combine a prefix with the SHA computed for [`cache:key:files`](#cachekeyfiles).
......
......@@ -289,9 +289,9 @@ If the `latest` template does not exist yet, you can copy [the stable template](
### How to include an older stable template
Users may want to use an older [stable template](#stable-version) that is not bundled
in the current GitLab package. For example, the stable templates in GitLab v13.0 and
GitLab v14.0 could be so different that a user wants to continue using the v13.0 template even
after upgrading to GitLab 14.0.
in the current GitLab package. For example, the stable templates in GitLab 13.0 and
GitLab 14.0 could be so different that a user wants to continue using the GitLab 13.0
template even after upgrading to GitLab 14.0.
You can add a note in the template or in documentation explaining how to use `include:remote`
to include older template versions. If other templates are included with `include: template`,
......
......@@ -109,7 +109,7 @@ The following settings can be configured:
- `enabled`: By default this is set to `false`. Set this to `true` to enable Rack Attack.
- `ip_whitelist`: Whitelist any IPs from being blocked. They must be formatted as strings within a Ruby array.
CIDR notation is supported in GitLab v12.1 and up.
CIDR notation is supported in GitLab 12.1 and later.
For example, `["127.0.0.1", "127.0.0.2", "127.0.0.3", "192.168.0.1/24"]`.
- `maxretry`: The maximum amount of times a request can be made in the
specified time.
......
......@@ -159,7 +159,7 @@ steps to upgrade to v2:
To use a specific version of Auto Deploy dependencies, specify the previous Auto Deploy
stable template that contains the [desired version of `auto-deploy-image` and `auto-deploy-app`](#verify-dependency-versions).
For example, if the template is bundled in GitLab v13.3, change your `.gitlab-ci.yml` to:
For example, if the template is bundled in GitLab 13.3, change your `.gitlab-ci.yml` to:
```yaml
include:
......
......@@ -11,7 +11,7 @@ import {
GlFormTextarea,
} from '@gitlab/ui';
import { TYPE_ITERATIONS_CADENCE } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import { s__, __ } from '~/locale';
import createCadence from '../queries/cadence_create.mutation.graphql';
import updateCadence from '../queries/cadence_update.mutation.graphql';
......@@ -164,12 +164,15 @@ export default {
id: this.cadenceId,
};
},
result({ data: { group, errors } }) {
result({ data: { group, errors }, error }) {
if (error) {
return;
}
if (errors?.length) {
[this.errorMessage] = errors;
return;
}
const cadence = group?.iterationCadences?.nodes?.[0];
if (!cadence) {
......@@ -244,14 +247,17 @@ export default {
return;
}
const { errors } = data?.result || {};
const { iterationCadence, errors } = data?.result || {};
if (errors?.length > 0) {
[this.errorMessage] = errors;
return;
}
this.$router.push({ name: 'index' });
this.$router.push({
name: 'index',
query: { createdCadenceId: getIdFromGraphQLId(iterationCadence.id) },
});
})
.catch((e) => {
this.errorMessage = __('Unable to save cadence. Please try again');
......
......@@ -15,11 +15,13 @@ import { __, s__ } from '~/locale';
import { Namespace } from '../constants';
import groupQuery from '../queries/group_iterations_in_cadence.query.graphql';
import projectQuery from '../queries/project_iterations_in_cadence.query.graphql';
import TimeboxStatusBadge from './timebox_status_badge.vue';
const pageSize = 20;
const i18n = Object.freeze({
noResults: s__('Iterations|No iterations in cadence.'),
createFirstIteration: s__('Iterations|Create your first iteration'),
error: __('Error loading iterations'),
deleteCadence: s__('Iterations|Delete cadence'),
......@@ -43,6 +45,7 @@ export default {
GlInfiniteScroll,
GlModal,
GlSkeletonLoader,
TimeboxStatusBadge,
},
apollo: {
workspace: {
......@@ -84,6 +87,11 @@ export default {
type: String,
required: true,
},
showStateBadge: {
type: Boolean,
required: false,
default: false,
},
},
data() {
return {
......@@ -150,6 +158,14 @@ export default {
};
},
},
created() {
if (
`${this.$router.currentRoute?.query.createdCadenceId}` ===
`${getIdFromGraphQLId(this.cadenceId)}`
) {
this.expanded = true;
}
},
methods: {
fetchMore() {
if (this.iterations.length === 0 || !this.hasNextPage || this.loading) {
......@@ -213,8 +229,7 @@ export default {
name="chevron-right"
class="gl-transition-medium"
:class="{ 'gl-rotate-90': expanded }"
/>
{{ title }}
/><span class="gl-ml-2">{{ title }}</span>
</gl-button>
<span v-if="durationInWeeks" class="gl-mr-5 gl-display-none gl-sm-display-inline-block">
......@@ -279,6 +294,7 @@ export default {
<router-link :to="path(iteration.id)">
{{ iteration.title }}
</router-link>
<timebox-status-badge v-if="showStateBadge" :state="iteration.state" />
</li>
</ol>
<div v-if="loading" class="gl-p-5">
......@@ -286,9 +302,19 @@ export default {
</div>
</template>
</gl-infinite-scroll>
<p v-else-if="!loading" class="gl-px-5">
{{ i18n.noResults }}
</p>
<template v-else-if="!loading">
<p class="gl-px-7">{{ i18n.noResults }}</p>
<gl-button
v-if="!automatic"
variant="confirm"
category="secondary"
class="gl-mb-5 gl-ml-7"
data-qa-selector="create_cadence_cta"
:to="newIteration"
>
{{ i18n.createFirstIteration }}
</gl-button>
</template>
</gl-collapse>
</li>
</template>
......@@ -97,6 +97,11 @@ export default {
}
},
},
mounted() {
if (this.$router.currentRoute.query.createdCadenceId) {
this.$apollo.queries.workspace.refetch();
}
},
methods: {
nextPage() {
this.pagination = {
......@@ -172,6 +177,7 @@ export default {
:automatic="cadence.automatic"
:title="cadence.title"
:iteration-state="state"
:show-state-badge="tabIndex === 2"
@delete-cadence="deleteCadence"
/>
</ul>
......
......@@ -2,7 +2,6 @@
/* eslint-disable vue/no-v-html */
import {
GlAlert,
GlBadge,
GlDropdown,
GlDropdownItem,
GlEmptyState,
......@@ -13,29 +12,24 @@ import BurnCharts from 'ee/burndown_chart/components/burn_charts.vue';
import { TYPE_ITERATION } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { formatDate } from '~/lib/utils/datetime_utility';
import { __, s__ } from '~/locale';
import { s__ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { Namespace } from '../constants';
import query from '../queries/iteration.query.graphql';
import IterationReportTabs from './iteration_report_tabs.vue';
const iterationStates = {
closed: 'closed',
upcoming: 'upcoming',
expired: 'expired',
};
import TimeboxStatusBadge from './timebox_status_badge.vue';
export default {
components: {
BurnCharts,
GlAlert,
GlBadge,
GlIcon,
GlDropdown,
GlDropdownItem,
GlEmptyState,
GlLoadingIcon,
IterationReportTabs,
TimeboxStatusBadge,
},
apollo: {
iteration: {
......@@ -85,21 +79,6 @@ export default {
showEmptyState() {
return !this.loading && this.iteration && !this.iteration.title;
},
status() {
switch (this.iteration.state) {
case iterationStates.closed:
return {
text: __('Closed'),
variant: 'danger',
};
case iterationStates.expired:
return { text: __('Past due'), variant: 'warning' };
case iterationStates.upcoming:
return { text: __('Upcoming'), variant: 'neutral' };
default:
return { text: __('Open'), variant: 'success' };
}
},
editPage() {
return {
name: 'editIteration',
......@@ -130,9 +109,7 @@ export default {
ref="topbar"
class="gl-display-flex gl-justify-items-center gl-align-items-center gl-py-3 gl-border-1 gl-border-b-solid gl-border-gray-100"
>
<gl-badge :variant="status.variant">
{{ status.text }}
</gl-badge>
<timebox-status-badge :state="iteration.state" />
<span class="gl-ml-4"
>{{ formatDate(iteration.startDate) }}{{ formatDate(iteration.dueDate) }}</span
>
......
<script>
import { GlBadge } from '@gitlab/ui';
import { __ } from '~/locale';
const iterationStates = {
closed: 'closed',
upcoming: 'upcoming',
expired: 'expired',
};
export default {
components: {
GlBadge,
},
props: {
state: {
type: String,
required: false,
default: '',
},
},
computed: {
status() {
switch (this.state) {
case iterationStates.closed:
return {
text: __('Closed'),
variant: 'danger',
};
case iterationStates.expired:
return { text: __('Past due'), variant: 'warning' };
case iterationStates.upcoming:
return { text: __('Upcoming'), variant: 'neutral' };
default:
return { text: __('Open'), variant: 'success' };
}
},
},
};
</script>
<template>
<gl-badge :variant="status.variant">
{{ status.text }}
</gl-badge>
</template>
......@@ -22,7 +22,6 @@ module EE
field :epics, ::Types::EpicType.connection_type, null: true,
description: 'Find epics.',
extras: [:lookahead],
max_page_size: 2000,
resolver: ::Resolvers::EpicsResolver
field :epic_board,
......
# frozen_string_literal: true
module SetsMaxPageSize
extend ActiveSupport::Concern
DEPRECATED_MAX_PAGE_SIZE = 1000
# We no longer need 1000 page size after epics roadmap pagination feature is released,
# after :performance_roadmap flag rollout we can safely use default max page size(100)
# for epics, child epics and child issues without breaking current roadmaps.
#
# When removing :performance_roadmap flag delete this file and remove its method call and
# the fields using the resolver will keep using default max page size.
# Flag rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/337198
private
def set_temp_limit_for(actor)
max_page_size =
if Feature.enabled?(:performance_roadmap, actor, default_enabled: :yaml)
context.schema.default_max_page_size
else
DEPRECATED_MAX_PAGE_SIZE
end
field.max_page_size = max_page_size # rubocop: disable Graphql/Descriptions
end
end
......@@ -3,6 +3,7 @@
module Resolvers
class EpicIssuesResolver < BaseResolver
include CachingArrayResolver
include SetsMaxPageSize
type Types::EpicIssueType.connection_type, null: true
......@@ -21,6 +22,8 @@ module Resolvers
end
def query_for(id)
set_temp_limit_for(epic.group) # Can be removed with :performance_roadmap feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/337198
::Epic.related_issues(ids: id)
end
......
......@@ -4,6 +4,7 @@ module Resolvers
class EpicsResolver < BaseResolver
include TimeFrameArguments
include LooksAhead
include SetsMaxPageSize
argument :iid, GraphQL::Types::ID,
required: false,
......@@ -102,6 +103,8 @@ module Resolvers
end
def find_epics(args)
set_temp_limit_for(group) # Can be removed with :performance_roadmap feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/337198
apply_lookahead(EpicsFinder.new(context[:current_user], args).execute)
end
......
......@@ -84,7 +84,6 @@ module Types
field :children, ::Types::EpicType.connection_type, null: true,
description: 'Children (sub-epics) of the epic.',
max_page_size: 1000,
resolver: ::Resolvers::EpicsResolver
field :labels, Types::LabelType.connection_type, null: true,
description: 'Labels assigned to the epic.'
......@@ -132,7 +131,6 @@ module Types
null: true,
complexity: 5,
description: 'A list of issues associated with the epic.',
max_page_size: 1000,
resolver: Resolvers::EpicIssuesResolver
field :descendant_counts, Types::EpicDescendantCountType, null: true,
......
......@@ -387,6 +387,10 @@ module EE
feature_available?(:jira_issues_integration)
end
def zentao_issues_integration_available?
feature_available?(:zentao_issues_integration)
end
def multiple_approval_rules_available?
feature_available?(:multiple_approval_rules)
end
......
......@@ -137,6 +137,7 @@ class License < ApplicationRecord
oncall_schedules
escalation_policies
export_user_permissions
zentao_issues_integration
]
EEP_FEATURES.freeze
......
......@@ -11,7 +11,6 @@ class ActiveUserCountThresholdWorker # rubocop:disable Scalability/IdempotentWor
# rubocop:enable Scalability/CronWorkerContext
feature_category :license
tags :exclude_from_kubernetes
def perform
License.with_valid_license do |license|
......
......@@ -20,8 +20,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:adjourned_group_deletion
:worker_name: AdjournedGroupDeletionWorker
:feature_category: :authentication_and_authorization
......@@ -48,8 +47,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:app_sec_dast_profile_schedule
:worker_name: AppSec::Dast::ProfileScheduleWorker
:feature_category: :dynamic_application_security_testing
......@@ -112,8 +110,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:geo_container_repository_sync_dispatch
:worker_name: Geo::ContainerRepositorySyncDispatchWorker
:feature_category: :geo_replication
......@@ -122,8 +119,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_file_download_dispatch
:worker_name: Geo::FileDownloadDispatchWorker
:feature_category: :geo_replication
......@@ -132,8 +128,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_metrics_update
:worker_name: Geo::MetricsUpdateWorker
:feature_category: :geo_replication
......@@ -142,8 +137,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_prune_event_log
:worker_name: Geo::PruneEventLogWorker
:feature_category: :geo_replication
......@@ -152,8 +146,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_registry_sync
:worker_name: Geo::RegistrySyncWorker
:feature_category: :geo_replication
......@@ -171,8 +164,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_repository_verification_primary_batch
:worker_name: Geo::RepositoryVerification::Primary::BatchWorker
:feature_category: :geo_replication
......@@ -181,8 +173,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_repository_verification_secondary_scheduler
:worker_name: Geo::RepositoryVerification::Secondary::SchedulerWorker
:feature_category: :geo_replication
......@@ -191,8 +182,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_repository_verification_secondary_shard
:worker_name: Geo::RepositoryVerification::Secondary::ShardWorker
:feature_category: :geo_replication
......@@ -201,8 +191,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_scheduler_per_shard_scheduler
:worker_name: Geo::Scheduler::PerShardSchedulerWorker
:feature_category: :geo_replication
......@@ -211,8 +200,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_scheduler_primary_per_shard_scheduler
:worker_name: Geo::Scheduler::Primary::PerShardSchedulerWorker
:feature_category: :geo_replication
......@@ -221,8 +209,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_scheduler_secondary_per_shard_scheduler
:worker_name: Geo::Scheduler::Secondary::PerShardSchedulerWorker
:feature_category: :geo_replication
......@@ -231,8 +218,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_secondary_registry_consistency
:worker_name: Geo::Secondary::RegistryConsistencyWorker
:feature_category: :geo_replication
......@@ -241,8 +227,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_secondary_usage_data_cron
:worker_name: Geo::SecondaryUsageDataCronWorker
:feature_category: :geo_replication
......@@ -251,9 +236,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_sidekiq_cron_config
:worker_name: Geo::SidekiqCronConfigWorker
:feature_category: :geo_replication
......@@ -271,9 +254,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:geo_verification_cron
:worker_name: Geo::VerificationCronWorker
:feature_category: :geo_replication
......@@ -282,9 +263,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: cronjob:historical_data
:worker_name: HistoricalDataWorker
:feature_category: :utilization
......@@ -311,8 +290,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:incident_management_oncall_rotations_persist_all_rotations_shifts_job
:worker_name: IncidentManagement::OncallRotations::PersistAllRotationsShiftsJob
:feature_category: :incident_management
......@@ -321,8 +299,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:incident_management_pending_escalations_schedule_check_cron
:worker_name: IncidentManagement::PendingEscalations::ScheduleCheckCronWorker
:feature_category: :incident_management
......@@ -448,8 +425,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: cronjob:vulnerabilities_statistics_schedule
:worker_name: Vulnerabilities::Statistics::ScheduleWorker
:feature_category: :vulnerability_management
......@@ -467,8 +443,7 @@
:resource_boundary: :unknown
:weight: 3
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: dora_metrics:dora_daily_metrics_refresh
:worker_name: Dora::DailyMetrics::RefreshWorker
:feature_category: :continuous_delivery
......@@ -477,8 +452,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: epics:epics_update_epics_dates
:worker_name: Epics::UpdateEpicsDatesWorker
:feature_category: :epics
......@@ -496,8 +470,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_batch_project_registry_scheduler
:worker_name: Geo::Batch::ProjectRegistrySchedulerWorker
:feature_category: :geo_replication
......@@ -506,8 +479,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_container_repository_sync
:worker_name: Geo::ContainerRepositorySyncWorker
:feature_category: :geo_replication
......@@ -516,8 +488,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_design_repository_shard_sync
:worker_name: Geo::DesignRepositoryShardSyncWorker
:feature_category: :geo_replication
......@@ -526,8 +497,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_design_repository_sync
:worker_name: Geo::DesignRepositorySyncWorker
:feature_category: :geo_replication
......@@ -536,8 +506,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_destroy
:worker_name: Geo::DestroyWorker
:feature_category: :geo_replication
......@@ -546,9 +515,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_event
:worker_name: Geo::EventWorker
:feature_category: :geo_replication
......@@ -557,8 +524,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_file_download
:worker_name: Geo::FileDownloadWorker
:feature_category: :geo_replication
......@@ -567,8 +533,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_file_registry_removal
:worker_name: Geo::FileRegistryRemovalWorker
:feature_category: :geo_replication
......@@ -577,8 +542,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_file_removal
:worker_name: Geo::FileRemovalWorker
:feature_category: :geo_replication
......@@ -587,8 +551,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_hashed_storage_attachments_migration
:worker_name: Geo::HashedStorageAttachmentsMigrationWorker
:feature_category: :geo_replication
......@@ -597,8 +560,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_hashed_storage_migration
:worker_name: Geo::HashedStorageMigrationWorker
:feature_category: :geo_replication
......@@ -607,8 +569,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_project_sync
:worker_name: Geo::ProjectSyncWorker
:feature_category: :geo_replication
......@@ -617,8 +578,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_rename_repository
:worker_name: Geo::RenameRepositoryWorker
:feature_category: :geo_replication
......@@ -627,8 +587,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repositories_clean_up
:worker_name: Geo::RepositoriesCleanUpWorker
:feature_category: :geo_replication
......@@ -637,8 +596,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_cleanup
:worker_name: Geo::RepositoryCleanupWorker
:feature_category: :geo_replication
......@@ -647,8 +605,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_destroy
:worker_name: GeoRepositoryDestroyWorker
:feature_category: :geo_replication
......@@ -657,8 +614,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_shard_sync
:worker_name: Geo::RepositoryShardSyncWorker
:feature_category: :geo_replication
......@@ -667,8 +623,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_verification_primary_shard
:worker_name: Geo::RepositoryVerification::Primary::ShardWorker
:feature_category: :geo_replication
......@@ -677,8 +632,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_verification_primary_single
:worker_name: Geo::RepositoryVerification::Primary::SingleWorker
:feature_category: :geo_replication
......@@ -687,8 +641,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_repository_verification_secondary_single
:worker_name: Geo::RepositoryVerification::Secondary::SingleWorker
:feature_category: :geo_replication
......@@ -697,8 +650,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_reverification_batch
:worker_name: Geo::ReverificationBatchWorker
:feature_category: :geo_replication
......@@ -707,9 +659,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_scheduler_primary_scheduler
:worker_name: Geo::Scheduler::Primary::SchedulerWorker
:feature_category: :geo_replication
......@@ -718,8 +668,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_scheduler_scheduler
:worker_name: Geo::Scheduler::SchedulerWorker
:feature_category: :geo_replication
......@@ -728,8 +677,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_scheduler_secondary_scheduler
:worker_name: Geo::Scheduler::Secondary::SchedulerWorker
:feature_category: :geo_replication
......@@ -738,8 +686,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_verification
:worker_name: Geo::VerificationWorker
:feature_category: :geo_replication
......@@ -748,9 +695,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_verification_batch
:worker_name: Geo::VerificationBatchWorker
:feature_category: :geo_replication
......@@ -759,9 +704,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: geo:geo_verification_timeout
:worker_name: Geo::VerificationTimeoutWorker
:feature_category: :geo_replication
......@@ -770,9 +713,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
- :exclude_from_gitlab_com
:tags: []
- :name: iterations:iterations_roll_over_issues
:worker_name: Iterations::RollOverIssuesWorker
:feature_category: :issue_tracking
......@@ -844,8 +785,7 @@
:resource_boundary: :cpu
:weight: 2
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: security_scans:security_track_secure_scans
:worker_name: Security::TrackSecureScansWorker
:feature_category: :vulnerability_management
......@@ -872,8 +812,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: adjourned_project_deletion
:worker_name: AdjournedProjectDeletionWorker
:feature_category: :authentication_and_authorization
......@@ -909,8 +848,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: approval_rules_external_approval_rule_payload
:worker_name: ApprovalRules::ExternalApprovalRulePayloadWorker
:feature_category: :source_code_management
......@@ -919,8 +857,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: ci_batch_reset_minutes
:worker_name: Ci::BatchResetMinutesWorker
:feature_category: :continuous_integration
......@@ -947,8 +884,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: elastic_association_indexer
:worker_name: ElasticAssociationIndexerWorker
:feature_category: :global_search
......@@ -957,8 +893,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: elastic_commit_indexer
:worker_name: ElasticCommitIndexerWorker
:feature_category: :global_search
......@@ -1030,8 +965,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: group_wikis_git_garbage_collect
:worker_name: GroupWikis::GitGarbageCollectWorker
:feature_category: :gitaly
......@@ -1040,8 +974,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: groups_export_memberships
:worker_name: Groups::ExportMembershipsWorker
:feature_category: :compliance_management
......@@ -1077,8 +1010,7 @@
:resource_boundary: :cpu
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: incident_management_apply_incident_sla_exceeded_label
:worker_name: IncidentManagement::ApplyIncidentSlaExceededLabelWorker
:feature_category: :incident_management
......@@ -1087,8 +1019,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: incident_management_oncall_rotations_persist_shifts_job
:worker_name: IncidentManagement::OncallRotations::PersistShiftsJob
:feature_category: :incident_management
......@@ -1097,8 +1028,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: incident_management_pending_escalations_alert_check
:worker_name: IncidentManagement::PendingEscalations::AlertCheckWorker
:feature_category: :incident_management
......@@ -1125,8 +1055,7 @@
:resource_boundary: :unknown
:weight: 2
:idempotent:
:tags:
- :exclude_from_gitlab_com
:tags: []
- :name: merge_request_reset_approvals
:worker_name: MergeRequestResetApprovalsWorker
:feature_category: :source_code_management
......@@ -1172,8 +1101,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent:
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: refresh_license_compliance_checks
:worker_name: RefreshLicenseComplianceChecksWorker
:feature_category: :license_compliance
......@@ -1209,8 +1137,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: requirements_management_process_requirements_reports
:worker_name: RequirementsManagement::ProcessRequirementsReportsWorker
:feature_category: :requirements_management
......@@ -1228,8 +1155,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: set_user_status_based_on_user_cap_setting
:worker_name: SetUserStatusBasedOnUserCapSettingWorker
:feature_category: :users
......@@ -1238,8 +1164,7 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
:tags:
- :exclude_from_kubernetes
:tags: []
- :name: status_page_publish
:worker_name: StatusPage::PublishWorker
:feature_category: :incident_management
......
......@@ -12,7 +12,6 @@ module Analytics
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :devops_reports
tags :exclude_from_kubernetes
idempotent!
WORKERS_GAP = 5.seconds
......
......@@ -12,7 +12,6 @@ module Analytics
feature_category :devops_reports
idempotent!
tags :exclude_from_kubernetes
def perform(enabled_namespace_id)
enabled_namespace = EnabledNamespace.find(enabled_namespace_id)
......
......@@ -10,7 +10,6 @@ module ApprovalRules
idempotent!
feature_category :source_code_management
tags :exclude_from_kubernetes
def perform(rule_id, data)
rule = MergeRequests::ExternalStatusCheck.find(rule_id)
......
......@@ -7,6 +7,5 @@ module GeoQueue
included do
queue_namespace :geo
feature_category :geo_replication
tags :exclude_from_gitlab_com
end
end
......@@ -12,7 +12,6 @@ class DastSiteValidationWorker
sidekiq_retry_in { 25 }
feature_category :dynamic_application_security_testing
tags :exclude_from_kubernetes
def perform(_dast_site_validation_id)
# Scheduled for removal in %15.0
......
......@@ -10,7 +10,6 @@ module Deployments
idempotent!
feature_category :continuous_delivery
tags :exclude_from_kubernetes
queue_namespace :deployment
def perform(environment_id)
......
......@@ -13,7 +13,6 @@ module Dora
idempotent!
queue_namespace :dora_metrics
feature_category :continuous_delivery
tags :exclude_from_kubernetes
def perform(environment_id, date)
Environment.find_by_id(environment_id).try do |environment|
......
......@@ -9,7 +9,6 @@ class ElasticAssociationIndexerWorker # rubocop:disable Scalability/IdempotentWo
feature_category :global_search
worker_resource_boundary :cpu
tags :exclude_from_kubernetes
loggable_arguments 0, 2
def perform(class_name, id, indexed_associations)
......
......@@ -9,7 +9,6 @@ class ElasticRemoveExpiredNamespaceSubscriptionsFromIndexCronWorker
include CronjobQueue
feature_category :global_search
tags :exclude_from_kubernetes
idempotent!
def perform
......
......@@ -7,8 +7,6 @@ module Geo
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
tags :exclude_from_gitlab_com
def perform
unless ::Geo::ContainerRepositoryRegistry.replication_enabled?
log_info('Container Registry replication is not enabled')
......
......@@ -2,8 +2,6 @@
module Geo
class DesignRepositoryShardSyncWorker < RepositoryShardSyncWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
private
def schedule_job(project_id)
......
......@@ -12,7 +12,6 @@ module Geo
idempotent!
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform(replicable_name, replicable_id)
......
......@@ -7,8 +7,6 @@ module Geo
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
tags :exclude_from_gitlab_com
private
# Cannot utilise backoff because there are no events currently being
......
......@@ -13,7 +13,6 @@ module Geo
# rubocop:enable Scalability/CronWorkerContext
feature_category :geo_replication
tags :exclude_from_gitlab_com
LEASE_TIMEOUT = 5.minutes
......
......@@ -13,7 +13,6 @@ module Geo
include ::Gitlab::Geo::LogHelpers
feature_category :geo_replication
tags :exclude_from_gitlab_com
def perform
return if Gitlab::Database.read_only?
......
......@@ -4,7 +4,6 @@ module Geo
class RepositoryShardSyncWorker < Geo::Scheduler::Secondary::SchedulerWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: false
loggable_arguments 0
tags :exclude_from_gitlab_com
attr_accessor :shard_name
......
......@@ -2,8 +2,6 @@
module Geo
class RepositorySyncWorker < Geo::Scheduler::Secondary::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def schedule_job(shard_name)
Geo::RepositoryShardSyncWorker.perform_async(shard_name)
Geo::DesignRepositoryShardSyncWorker.perform_async(shard_name)
......
......@@ -4,8 +4,6 @@ module Geo
module RepositoryVerification
module Primary
class BatchWorker < Geo::Scheduler::Primary::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
return unless Gitlab::Geo.repository_verification_enabled?
......
......@@ -6,7 +6,6 @@ module Geo
class ShardWorker < Geo::Scheduler::Primary::SchedulerWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: false
loggable_arguments 0
tags :exclude_from_gitlab_com
attr_accessor :shard_name
......
......@@ -11,7 +11,6 @@ module Geo
include ExclusiveLeaseGuard
sidekiq_options retry: false
tags :exclude_from_gitlab_com
LEASE_TIMEOUT = 1.hour.to_i
......
......@@ -4,8 +4,6 @@ module Geo
module RepositoryVerification
module Secondary
class SchedulerWorker < Geo::Scheduler::Secondary::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
return unless Gitlab::Geo.repository_verification_enabled?
......
......@@ -12,7 +12,6 @@ module Geo
attr_accessor :shard_name
loggable_arguments 0
tags :exclude_from_gitlab_com
def perform(shard_name)
@shard_name = shard_name
......
......@@ -12,7 +12,6 @@ module Geo
include Gitlab::Geo::ProjectLogHelpers
sidekiq_options retry: false
tags :exclude_from_gitlab_com
LEASE_TIMEOUT = 1.hour.to_i
......
......@@ -17,7 +17,6 @@ module Geo
MAX_RUNNING_JOBS = 1
idempotent!
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform_work(replicable_name)
......
......@@ -15,7 +15,6 @@ module Geo
include ::EachShardWorker
feature_category :geo_replication
tags :exclude_from_gitlab_com
# These workers are enqueued every minute by sidekiq-cron. If one of them
# is already enqueued or running, then there isn't a strong case for
......
......@@ -4,8 +4,6 @@ module Geo
module Scheduler
module Primary
class PerShardSchedulerWorker < Geo::Scheduler::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
unless Gitlab::Geo.primary?
log_info('Current node not a primary')
......
......@@ -4,8 +4,6 @@ module Geo
module Scheduler
module Primary
class SchedulerWorker < Geo::Scheduler::SchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
return unless Gitlab::Geo.primary?
......
......@@ -4,8 +4,6 @@ module Geo
module Scheduler
module Secondary
class PerShardSchedulerWorker < Geo::Scheduler::PerShardSchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
unless Gitlab::Geo.geo_database_configured?
log_info('Geo database not configured')
......
......@@ -4,8 +4,6 @@ module Geo
module Scheduler
module Secondary
class SchedulerWorker < Geo::Scheduler::SchedulerWorker # rubocop:disable Scalability/IdempotentWorker
tags :exclude_from_gitlab_com
def perform
unless Gitlab::Geo.geo_database_configured?
log_info('Geo database not configured')
......
......@@ -17,7 +17,6 @@ module Geo
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :geo_replication
tags :exclude_from_gitlab_com
REGISTRY_CLASSES = [
Geo::ContainerRepositoryRegistry,
......
......@@ -13,7 +13,6 @@ module Geo
include ExclusiveLeaseGuard
feature_category :geo_replication
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
def perform
return unless Gitlab::Geo.secondary?
......
......@@ -14,7 +14,6 @@ module Geo
idempotent!
sidekiq_options retry: false, dead: false
feature_category :geo_replication
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
def perform
Gitlab::Geo.enabled_replicator_classes.each do |replicator_class|
......
......@@ -12,7 +12,6 @@ module Geo
include ::Gitlab::Geo::LogHelpers
idempotent!
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform_work(replicable_name)
......
......@@ -17,7 +17,6 @@ module Geo
idempotent!
feature_category :geo_replication
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
def perform
Gitlab::Geo.verification_enabled_replicator_classes.each do |replicator_class|
......
......@@ -11,7 +11,6 @@ module Geo
idempotent!
sidekiq_options retry: false, dead: false
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform(replicable_name)
......
......@@ -11,7 +11,6 @@ module Geo
sidekiq_options retry: 3, dead: false
idempotent!
tags :exclude_from_kubernetes, :exclude_from_gitlab_com
loggable_arguments 0
def perform(replicable_name, replicable_id)
......
......@@ -9,7 +9,6 @@ class GroupSamlGroupSyncWorker
include Gitlab::Utils::StrongMemoize
feature_category :authentication_and_authorization
tags :exclude_from_kubernetes
idempotent!
loggable_arguments 2
......
......@@ -5,8 +5,6 @@ module GroupWikis
extend ::Gitlab::Utils::Override
include GitGarbageCollectMethods
tags :exclude_from_kubernetes
private
override :find_resource
......
......@@ -12,7 +12,6 @@ module Groups
worker_resource_boundary :cpu
feature_category :source_code_management
tags :exclude_from_kubernetes
idempotent!
loggable_arguments 0, 1
......
......@@ -10,7 +10,6 @@ module IncidentManagement
idempotent!
feature_category :incident_management
tags :exclude_from_kubernetes
def perform(incident_id)
@incident = Issue.find_by_id(incident_id)
......
......@@ -11,7 +11,6 @@ module IncidentManagement
idempotent!
feature_category :incident_management
tags :exclude_from_kubernetes
def perform
iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: IssuableSla.exceeded)
......
......@@ -12,7 +12,6 @@ module IncidentManagement
idempotent!
feature_category :incident_management
tags :exclude_from_kubernetes
queue_namespace :cronjob
def perform
......
......@@ -15,7 +15,6 @@ module IncidentManagement
idempotent!
feature_category :incident_management
tags :exclude_from_kubernetes
def perform(rotation_id)
@rotation = ::IncidentManagement::OncallRotation.find_by_id(rotation_id)
......
......@@ -11,7 +11,6 @@ class LdapGroupSyncWorker # rubocop:disable Scalability/IdempotentWorker
worker_has_external_dependencies!
weight 2
loggable_arguments 0, 1
tags :exclude_from_gitlab_com
# rubocop: disable CodeReuse/ActiveRecord
def perform(group_ids, provider = nil)
......
......@@ -8,7 +8,6 @@
# which significantly delays project creation from custom templates.
class ProjectTemplateExportWorker < ProjectExportWorker # rubocop:disable Scalability/IdempotentWorker
feature_category :importers
tags :exclude_from_kubernetes
loggable_arguments 2, 3
sidekiq_options retry: false, dead: false
sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION
......
......@@ -11,7 +11,6 @@ module RequirementsManagement
idempotent!
feature_category :requirements_management
tags :exclude_from_kubernetes
# TODO: Set worker_resource_boundary.
# https://gitlab.com/gitlab-org/gitlab/-/issues/281173
......
......@@ -9,7 +9,6 @@ module Security
sidekiq_options retry: 3
feature_category :vulnerability_management
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,8 +10,6 @@ module Security
sidekiq_options retry: 3
include SecurityScansQueue
tags :exclude_from_kubernetes
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
::Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
......
......@@ -9,7 +9,6 @@ class SetUserStatusBasedOnUserCapSettingWorker
include ::Gitlab::Utils::StrongMemoize
feature_category :users
tags :exclude_from_kubernetes
idempotent!
......
......@@ -10,7 +10,6 @@ module TodosDestroyer
queue_namespace :todos_destroyer
feature_category :epics
tags :exclude_from_kubernetes
def perform(epic_id)
return unless epic_id
......
......@@ -13,7 +13,6 @@ module Vulnerabilities
# rubocop:enable Scalability/CronWorkerContext
feature_category :vulnerability_management
tags :exclude_from_kubernetes
def perform
DeletionService.execute
......
......@@ -168,7 +168,12 @@ describe('Iteration cadence form', () => {
await waitForPromises();
expect(push).toHaveBeenCalledWith({ name: 'index' });
expect(push).toHaveBeenCalledWith({
name: 'index',
query: {
createdCadenceId: id,
},
});
});
it('does not submit if required fields missing', () => {
......
......@@ -3,12 +3,14 @@ import { createLocalVue, RouterLinkStub } from '@vue/test-utils';
import { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import IterationCadenceListItem from 'ee/iterations/components/iteration_cadence_list_item.vue';
import TimeboxStatusBadge from 'ee/iterations/components/timebox_status_badge.vue';
import { Namespace } from 'ee/iterations/constants';
import groupIterationsInCadenceQuery from 'ee/iterations/queries/group_iterations_in_cadence.query.graphql';
import projectIterationsInCadenceQuery from 'ee/iterations/queries/project_iterations_in_cadence.query.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended as mount } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
const push = jest.fn();
const $router = {
......@@ -82,11 +84,11 @@ describe('Iteration cadence list item', () => {
},
},
};
function createComponent({
props = {},
canCreateCadence,
canEditCadence,
currentRoute,
namespaceType = Namespace.Group,
query = groupIterationsInCadenceQuery,
resolverMock = jest.fn().mockResolvedValue(querySuccessResponse),
......@@ -97,7 +99,10 @@ describe('Iteration cadence list item', () => {
localVue,
apolloProvider,
mocks: {
$router,
$router: {
...$router,
currentRoute,
},
},
stubs: {
RouterLink: RouterLinkStub,
......@@ -137,7 +142,7 @@ describe('Iteration cadence list item', () => {
expect(resolverMock).not.toHaveBeenCalled();
});
it('shows empty text when no results', async () => {
it('shows empty text and CTA when no results', async () => {
await createComponent({
resolverMock: jest.fn().mockResolvedValue(queryEmptyResponse),
});
......@@ -148,6 +153,7 @@ describe('Iteration cadence list item', () => {
expect(findLoader().exists()).toBe(false);
expect(wrapper.text()).toContain(IterationCadenceListItem.i18n.noResults);
expect(wrapper.text()).toContain(IterationCadenceListItem.i18n.createFirstIteration);
});
it('shows iterations after loading', async () => {
......@@ -162,6 +168,18 @@ describe('Iteration cadence list item', () => {
});
});
it('automatically expands for newly created cadence', async () => {
await createComponent({
currentRoute: { query: { createdCadenceId: getIdFromGraphQLId(cadence.id) } },
});
await waitForPromises();
iterations.forEach(({ title }) => {
expect(wrapper.text()).toContain(title);
});
});
it('loads project iterations for Project namespaceType', async () => {
await createComponent({
namespaceType: Namespace.Project,
......@@ -261,4 +279,17 @@ describe('Iteration cadence list item', () => {
expect(wrapper.find(GlDropdown).exists()).toBe(true);
});
it.each([
['hides', false],
['shows', true],
])('%s status badge when showStateBadge is %s', async (_, showStateBadge) => {
await createComponent({ props: { showStateBadge } });
expand();
await waitForPromises();
expect(wrapper.findComponent(TimeboxStatusBadge).exists()).toBe(showStateBadge);
});
});
......@@ -3,6 +3,7 @@ import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import IterationReport from 'ee/iterations/components/iteration_report.vue';
import IterationReportTabs from 'ee/iterations/components/iteration_report_tabs.vue';
import TimeboxStatusBadge from 'ee/iterations/components/timebox_status_badge.vue';
import { Namespace } from 'ee/iterations/constants';
import query from 'ee/iterations/queries/iteration.query.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
......@@ -168,7 +169,9 @@ describe('Iterations report', () => {
it('shows status and date in header', () => {
const startDate = IterationReport.methods.formatDate(mockIterationNode.startDate);
const dueDate = IterationReport.methods.formatDate(mockIterationNode.startDate);
expect(findTopbar().text().toLowerCase()).toContain(mockIterationNode.state);
expect(wrapper.findComponent(TimeboxStatusBadge).props('state')).toContain(
mockIterationNode.state,
);
expect(findTopbar().text()).toContain(startDate);
expect(findTopbar().text()).toContain(dueDate);
});
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'getting epic issues information' do
include GraphqlHelpers
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
let_it_be(:project) { create(:project, group: group) }
before_all do
group.add_maintainer(user)
end
before do
stub_licensed_features(epics: true)
end
context 'when toggling performance_roadmap feature flag' do
let_it_be(:epic) { create(:epic, group: group, state: 'opened') }
let_it_be(:issue1) { create(:issue, project: project) }
let_it_be(:issue2) { create(:issue, project: project) }
let(:query) do
epic_issues_query(epic)
end
before_all do
create(:epic_issue, epic: epic, issue: issue1)
create(:epic_issue, epic: epic, issue: issue2)
end
def epic_issues_query(epic)
epic_issues_fragment = <<~EPIC_ISSUE
issues {
nodes {
id
}
}
EPIC_ISSUE
graphql_query_for(
:group,
{ 'fullPath' => epic.group.full_path },
query_graphql_field(
'epic', { iid: epic.iid },
epic_issues_fragment
)
)
end
def epic_issues_count
graphql_data_at(:group, :epic, :issues, :nodes).count
end
it 'returns epics with max page based on feature flag status' do
stub_const('SetsMaxPageSize::DEPRECATED_MAX_PAGE_SIZE', 1)
post_graphql(epic_issues_query(epic), current_user: user)
expect(epic_issues_count).to eq(2)
stub_feature_flags(performance_roadmap: false)
post_graphql(epic_issues_query(epic), current_user: user)
expect(epic_issues_count).to eq(1)
stub_feature_flags(performance_roadmap: true)
post_graphql(epic_issues_query(epic), current_user: user)
expect(epic_issues_count).to eq(2)
end
end
end
......@@ -13,6 +13,30 @@ RSpec.describe 'getting epics information' do
stub_licensed_features(epics: true)
end
context 'when performance_roadmap flag is disabled' do
let_it_be(:epic1) { create(:epic, group: group, state: 'opened') }
let_it_be(:epic2) { create(:epic, group: group, state: 'opened') }
def epics_count
graphql_data_at(:group, :epics, :nodes).count
end
it 'returns epics within timeframe' do
stub_const('SetsMaxPageSize::DEPRECATED_MAX_PAGE_SIZE', 1)
post_graphql(epics_query_by_hash(group), current_user: user)
expect(epics_count).to eq(2)
stub_feature_flags(performance_roadmap: false)
post_graphql(epics_query_by_hash(group), current_user: user)
expect(epics_count).to eq(1)
stub_feature_flags(performance_roadmap: true)
post_graphql(epics_query_by_hash(group), current_user: user)
expect(epics_count).to eq(2)
end
end
describe 'query for epics which start with an iid' do
let_it_be(:epic1) { create(:epic, group: group, iid: 11) }
let_it_be(:epic2) { create(:epic, group: group, iid: 22) }
......@@ -130,14 +154,15 @@ RSpec.describe 'getting epics information' do
epics_query_by_hash(group, field => value)
end
def epics_query_by_hash(group, args)
def epics_query_by_hash(group, args = {})
field_queries = args.map { |key, value| "#{key}:\"#{value}\"" }.join(',')
field_queries = " ( #{field_queries} ) " if field_queries.present?
<<~QUERY
query {
group(fullPath: "#{group.full_path}") {
id,
epics(#{field_queries}) {
epics#{field_queries} {
nodes {
id
}
......
......@@ -7,6 +7,7 @@ module Gitlab
AVAILABLE_LANGUAGES = {
'bg' => 'Bulgarian - български',
'cs_CZ' => 'Czech - čeština',
'da_DK' => 'Danish - dansk',
'de' => 'German - Deutsch',
'en' => 'English',
'eo' => 'Esperanto - esperanto',
......@@ -18,10 +19,12 @@ module Gitlab
'it' => 'Italian - italiano',
'ja' => 'Japanese - 日本語',
'ko' => 'Korean - 한국어',
'nb_NO' => 'Norwegian (Bokmål) - norsk (bokmål)',
'nl_NL' => 'Dutch - Nederlands',
'pl_PL' => 'Polish - polski',
'pt_BR' => 'Portuguese (Brazil) - português (Brasil)',
'ru' => 'Russian - Русский',
'ro_RO' => 'Romanian - română',
'ru' => 'Russian - русский',
'tr_TR' => 'Turkish - Türkçe',
'uk' => 'Ukrainian - українська',
'zh_CN' => 'Chinese, Simplified - 简体中文',
......@@ -40,6 +43,7 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 1,
'da_DK' => 26,
'de' => 16,
'en' => 100,
'eo' => 0,
......@@ -51,9 +55,11 @@ module Gitlab
'it' => 2,
'ja' => 39,
'ko' => 12,
'nb_NO' => 27,
'nl_NL' => 0,
'pl_PL' => 6,
'pt_BR' => 36,
'ro_RO' => 20,
'ru' => 28,
'tr_TR' => 16,
'uk' => 40,
......
......@@ -7,7 +7,7 @@ module Gitlab
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost
MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack
Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
)).freeze
def self.namespaced_integrations
......
# frozen_string_literal: true
module Gitlab
module Zentao
class Client
Error = Class.new(StandardError)
ConfigError = Class.new(Error)
attr_reader :integration
def initialize(integration)
raise ConfigError, 'Please check your integration configuration.' unless integration
@integration = integration
end
def ping
response = fetch_product(zentao_product_xid)
active = response.fetch('deleted') == '0' rescue false
if active
{ success: true }
else
{ success: false, message: 'Not Found' }
end
end
def fetch_product(product_id)
get("products/#{product_id}")
end
def fetch_issues(params = {})
get("products/#{zentao_product_xid}/issues",
params.reverse_merge(page: 1, limit: 20))
end
def fetch_issue(issue_id)
get("issues/#{issue_id}")
end
private
def get(path, params = {})
options = { headers: headers, query: params }
response = Gitlab::HTTP.get(url(path), options)
return {} unless response.success?
Gitlab::Json.parse(response.body)
rescue JSON::ParserError
{}
end
def url(path)
host = integration.api_url.presence || integration.url
URI.join(host, '/api.php/v1/', path)
end
def headers
{
'Content-Type': 'application/json',
'Token': integration.api_token
}
end
def zentao_product_xid
integration.zentao_product_xid
end
end
end
end
......@@ -18815,6 +18815,9 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
msgid "Iterations|Create your first iteration"
msgstr ""
msgid "Iterations|Delete cadence"
msgstr ""
......@@ -38922,6 +38925,30 @@ msgstr ""
msgid "Your username is %{username}."
msgstr ""
msgid "ZentaoIntegration|Base URL of the Zentao instance."
msgstr ""
msgid "ZentaoIntegration|Enter API token"
msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
msgid "ZentaoIntegration|Use Zentao as this project's issue tracker."
msgstr ""
msgid "ZentaoIntegration|Zentao API URL (optional)"
msgstr ""
msgid "ZentaoIntegration|Zentao API token"
msgstr ""
msgid "ZentaoIntegration|Zentao Product ID"
msgstr ""
msgid "ZentaoIntegration|Zentao Web URL"
msgstr ""
msgid "Zoom meeting added"
msgstr ""
......
......@@ -7,13 +7,21 @@ FactoryBot.define do
integration factory: :jira_integration
end
factory :zentao_tracker_data, class: 'Integrations::ZentaoTrackerData' do
integration factory: :zentao_integration
url { 'https://jihudemo.zentao.net' }
api_url { '' }
api_token { 'ZENTAO_TOKEN' }
zentao_product_xid { '3' }
end
factory :issue_tracker_data, class: 'Integrations::IssueTrackerData' do
integration
end
factory :open_project_tracker_data, class: 'Integrations::OpenProjectTrackerData' do
integration factory: :open_project_service
url { 'http://openproject.example.com'}
url { 'http://openproject.example.com' }
token { 'supersecret' }
project_identifier_code { 'PRJ-1' }
closed_status_id { '15' }
......
......@@ -85,6 +85,32 @@ FactoryBot.define do
end
end
factory :zentao_integration, class: 'Integrations::Zentao' do
project
active { true }
type { 'ZentaoService' }
transient do
create_data { true }
url { 'https://jihudemo.zentao.net' }
api_url { '' }
api_token { 'ZENTAO_TOKEN' }
zentao_product_xid { '3' }
end
after(:build) do |integration, evaluator|
if evaluator.create_data
integration.zentao_tracker_data = build(:zentao_tracker_data,
integration: integration,
url: evaluator.url,
api_url: evaluator.api_url,
api_token: evaluator.api_token,
zentao_product_xid: evaluator.zentao_product_xid
)
end
end
end
factory :confluence_integration, class: 'Integrations::Confluence' do
project
active { true }
......
......@@ -37,6 +37,50 @@ describe('experiment Utilities', () => {
});
});
describe('getAllExperimentContexts', () => {
const schema = TRACKING_CONTEXT_SCHEMA;
let origGon;
beforeEach(() => {
origGon = window.gon;
});
afterEach(() => {
window.gon = origGon;
});
it('collects all of the experiment contexts into a single array', () => {
const experiments = [
{ experiment: 'abc', variant: 'candidate' },
{ experiment: 'def', variant: 'control' },
{ experiment: 'ghi', variant: 'blue' },
];
window.gon = {
experiment: experiments.reduce((collector, { experiment, variant }) => {
return { ...collector, [experiment]: { experiment, variant } };
}, {}),
};
expect(experimentUtils.getAllExperimentContexts()).toEqual(
experiments.map((data) => ({ schema, data })),
);
});
it('returns an empty array if there are no experiments', () => {
window.gon.experiment = {};
expect(experimentUtils.getAllExperimentContexts()).toEqual([]);
});
it('includes all additional experiment data', () => {
const experiment = 'experimentWithCustomData';
const data = { experiment, variant: 'control', color: 'blue', style: 'rounded' };
window.gon.experiment[experiment] = data;
expect(experimentUtils.getAllExperimentContexts()).toContainEqual({ schema, data });
});
});
describe('isExperimentVariant', () => {
describe.each`
gon | input | output
......
import { setHTMLFixture } from 'helpers/fixtures';
import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
import { getExperimentData } from '~/experimentation/utils';
import { getExperimentData, getAllExperimentContexts } from '~/experimentation/utils';
import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
import getStandardContext from '~/tracking/get_standard_context';
jest.mock('~/experimentation/utils', () => ({ getExperimentData: jest.fn() }));
jest.mock('~/experimentation/utils', () => ({
getExperimentData: jest.fn(),
getAllExperimentContexts: jest.fn(),
}));
describe('Tracking', () => {
let standardContext;
......@@ -29,6 +32,7 @@ describe('Tracking', () => {
beforeEach(() => {
getExperimentData.mockReturnValue(undefined);
getAllExperimentContexts.mockReturnValue([]);
window.snowplow = window.snowplow || (() => {});
window.snowplowOptions = {
......@@ -100,6 +104,31 @@ describe('Tracking', () => {
initDefaultTrackers();
expect(trackLoadEventsSpy).toHaveBeenCalled();
});
describe('when there are experiment contexts', () => {
const experimentContexts = [
{
schema: TRACKING_CONTEXT_SCHEMA,
data: { experiment: 'experiment1', variant: 'control' },
},
{
schema: TRACKING_CONTEXT_SCHEMA,
data: { experiment: 'experiment_two', variant: 'candidate' },
},
];
beforeEach(() => {
getAllExperimentContexts.mockReturnValue(experimentContexts);
});
it('includes those contexts alongside the standard context', () => {
initDefaultTrackers();
expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [
standardContext,
...experimentContexts,
]);
});
});
});
describe('.event', () => {
......
......@@ -320,6 +320,7 @@ integrations:
- project
- service_hook
- jira_tracker_data
- zentao_tracker_data
- issue_tracker_data
- open_project_tracker_data
hooks:
......@@ -399,6 +400,7 @@ project:
- teamcity_integration
- pushover_integration
- jira_integration
- zentao_integration
- redmine_integration
- youtrack_integration
- custom_issue_tracker_integration
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::Zentao::Client do
subject(:integration) { described_class.new(zentao_integration) }
let(:zentao_integration) { create(:zentao_integration) }
let(:mock_get_products_url) { integration.send(:url, "products/#{zentao_integration.zentao_product_xid}") }
describe '#new' do
context 'if integration is nil' do
let(:zentao_integration) { nil }
it 'raises ConfigError' do
expect { integration }.to raise_error(described_class::ConfigError)
end
end
context 'integration is provided' do
it 'is initialized successfully' do
expect { integration }.not_to raise_error
end
end
end
describe '#fetch_product' do
let(:mock_headers) do
{
headers: {
'Content-Type' => 'application/json',
'Token' => zentao_integration.api_token
}
}
end
context 'with valid product' do
let(:mock_response) { { 'id' => zentao_integration.zentao_product_xid } }
before do
WebMock.stub_request(:get, mock_get_products_url)
.with(mock_headers).to_return(status: 200, body: mock_response.to_json)
end
it 'fetches the product' do
expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq mock_response
end
end
context 'with invalid product' do
before do
WebMock.stub_request(:get, mock_get_products_url)
.with(mock_headers).to_return(status: 404, body: {}.to_json)
end
it 'fetches the empty product' do
expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq({})
end
end
context 'with invalid response' do
before do
WebMock.stub_request(:get, mock_get_products_url)
.with(mock_headers).to_return(status: 200, body: '[invalid json}')
end
it 'fetches the empty product' do
expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq({})
end
end
end
describe '#ping' do
let(:mock_headers) do
{
headers: {
'Content-Type' => 'application/json',
'Token' => zentao_integration.api_token
}
}
end
context 'with valid resource' do
before do
WebMock.stub_request(:get, mock_get_products_url)
.with(mock_headers).to_return(status: 200, body: { 'deleted' => '0' }.to_json)
end
it 'responds with success' do
expect(integration.ping[:success]).to eq true
end
end
context 'with deleted resource' do
before do
WebMock.stub_request(:get, mock_get_products_url)
.with(mock_headers).to_return(status: 200, body: { 'deleted' => '1' }.to_json)
end
it 'responds with unsuccess' do
expect(integration.ping[:success]).to eq false
end
end
end
end
......@@ -8,6 +8,18 @@ RSpec.describe AddTriggersToIntegrationsTypeNew do
let(:migration) { described_class.new }
let(:integrations) { table(:integrations) }
# This matches Gitlab::Integrations::StiType at the time the trigger was added
let(:namespaced_integrations) do
%w[
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost
MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack
Github GitlabSlackApplication
]
end
describe '#up' do
before do
migrate!
......@@ -15,7 +27,7 @@ RSpec.describe AddTriggersToIntegrationsTypeNew do
describe 'INSERT trigger' do
it 'sets `type_new` to the transformed `type` class name' do
Gitlab::Integrations::StiType.namespaced_integrations.each do |type|
namespaced_integrations.each do |type|
integration = integrations.create!(type: "#{type}Service")
expect(integration.reload).to have_attributes(
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Integrations::Zentao do
let(:url) { 'https://jihudemo.zentao.net' }
let(:api_url) { 'https://jihudemo.zentao.net' }
let(:api_token) { 'ZENTAO_TOKEN' }
let(:zentao_product_xid) { '3' }
let(:zentao_integration) { create(:zentao_integration) }
describe '#create' do
let(:project) { create(:project, :repository) }
let(:params) do
{
project: project,
url: url,
api_url: api_url,
api_token: api_token,
zentao_product_xid: zentao_product_xid
}
end
it 'stores data in data_fields correctly' do
tracker_data = described_class.create!(params).zentao_tracker_data
expect(tracker_data.url).to eq(url)
expect(tracker_data.api_url).to eq(api_url)
expect(tracker_data.api_token).to eq(api_token)
expect(tracker_data.zentao_product_xid).to eq(zentao_product_xid)
end
end
describe '#fields' do
it 'returns custom fields' do
expect(zentao_integration.fields.pluck(:name)).to eq(%w[url api_url api_token zentao_product_xid])
end
end
describe '#test' do
let(:test_response) { { success: true } }
before do
allow_next_instance_of(Gitlab::Zentao::Client) do |client|
allow(client).to receive(:ping).and_return(test_response)
end
end
it 'gets response from Gitlab::Zentao::Client#ping' do
expect(zentao_integration.test).to eq(test_response)
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Integrations::ZentaoTrackerData do
describe 'factory available' do
let(:zentao_tracker_data) { create(:zentao_tracker_data) }
it { expect(zentao_tracker_data.valid?).to eq true }
end
describe 'associations' do
it { is_expected.to belong_to(:integration) }
end
describe 'encrypted attributes' do
subject { described_class.encrypted_attributes.keys }
it { is_expected.to contain_exactly(:url, :api_url, :zentao_product_xid, :api_token) }
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