Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
cd85f3f68f
commit
a0429b995e
|
|
@ -451,7 +451,7 @@
|
|||
.os1-services:
|
||||
services:
|
||||
- !reference [.zoekt-services, services]
|
||||
- name: opensearchproject/opensearch:1.3.5
|
||||
- name: opensearchproject/opensearch:1.3.18
|
||||
alias: elasticsearch
|
||||
command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true", "-E", "cluster.routing.allocation.disk.threshold_enabled=false"]
|
||||
|
||||
|
|
@ -490,7 +490,7 @@
|
|||
.os2-services:
|
||||
services:
|
||||
- !reference [.zoekt-services, services]
|
||||
- name: opensearchproject/opensearch:2.2.1
|
||||
- name: opensearchproject/opensearch:2.15.0
|
||||
alias: elasticsearch
|
||||
command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true", "-E", "cluster.routing.allocation.disk.threshold_enabled=false"]
|
||||
|
||||
|
|
|
|||
|
|
@ -387,6 +387,17 @@ rspec-ee unit clickhouse:
|
|||
- .rspec-base-pg14-clickhouse23
|
||||
- .rails:rules:ee-only-clickhouse-changes
|
||||
|
||||
rspec ci-config-validation:
|
||||
extends:
|
||||
- .rspec-base-pg14
|
||||
- .rails:rules:rspec-ci-config-validation
|
||||
stage: test
|
||||
script:
|
||||
- !reference [.base-script, script]
|
||||
- rspec_section rspec_simple_job "--tag ci_config_validation -- spec/dot_gitlab_ci/"
|
||||
after_script:
|
||||
- echo 'OK' # override after_script from .rspec-base
|
||||
|
||||
gitlab:clickhouse:rollback:main:
|
||||
extends:
|
||||
- .rspec-base
|
||||
|
|
|
|||
|
|
@ -135,6 +135,9 @@
|
|||
.if-merge-request-labels-run-without-gitaly-transactions: &if-merge-request-labels-run-without-gitaly-transactions
|
||||
if: '($CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_EVENT_TYPE != "merge_train") && $CI_MERGE_REQUEST_LABELS =~ /run-without-gitaly-transactions/'
|
||||
|
||||
.if-merge-request-labels-skip-ci-validation: &if-merge-request-labels-skip-ci-validation
|
||||
if: '($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached") && $CI_MERGE_REQUEST_LABELS =~ /pipeline:skip-ci-validation/'
|
||||
|
||||
.if-security-merge-request: &if-security-merge-request
|
||||
if: '($CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_EVENT_TYPE != "merge_train") && $CI_PROJECT_NAMESPACE == "gitlab-org/security"'
|
||||
|
||||
|
|
@ -2370,6 +2373,15 @@
|
|||
- !reference ['.rails:rules:ee-and-foss-integration', rules]
|
||||
- !reference ['.rails:rules:ee-and-foss-migration', rules]
|
||||
|
||||
.rails:rules:rspec-ci-config-validation:
|
||||
rules:
|
||||
- <<: *if-merge-request-labels-skip-ci-validation
|
||||
when: never
|
||||
- <<: *if-merge-request
|
||||
changes:
|
||||
- "{,jh/}.gitlab-ci.yml"
|
||||
- "{,jh/}.gitlab/ci/**/*"
|
||||
|
||||
.rails:rules:detect-tests:
|
||||
rules:
|
||||
- if: '$ENABLE_DETECT_TESTS == "true"'
|
||||
|
|
|
|||
|
|
@ -43,6 +43,10 @@ include:
|
|||
inputs:
|
||||
gem_name: "diff_match_patch"
|
||||
gem_path_prefix: "vendor/gems/"
|
||||
- local: .gitlab/ci/templates/gem.gitlab-ci.yml
|
||||
inputs:
|
||||
gem_name: "gitlab-topology-service-client"
|
||||
gem_path_prefix: "vendor/gems/"
|
||||
- local: .gitlab/ci/templates/gem.gitlab-ci.yml
|
||||
inputs:
|
||||
gem_name: "sidekiq-7.1.6"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
67840bedbf1fda223cbb9ebae021db71c31b69aa
|
||||
a46a38047c60514d83aaa4713ba3e9f2ee626a87
|
||||
|
|
|
|||
5
Gemfile
5
Gemfile
|
|
@ -152,6 +152,11 @@ gem 'graphiql-rails', '~> 1.10', feature_category: :api
|
|||
gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api
|
||||
gem 'graphlient', '~> 0.8.0', feature_category: :importers # Used by BulkImport feature (group::import)
|
||||
|
||||
# Cells
|
||||
gem 'gitlab-topology-service-client', '~> 0.1',
|
||||
path: 'vendor/gems/gitlab-topology-service-client',
|
||||
feature_category: :cell
|
||||
|
||||
# Generate Fake data
|
||||
gem 'ffaker', '~> 2.23' # rubocop:todo Gemfile/MissingFeatureCategory
|
||||
|
||||
|
|
|
|||
|
|
@ -143,6 +143,12 @@ PATH
|
|||
specs:
|
||||
diff_match_patch (0.1.0)
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/gitlab-topology-service-client
|
||||
specs:
|
||||
gitlab-topology-service-client (0.1)
|
||||
grpc
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/mail-smtp_pool
|
||||
specs:
|
||||
|
|
@ -2038,6 +2044,7 @@ DEPENDENCIES
|
|||
gitlab-secret_detection!
|
||||
gitlab-sidekiq-fetcher!
|
||||
gitlab-styles (~> 12.0.1)
|
||||
gitlab-topology-service-client (~> 0.1)!
|
||||
gitlab-utils!
|
||||
gitlab_chronic_duration (~> 0.12)
|
||||
gitlab_omniauth-ldap (~> 2.2.0)
|
||||
|
|
|
|||
|
|
@ -161,6 +161,8 @@ export default {
|
|||
this.infiniteScrollingTriggered = false;
|
||||
this.filterSearchTriggered = true;
|
||||
|
||||
this.resetRequestData();
|
||||
|
||||
filters.forEach((filter) => {
|
||||
if (!filter.type) {
|
||||
if (this.glFeatures.populateAndUseBuildNamesTable) {
|
||||
|
|
@ -178,12 +180,6 @@ export default {
|
|||
}
|
||||
});
|
||||
|
||||
// all filters have been cleared reset query params
|
||||
// and refetch jobs/count with defaults
|
||||
if (!filters.length) {
|
||||
this.resetRequestData();
|
||||
}
|
||||
|
||||
this.$apollo.queries.jobs.refetch(this.requestData);
|
||||
this.updateHistoryAndFetchCount();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,11 +1,3 @@
|
|||
import initIntegrationSettingsForm from '~/integrations/edit';
|
||||
import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics';
|
||||
|
||||
initIntegrationSettingsForm();
|
||||
|
||||
const prometheusSettingsSelector = '.js-prometheus-metrics-monitoring';
|
||||
const prometheusSettingsWrapper = document.querySelector(prometheusSettingsSelector);
|
||||
if (prometheusSettingsWrapper) {
|
||||
const prometheusMetrics = new PrometheusMetrics(prometheusSettingsSelector);
|
||||
prometheusMetrics.loadActiveMetrics();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,3 @@
|
|||
import initIntegrationSettingsForm from '~/integrations/edit';
|
||||
import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics';
|
||||
|
||||
initIntegrationSettingsForm();
|
||||
|
||||
const prometheusSettingsSelector = '.js-prometheus-metrics-monitoring';
|
||||
const prometheusSettingsWrapper = document.querySelector(prometheusSettingsSelector);
|
||||
if (prometheusSettingsWrapper) {
|
||||
const prometheusMetrics = new PrometheusMetrics(prometheusSettingsSelector);
|
||||
prometheusMetrics.loadActiveMetrics();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,3 @@
|
|||
import initIntegrationSettingsForm from '~/integrations/edit';
|
||||
import CustomMetrics from '~/prometheus_metrics/custom_metrics';
|
||||
|
||||
initIntegrationSettingsForm();
|
||||
|
||||
const prometheusSettingsSelector = '.js-prometheus-metrics-monitoring';
|
||||
const prometheusSettingsWrapper = document.querySelector(prometheusSettingsSelector);
|
||||
if (prometheusSettingsWrapper) {
|
||||
const customMetrics = new CustomMetrics(prometheusSettingsSelector);
|
||||
customMetrics.init();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
export default {
|
||||
EMPTY: 'empty',
|
||||
LOADING: 'loading',
|
||||
LIST: 'list',
|
||||
NO_INTEGRATION: 'no-integration',
|
||||
};
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
import $ from 'jquery';
|
||||
import { escape, sortBy } from 'lodash';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
|
||||
import { s__ } from '~/locale';
|
||||
import PANEL_STATE from './constants';
|
||||
import PrometheusMetrics from './prometheus_metrics';
|
||||
|
||||
export default class CustomMetrics extends PrometheusMetrics {
|
||||
constructor(wrapperSelector) {
|
||||
super(wrapperSelector);
|
||||
this.customMetrics = [];
|
||||
this.environmentsData = [];
|
||||
this.$els = [];
|
||||
|
||||
this.$wrapperCustomMetrics = $(wrapperSelector);
|
||||
|
||||
this.$monitoredCustomMetricsPanel = this.$wrapperCustomMetrics.find(
|
||||
'.js-panel-custom-monitored-metrics',
|
||||
);
|
||||
this.$monitoredCustomMetricsCount = this.$monitoredCustomMetricsPanel.find(
|
||||
'.js-custom-monitored-count',
|
||||
);
|
||||
this.$monitoredCustomMetricsLoading = this.$monitoredCustomMetricsPanel.find(
|
||||
'.js-loading-custom-metrics',
|
||||
);
|
||||
this.$monitoredCustomMetricsEmpty = this.$monitoredCustomMetricsPanel.find(
|
||||
'.js-empty-custom-metrics',
|
||||
);
|
||||
this.$monitoredCustomMetricsList =
|
||||
this.$monitoredCustomMetricsPanel.find('.js-custom-metrics-list');
|
||||
this.$monitoredCustomMetricsNoIntegrationText = this.$monitoredCustomMetricsPanel.find(
|
||||
'.js-no-active-integration-text',
|
||||
);
|
||||
this.$newCustomMetricButton = this.$monitoredCustomMetricsPanel.find('.js-new-metric-button');
|
||||
this.$newCustomMetricText = this.$monitoredCustomMetricsPanel.find('.js-new-metric-text');
|
||||
this.$flashCustomMetricsContainer = this.$wrapperCustomMetrics.find('.flash-container');
|
||||
|
||||
this.$els = [
|
||||
this.$monitoredCustomMetricsLoading,
|
||||
this.$monitoredCustomMetricsList,
|
||||
this.$newCustomMetricButton,
|
||||
this.$newCustomMetricText,
|
||||
this.$monitoredCustomMetricsNoIntegrationText,
|
||||
this.$monitoredCustomMetricsEmpty,
|
||||
];
|
||||
|
||||
this.activeCustomMetricsEndpoint =
|
||||
this.$monitoredCustomMetricsPanel.data('active-custom-metrics');
|
||||
this.environmentsDataEndpoint = this.$monitoredCustomMetricsPanel.data(
|
||||
'environments-data-endpoint',
|
||||
);
|
||||
this.isServiceActive = this.$monitoredCustomMetricsPanel.data('service-active');
|
||||
}
|
||||
|
||||
init() {
|
||||
if (this.isServiceActive) {
|
||||
this.loadActiveCustomMetrics();
|
||||
} else {
|
||||
this.setNoIntegrationActiveState();
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
setHidden(els) {
|
||||
els.forEach((el) => el.addClass('hidden'));
|
||||
}
|
||||
|
||||
setVisible(...els) {
|
||||
this.setHidden(this.$els.filter((el) => !els.includes(el)));
|
||||
els.forEach((el) => el.removeClass('hidden'));
|
||||
}
|
||||
|
||||
showMonitoringCustomMetricsPanelState(stateName) {
|
||||
switch (stateName) {
|
||||
case PANEL_STATE.LOADING:
|
||||
this.setVisible(this.$monitoredCustomMetricsLoading);
|
||||
break;
|
||||
case PANEL_STATE.LIST:
|
||||
this.setVisible(this.$newCustomMetricButton, this.$monitoredCustomMetricsList);
|
||||
break;
|
||||
case PANEL_STATE.NO_INTEGRATION:
|
||||
this.setVisible(
|
||||
this.$monitoredCustomMetricsNoIntegrationText,
|
||||
this.$monitoredCustomMetricsEmpty,
|
||||
);
|
||||
break;
|
||||
default:
|
||||
this.setVisible(
|
||||
this.$monitoredCustomMetricsEmpty,
|
||||
this.$newCustomMetricButton,
|
||||
this.$newCustomMetricText,
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
populateCustomMetrics() {
|
||||
const capitalizeGroup = (metric) => ({
|
||||
...metric,
|
||||
group: capitalizeFirstCharacter(metric.group),
|
||||
});
|
||||
|
||||
const sortedMetrics = sortBy(this.customMetrics.map(capitalizeGroup), ['group', 'title']);
|
||||
|
||||
sortedMetrics.forEach((metric) => {
|
||||
this.$monitoredCustomMetricsList.append(CustomMetrics.customMetricTemplate(metric));
|
||||
});
|
||||
|
||||
this.$monitoredCustomMetricsCount.text(this.customMetrics.length);
|
||||
this.showMonitoringCustomMetricsPanelState(PANEL_STATE.LIST);
|
||||
if (!this.environmentsData) {
|
||||
this.showFlashMessage(
|
||||
s__(
|
||||
'PrometheusService|These metrics will only be monitored after your first deployment to an environment',
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
showFlashMessage(message) {
|
||||
this.$flashCustomMetricsContainer.removeClass('hidden');
|
||||
this.$flashCustomMetricsContainer.find('.flash-text').text(message);
|
||||
}
|
||||
|
||||
setNoIntegrationActiveState() {
|
||||
this.showMonitoringCustomMetricsPanelState(PANEL_STATE.NO_INTEGRATION);
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
}
|
||||
|
||||
loadActiveCustomMetrics() {
|
||||
super.loadActiveMetrics();
|
||||
Promise.all([
|
||||
axios.get(this.activeCustomMetricsEndpoint),
|
||||
axios.get(this.environmentsDataEndpoint),
|
||||
])
|
||||
.then(([customMetrics, environmentsData]) => {
|
||||
this.environmentsData = environmentsData.data.environments;
|
||||
if (!customMetrics.data || !customMetrics.data.metrics) {
|
||||
this.showMonitoringCustomMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
} else {
|
||||
this.customMetrics = customMetrics.data.metrics;
|
||||
this.populateCustomMetrics(customMetrics.data.metrics);
|
||||
}
|
||||
})
|
||||
.catch((customMetricError) => {
|
||||
this.showFlashMessage(customMetricError);
|
||||
this.showMonitoringCustomMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
});
|
||||
}
|
||||
|
||||
static customMetricTemplate(metric) {
|
||||
return `
|
||||
<li class="custom-metric">
|
||||
<a href="${escape(metric.edit_path)}" class="custom-metric-link-bold">
|
||||
${escape(metric.group)} / ${escape(metric.title)} (${escape(metric.unit)})
|
||||
</a>
|
||||
</li>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,151 +0,0 @@
|
|||
import $ from 'jquery';
|
||||
import { escape } from 'lodash';
|
||||
import { s__, n__, sprintf } from '~/locale';
|
||||
import axios from '../lib/utils/axios_utils';
|
||||
import { backOff } from '../lib/utils/common_utils';
|
||||
import PANEL_STATE from './constants';
|
||||
|
||||
export default class PrometheusMetrics {
|
||||
constructor(wrapperSelector) {
|
||||
this.backOffRequestCounter = 0;
|
||||
|
||||
this.$wrapper = $(wrapperSelector);
|
||||
|
||||
this.$monitoredMetricsPanel = this.$wrapper.find('.js-panel-monitored-metrics');
|
||||
this.$monitoredMetricsCount = this.$monitoredMetricsPanel.find('.js-monitored-count');
|
||||
this.$monitoredMetricsLoading = this.$monitoredMetricsPanel.find('.js-loading-metrics');
|
||||
this.$monitoredMetricsEmpty = this.$monitoredMetricsPanel.find('.js-empty-metrics');
|
||||
this.$monitoredMetricsList = this.$monitoredMetricsPanel.find('.js-metrics-list');
|
||||
|
||||
this.$missingEnvVarPanel = this.$wrapper.find('.js-panel-missing-env-vars');
|
||||
this.$panelToggleRight = this.$missingEnvVarPanel.find('.js-panel-toggle-right');
|
||||
this.$panelToggleDown = this.$missingEnvVarPanel.find('.js-panel-toggle-down');
|
||||
this.$missingEnvVarMetricCount = this.$missingEnvVarPanel.find('.js-env-var-count');
|
||||
this.$missingEnvVarMetricsList = this.$missingEnvVarPanel.find('.js-missing-var-metrics-list');
|
||||
|
||||
this.activeMetricsEndpoint = this.$monitoredMetricsPanel.data('activeMetrics');
|
||||
this.helpMetricsPath = this.$monitoredMetricsPanel.data('metrics-help-path');
|
||||
|
||||
this.$panelToggleRight.on('click', (e) => this.handlePanelToggle(e));
|
||||
this.$panelToggleDown.on('click', (e) => this.handlePanelToggle(e));
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadActiveMetrics();
|
||||
}
|
||||
|
||||
handlePanelToggle(e) {
|
||||
const $toggleBtn = $(e.currentTarget);
|
||||
const $currentPanelBody = $toggleBtn.closest('.card').find('.card-body');
|
||||
$currentPanelBody.toggleClass('hidden');
|
||||
if ($toggleBtn.hasClass('js-panel-toggle-right')) {
|
||||
$toggleBtn.addClass('hidden');
|
||||
this.$panelToggleDown.removeClass('hidden');
|
||||
} else if ($toggleBtn.hasClass('js-panel-toggle-down')) {
|
||||
$toggleBtn.addClass('hidden');
|
||||
this.$panelToggleRight.removeClass('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
showMonitoringMetricsPanelState(stateName) {
|
||||
switch (stateName) {
|
||||
case PANEL_STATE.LOADING:
|
||||
this.$monitoredMetricsLoading.removeClass('hidden');
|
||||
this.$monitoredMetricsEmpty.addClass('hidden');
|
||||
this.$monitoredMetricsList.addClass('hidden');
|
||||
break;
|
||||
case PANEL_STATE.LIST:
|
||||
this.$monitoredMetricsLoading.addClass('hidden');
|
||||
this.$monitoredMetricsEmpty.addClass('hidden');
|
||||
this.$monitoredMetricsList.removeClass('hidden');
|
||||
break;
|
||||
default:
|
||||
this.$monitoredMetricsLoading.addClass('hidden');
|
||||
this.$monitoredMetricsEmpty.removeClass('hidden');
|
||||
this.$monitoredMetricsList.addClass('hidden');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
populateActiveMetrics(metrics) {
|
||||
let totalMonitoredMetrics = 0;
|
||||
let totalMissingEnvVarMetrics = 0;
|
||||
let totalExporters = 0;
|
||||
|
||||
metrics.forEach((metric) => {
|
||||
if (metric.active_metrics > 0) {
|
||||
totalExporters += 1;
|
||||
this.$monitoredMetricsList.append(
|
||||
`<li>${escape(metric.group)}<span class="badge">${escape(
|
||||
metric.active_metrics,
|
||||
)}</span></li>`,
|
||||
);
|
||||
totalMonitoredMetrics += metric.active_metrics;
|
||||
if (metric.metrics_missing_requirements > 0) {
|
||||
this.$missingEnvVarMetricsList.append(`<li>${escape(metric.group)}</li>`);
|
||||
totalMissingEnvVarMetrics += 1;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (totalMonitoredMetrics === 0) {
|
||||
const emptyCommonMetricsText = sprintf(
|
||||
s__('PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were found'),
|
||||
{
|
||||
docsUrlStart: `<a href="${this.helpMetricsPath}">`,
|
||||
docsUrlEnd: '</a>',
|
||||
},
|
||||
false,
|
||||
);
|
||||
this.$monitoredMetricsEmpty.empty();
|
||||
this.$monitoredMetricsEmpty.append(`<p class="text-tertiary">${emptyCommonMetricsText}</p>`);
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
} else {
|
||||
const metricsCountText = sprintf(
|
||||
s__('PrometheusService|%{exporters} with %{metrics} were found'),
|
||||
{
|
||||
exporters: n__('%d exporter', '%d exporters', totalExporters),
|
||||
metrics: n__('%d metric', '%d metrics', totalMonitoredMetrics),
|
||||
},
|
||||
);
|
||||
this.$monitoredMetricsCount.text(metricsCountText);
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.LIST);
|
||||
|
||||
if (totalMissingEnvVarMetrics > 0) {
|
||||
this.$missingEnvVarPanel.removeClass('hidden');
|
||||
this.$missingEnvVarMetricCount.text(totalMissingEnvVarMetrics);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadActiveMetrics() {
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.LOADING);
|
||||
backOff((next, stop) => {
|
||||
axios
|
||||
.get(this.activeMetricsEndpoint)
|
||||
.then(({ data }) => {
|
||||
if (data && data.success) {
|
||||
stop(data);
|
||||
} else {
|
||||
this.backOffRequestCounter += 1;
|
||||
if (this.backOffRequestCounter < 3) {
|
||||
next();
|
||||
} else {
|
||||
stop(data);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(stop);
|
||||
})
|
||||
.then((res) => {
|
||||
if (res && res.data && res.data.length) {
|
||||
this.populateActiveMetrics(res.data);
|
||||
} else {
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
|
||||
.header-content {
|
||||
a {
|
||||
color: var(--gl-text-color-heading);
|
||||
color: var(--gl-text-color-default);
|
||||
|
||||
&:hover {
|
||||
color: var(--blue-600, $blue-600);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
&:hover {
|
||||
a {
|
||||
color: var(--black, $black);
|
||||
color: var(--gl-text-color-default);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -48,13 +48,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
.wiki-list-expand-button,
|
||||
.wiki-list-collapse-button {
|
||||
color: $gray-400;
|
||||
position: absolute;
|
||||
right: $gl-spacing-scale-2;
|
||||
}
|
||||
|
||||
ul.wiki-pages,
|
||||
ul.wiki-pages li {
|
||||
list-style: none;
|
||||
|
|
@ -68,10 +61,6 @@
|
|||
}
|
||||
|
||||
ul.wiki-pages-list.content-list {
|
||||
a {
|
||||
color: var(--blue-600, $blue-600);
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
margin-left: 0;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ module Groups
|
|||
private
|
||||
|
||||
def namespace_work_items_enabled?
|
||||
group&.namespace_work_items_enabled?
|
||||
group&.namespace_work_items_enabled?(current_user)
|
||||
end
|
||||
|
||||
def show_params
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ class GroupsController < Groups::ApplicationController
|
|||
push_force_frontend_feature_flag(:work_items_alpha, group.work_items_alpha_feature_flag_enabled?)
|
||||
push_frontend_feature_flag(:issues_grid_view)
|
||||
push_frontend_feature_flag(:group_multi_select_tokens, group)
|
||||
push_force_frontend_feature_flag(:namespace_level_work_items, group.namespace_work_items_enabled?)
|
||||
push_force_frontend_feature_flag(:namespace_level_work_items, group.namespace_work_items_enabled?(current_user))
|
||||
end
|
||||
|
||||
before_action only: :merge_requests do
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ module WorkItems
|
|||
end
|
||||
|
||||
def include_namespace_level_work_items?
|
||||
params.group? && params.group.namespace_work_items_enabled?
|
||||
params.group? && params.group.namespace_work_items_enabled?(current_user)
|
||||
end
|
||||
|
||||
def include_descendants?
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ module Resolvers
|
|||
argument :iid, GraphQL::Types::String, required: true, description: 'IID of the work item.'
|
||||
|
||||
def ready?(**args)
|
||||
return false if resource_parent.is_a?(Group) && !resource_parent.namespace_work_items_enabled?
|
||||
return false if resource_parent.is_a?(Group) && !resource_parent.namespace_work_items_enabled?(current_user)
|
||||
|
||||
super
|
||||
end
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ module Resolvers
|
|||
description: 'Include work items from descendant groups and projects.'
|
||||
|
||||
def ready?(**args)
|
||||
super && resource_parent.namespace_work_items_enabled?
|
||||
super && resource_parent.namespace_work_items_enabled?(current_user)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -952,7 +952,7 @@ class Group < Namespace
|
|||
end
|
||||
|
||||
# Note: this method is overridden in EE to check the work_item_epics feature flag which also enables this feature
|
||||
def namespace_work_items_enabled?
|
||||
def namespace_work_items_enabled?(_user = nil)
|
||||
::Feature.enabled?(:namespace_level_work_items, self, type: :development)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@
|
|||
module Packages
|
||||
module Protection
|
||||
class Rule < ApplicationRecord
|
||||
include IgnorableColumns
|
||||
|
||||
enum package_type: Packages::Package.package_types.slice(:npm)
|
||||
enum minimum_access_level_for_push:
|
||||
Gitlab::Access.sym_options_with_admin.slice(:maintainer, :owner, :admin),
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ module Groups
|
|||
finder_params[:issue_types] = issue_types if issue_types.present?
|
||||
|
||||
finder_class =
|
||||
if group.namespace_work_items_enabled?
|
||||
if group.namespace_work_items_enabled?(current_user)
|
||||
finder_params[:include_descendants] = true
|
||||
WorkItems::WorkItemsFinder
|
||||
else
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@
|
|||
= f.label field_name, "#{type.upcase} SSH keys", class: 'label-bold'
|
||||
= f.select field_name, key_restriction_options_for_select(type), {}, class: 'form-control'
|
||||
|
||||
= render_if_exists 'admin/application_settings/disable_personal_access_tokens', form: f
|
||||
|
||||
.form-group
|
||||
%label.label-bold= s_('AdminSettings|Feed token')
|
||||
= f.gitlab_ui_checkbox_component :disable_feed_token, s_('AdminSettings|Disable feed token')
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@
|
|||
.gl-flex.gl-place-content-between.gl-items-center.gl-pb-3.gl-pr-1{ class: (@sidebar_page ? 'js-wiki-expand-pages-list wiki-list collapsed gl-pl-0' : 'gl-pl-3') }
|
||||
.gl-flex.gl-items-center
|
||||
- if @sidebar_page
|
||||
= render Pajamas::ButtonComponent.new(category: :tertiary, size: :small, icon: 'chevron-right', button_options: { class: "js-wiki-list-expand-button wiki-list-expand-button !gl-static gl-mr-2", data: { testid: 'expand-pages-list' } })
|
||||
= render Pajamas::ButtonComponent.new(category: :tertiary, size: :small, icon: 'chevron-down', button_options: { class: "js-wiki-list-collapse-button wiki-list-collapse-button !gl-static gl-mr-2", data: { testid: 'expand-pages-list' } })
|
||||
= render Pajamas::ButtonComponent.new(category: :tertiary, size: :small, icon: 'chevron-right', button_options: { class: "js-wiki-list-expand-button wiki-list-expand-button gl-mr-2", data: { testid: 'expand-pages-list' } })
|
||||
= render Pajamas::ButtonComponent.new(category: :tertiary, size: :small, icon: 'chevron-down', button_options: { class: "js-wiki-list-collapse-button wiki-list-collapse-button gl-mr-2", data: { testid: 'expand-pages-list' } })
|
||||
%h2.gl-text-lg.gl-my-0.gl-mr-3= s_('Wiki|Pages')
|
||||
= gl_badge_tag @wiki_pages_count
|
||||
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ The following metrics are available:
|
|||
| `gitlab_connection_pool_size` | Gauge | 16.7 | Size of connection pool | |
|
||||
| `gitlab_connection_pool_available_count` | Gauge | 16.7 | Number of available connections in the pool | |
|
||||
| `gitlab_security_policies_scan_result_process_duration_seconds` | Histogram | 16.7 | The amount of time to process merge request approval policies | |
|
||||
| `gitlab_security_policies_scan_execution_configuration_rendering_seconds` | Histogram | 17.3 | The amount of time to render scan execution policy CI configurations | |
|
||||
| `gitlab_highlight_usage` | Counter | 16.8 | The number of times `Gitlab::Highlight` is used | `used_on` |
|
||||
| `dependency_linker_usage` | Counter | 16.8 | The number of times dependency linker is used | `used_on` |
|
||||
| `gitlab_keeparound_refs_requested_total` | Counter | 16.10 | Counts the number of keep-around refs requested to be created | `source` |
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
redirect_to: 'api_resources.md'
|
||||
remove_date: '2024-07-24'
|
||||
---
|
||||
|
||||
This document was moved to [another location](api_resources.md).
|
||||
|
||||
<!-- This redirect file can be deleted after <2024-07-24>. -->
|
||||
<!-- Redirects that point to other docs in the same project expire in three months. -->
|
||||
<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
|
||||
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
---
|
||||
redirect_to: '../administration/operations/moving_repositories.md'
|
||||
stage: Systems
|
||||
group: Distribution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
remove_date: '2024-07-16'
|
||||
---
|
||||
|
||||
# List repository directories Rake task (removed)
|
||||
|
||||
DETAILS:
|
||||
**Tier:** Free, Premium, Ultimate
|
||||
**Offering:** Self-managed
|
||||
|
||||
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137592) in GitLab 16.7
|
||||
and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/384361) in 17.0.
|
||||
See how to [move repositories](../administration/operations/moving_repositories.md) instead.
|
||||
|
|
@ -79,7 +79,11 @@ which must be paid at your next [reconciliation](../quarterly_reconciliation.md)
|
|||
|
||||
A top-level group can be [changed](../../user/group/manage.md#change-a-groups-path) like any other group.
|
||||
|
||||
Every user is included in seat usage, with the following exceptions:
|
||||
### Billable users
|
||||
|
||||
Billable users count toward the number of subscription seats purchased in your subscription.
|
||||
|
||||
A user is not counted as a billable user if:
|
||||
|
||||
- Users who are pending approval.
|
||||
- Members with the [Guest role on an Ultimate subscription](#free-guest-users).
|
||||
|
|
|
|||
|
|
@ -186,4 +186,4 @@ flawfinder-sast:
|
|||
|
||||
## Semgrep slowness, unexpected results, or other errors
|
||||
|
||||
If Semgrep is slow, reports too many false positives or false negatives, crashes, fails, or is otherwise broken, see the Semgrep docs for [troubleshooting GitLab SAST](https://semgrep.dev/docs/troubleshooting/semgrep-ci#troubleshooting-gitlab-sast).
|
||||
If Semgrep is slow, reports too many false positives or false negatives, crashes, fails, or is otherwise broken, see the Semgrep docs for [troubleshooting GitLab SAST](https://semgrep.dev/docs/troubleshooting/semgrep-app#troubleshooting-gitlab-sast).
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
redirect_to: '../gitops.md'
|
||||
remove_date: '2024-07-25'
|
||||
---
|
||||
|
||||
This document was moved to [another location](../gitops.md).
|
||||
|
||||
<!-- This redirect file can be deleted after <2024-07-25>. -->
|
||||
<!-- Redirects that point to other docs in the same project expire in three months. -->
|
||||
<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
|
||||
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
redirect_to: '../gitops.md'
|
||||
remove_date: '2024-07-25'
|
||||
---
|
||||
|
||||
This document was moved to [another location](../gitops.md).
|
||||
|
||||
<!-- This redirect file can be deleted after <2024-07-25>. -->
|
||||
<!-- Redirects that point to other docs in the same project expire in three months. -->
|
||||
<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
|
||||
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
redirect_to: '../../../clusters/agent/gitops.md'
|
||||
remove_date: '2024-07-25'
|
||||
---
|
||||
|
||||
This document was moved to [another location](../../../clusters/agent/gitops.md).
|
||||
|
||||
<!-- This redirect file can be deleted after <2024-07-25>. -->
|
||||
<!-- Redirects that point to other docs in the same project expire in three months. -->
|
||||
<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
|
||||
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
|
||||
|
|
@ -97,6 +97,14 @@ Prerequisites:
|
|||
|
||||
In GitLab 15.7 and later, you can [use the application settings API to disable personal access tokens](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
|
||||
|
||||
In GitLab 17.3 and later, you can disable personal access tokens in the Admin UI:
|
||||
|
||||
1. On the left sidebar, at the bottom, select **Admin**.
|
||||
1. Select **Settings > General**.
|
||||
1. Expand **Visibility and access controls**.
|
||||
1. Select the **Disable personal access tokens** checkbox.
|
||||
1. Select **Save changes**.
|
||||
|
||||
### Disable personal access tokens for enterprise users
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/369504) in GitLab 16.11 [with a flag](../../administration/feature_flags.md) named `enterprise_disable_personal_access_tokens`. Disabled by default.
|
||||
|
|
|
|||
10
lefthook.yml
10
lefthook.yml
|
|
@ -129,11 +129,6 @@ pre-push:
|
|||
tags: secrets
|
||||
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
||||
run: 'if command -v gitleaks > /dev/null 2>&1; then gitleaks detect --log-opts="$(git merge-base origin/master HEAD)..HEAD" --no-banner --redact --verbose; else echo "WARNING: gitleaks is not installed. Please install it. See https://github.com/zricethezav/gitleaks#installing."; fi'
|
||||
reminder-to-validate-ci-config:
|
||||
tags: ci config
|
||||
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
||||
glob: '{.gitlab-ci.yml,.gitlab/**/*.yml}'
|
||||
run: "echo '🚨WARNING: You are modifying ci pipeline configurations. Please test your changes by running `bundle exec rspec spec/dot_gitlab_ci/job_dependency_spec.rb`. If you think we are missing test coverage for your changes, please add them.'"
|
||||
|
||||
scripts:
|
||||
'merge_conflicts':
|
||||
|
|
@ -161,11 +156,6 @@ pre-commit:
|
|||
tags: secrets
|
||||
files: git diff --name-only --diff-filter=d --staged
|
||||
run: 'if command -v gitleaks > /dev/null 2>&1; then gitleaks protect --no-banner --staged --redact --verbose; else echo "WARNING: gitleaks is not installed. Please install it. See https://github.com/zricethezav/gitleaks#installing."; fi'
|
||||
reminder-to-validate-ci-config:
|
||||
tags: ci config
|
||||
files: git diff --name-only --diff-filter=d --staged
|
||||
glob: '{.gitlab-ci.yml,.gitlab/**/*.yml}'
|
||||
run: "echo '🚨WARNING: You are modifying ci pipeline configurations. Please test your changes by running `bundle exec rspec spec/dot_gitlab_ci/job_dependency_spec.rb`. If you think we are missing test coverage for your changes, please add them.'"
|
||||
|
||||
auto-fix:
|
||||
parallel: true
|
||||
|
|
|
|||
|
|
@ -260,11 +260,6 @@ msgid_plural "%d epics"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
msgid "%d exporter"
|
||||
msgid_plural "%d exporters"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
msgid "%d failed security job"
|
||||
msgid_plural "%d failed security jobs"
|
||||
msgstr[0] ""
|
||||
|
|
@ -350,11 +345,6 @@ msgid_plural "%d merge requests"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
msgid "%d metric"
|
||||
msgid_plural "%d metrics"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
msgid "%d milestone"
|
||||
msgid_plural "%d milestones"
|
||||
msgstr[0] ""
|
||||
|
|
@ -19064,6 +19054,9 @@ msgstr ""
|
|||
msgid "Disable group runners"
|
||||
msgstr ""
|
||||
|
||||
msgid "Disable personal access tokens"
|
||||
msgstr ""
|
||||
|
||||
msgid "Disable two-factor authentication"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -42449,9 +42442,6 @@ msgstr ""
|
|||
msgid "PrometheusAlerts|is less than"
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|%{exporters} with %{metrics} were found"
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|Active"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -42503,9 +42493,6 @@ msgstr ""
|
|||
msgid "PrometheusService|New metric"
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were found"
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -42524,9 +42511,6 @@ msgstr ""
|
|||
msgid "PrometheusService|The contents of the credentials.json file of your service account."
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
|
||||
msgstr ""
|
||||
|
||||
msgid "PrometheusService|To set up automatic monitoring, add the environment variable %{variable} to exporter's queries."
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@
|
|||
"@floating-ui/dom": "^1.2.9",
|
||||
"@gitlab/application-sdk-browser": "^0.3.2",
|
||||
"@gitlab/at.js": "1.5.7",
|
||||
"@gitlab/cluster-client": "^2.2.0",
|
||||
"@gitlab/cluster-client": "^2.2.1",
|
||||
"@gitlab/favicon-overlay": "2.0.0",
|
||||
"@gitlab/fonts": "^1.3.0",
|
||||
"@gitlab/svgs": "3.109.0",
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ RSpec.describe Groups::GroupMembersController, feature_category: :groups_and_pro
|
|||
|
||||
context 'when there are import source users available' do
|
||||
it 'returns import source users count' do
|
||||
create(:import_source_user, :pending_assignment, namespace: group)
|
||||
create(:import_source_user, :pending_reassignment, namespace: group)
|
||||
create(:import_source_user, :awaiting_approval, namespace: group)
|
||||
create(:import_source_user, :completed, namespace: group)
|
||||
|
||||
|
|
@ -105,7 +105,7 @@ RSpec.describe Groups::GroupMembersController, feature_category: :groups_and_pro
|
|||
it 'returns 0 counts' do
|
||||
stub_feature_flags(importer_user_mapping: false)
|
||||
|
||||
create(:import_source_user, :pending_assignment, namespace: group)
|
||||
create(:import_source_user, :pending_reassignment, namespace: group)
|
||||
|
||||
get :index, params: { group_id: group }
|
||||
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ require 'spec_helper'
|
|||
# See `with gitlab.com gitlab-org gitlab-foss project` context below for details.
|
||||
# If you think we are missing important test cases for a pipeline type, please add them following this exmaple.
|
||||
# ***********************************************************************************************************
|
||||
RSpec.describe 'ci jobs dependency', feature_category: :tooling,
|
||||
quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/34040#note_1991033499' do
|
||||
RSpec.describe 'ci jobs dependency', feature_category: :tooling do
|
||||
include ProjectForksHelper
|
||||
|
||||
def sync_local_files_to_project(project, user, branch_name, files:)
|
||||
|
|
@ -105,7 +104,7 @@ RSpec.describe 'ci jobs dependency', feature_category: :tooling,
|
|||
end
|
||||
|
||||
before do
|
||||
# delete once we have a migration to permenantly increase limit
|
||||
# delete once we have a migration to permanently increase limit
|
||||
stub_application_setting(max_yaml_size_bytes: 2.megabytes)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ FactoryBot.define do
|
|||
reassigned_by_user factory: :user
|
||||
end
|
||||
|
||||
trait :pending_assignment do
|
||||
trait :pending_reassignment do
|
||||
status { 0 }
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ FactoryBot.define do
|
|||
status { ::Members::MemberApproval.statuses[:pending] }
|
||||
member { association(:project_member, user: user) }
|
||||
member_namespace { association(:namespace) }
|
||||
member_role_id { nil }
|
||||
metadata { { access_level: new_access_level, member_role_id: member_role_id }.compact }
|
||||
|
||||
trait :for_new_member do
|
||||
member { nil }
|
||||
|
|
|
|||
|
|
@ -298,14 +298,9 @@ describe('Job table app', () => {
|
|||
|
||||
createComponent();
|
||||
|
||||
expect(successHandler).toHaveBeenCalledTimes(1);
|
||||
expect(countSuccessHandler).toHaveBeenCalledTimes(1);
|
||||
|
||||
await findFilteredSearch().vm.$emit('filterJobsBySearch', ['raw text']);
|
||||
|
||||
expect(createAlert).toHaveBeenCalledWith(expectedWarning);
|
||||
expect(successHandler).toHaveBeenCalledTimes(1);
|
||||
expect(countSuccessHandler).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('updates URL query string when filtering jobs by status', async () => {
|
||||
|
|
@ -369,10 +364,45 @@ describe('Job table app', () => {
|
|||
first: 30,
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: null,
|
||||
});
|
||||
expect(countSuccessHandler).toHaveBeenCalledWith({
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: null,
|
||||
});
|
||||
});
|
||||
|
||||
it('filters only by name after removing status filter', async () => {
|
||||
await findFilteredSearch().vm.$emit('filterJobsBySearch', [
|
||||
mockFailedSearchToken,
|
||||
mockJobName,
|
||||
]);
|
||||
|
||||
expect(successHandler).toHaveBeenCalledWith({
|
||||
first: 30,
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: 'FAILED',
|
||||
});
|
||||
expect(countSuccessHandler).toHaveBeenCalledWith({
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: 'FAILED',
|
||||
});
|
||||
|
||||
await findFilteredSearch().vm.$emit('filterJobsBySearch', [mockJobName]);
|
||||
|
||||
expect(successHandler).toHaveBeenCalledWith({
|
||||
first: 30,
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: null,
|
||||
});
|
||||
expect(countSuccessHandler).toHaveBeenCalledWith({
|
||||
fullPath: 'gitlab-org/gitlab',
|
||||
name: mockJobName,
|
||||
statuses: null,
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,116 +0,0 @@
|
|||
import MockAdapter from 'axios-mock-adapter';
|
||||
import prometheusIntegration from 'test_fixtures/integrations/prometheus/prometheus_integration.html';
|
||||
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
|
||||
import PANEL_STATE from '~/prometheus_metrics/constants';
|
||||
import CustomMetrics from '~/prometheus_metrics/custom_metrics';
|
||||
import { metrics1 as metrics } from './mock_data';
|
||||
|
||||
describe('PrometheusMetrics', () => {
|
||||
const customMetricsEndpoint =
|
||||
'http://test.host/frontend-fixtures/integrations-project/prometheus/metrics';
|
||||
let mock;
|
||||
|
||||
beforeEach(() => {
|
||||
mock = new MockAdapter(axios);
|
||||
mock.onGet(customMetricsEndpoint).reply(HTTP_STATUS_OK, {
|
||||
metrics,
|
||||
});
|
||||
setHTMLFixture(prometheusIntegration);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
mock.restore();
|
||||
resetHTMLFixture();
|
||||
});
|
||||
|
||||
describe('Custom Metrics', () => {
|
||||
let customMetrics;
|
||||
|
||||
beforeEach(() => {
|
||||
customMetrics = new CustomMetrics('.js-prometheus-metrics-monitoring');
|
||||
});
|
||||
|
||||
it('should initialize wrapper element refs on the class object', () => {
|
||||
expect(customMetrics.$wrapperCustomMetrics).not.toBeNull();
|
||||
expect(customMetrics.$monitoredCustomMetricsPanel).not.toBeNull();
|
||||
expect(customMetrics.$monitoredCustomMetricsCount).not.toBeNull();
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading).not.toBeNull();
|
||||
expect(customMetrics.$monitoredCustomMetricsEmpty).not.toBeNull();
|
||||
expect(customMetrics.$monitoredCustomMetricsList).not.toBeNull();
|
||||
expect(customMetrics.$newCustomMetricButton).not.toBeNull();
|
||||
expect(customMetrics.$flashCustomMetricsContainer).not.toBeNull();
|
||||
});
|
||||
|
||||
it('should contain api endpoints', () => {
|
||||
expect(customMetrics.activeCustomMetricsEndpoint).toEqual(customMetricsEndpoint);
|
||||
});
|
||||
|
||||
it('should show loading state when called with `loading`', () => {
|
||||
customMetrics.showMonitoringCustomMetricsPanelState(PANEL_STATE.LOADING);
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$monitoredCustomMetricsEmpty.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsList.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsNoIntegrationText.hasClass('hidden')).toBe(true);
|
||||
|
||||
expect(customMetrics.$newCustomMetricButton.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$newCustomMetricText.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('should show metrics list when called with `list`', () => {
|
||||
customMetrics.showMonitoringCustomMetricsPanelState(PANEL_STATE.LIST);
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsEmpty.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsList.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$monitoredCustomMetricsNoIntegrationText.hasClass('hidden')).toBe(true);
|
||||
|
||||
expect(customMetrics.$newCustomMetricButton.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$newCustomMetricText.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('should show empty state when called with `empty`', () => {
|
||||
customMetrics.showMonitoringCustomMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsEmpty.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$monitoredCustomMetricsList.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsNoIntegrationText.hasClass('hidden')).toBe(true);
|
||||
|
||||
expect(customMetrics.$newCustomMetricButton.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$newCustomMetricText.hasClass('hidden')).toEqual(false);
|
||||
});
|
||||
|
||||
it('should show monitored metrics list', () => {
|
||||
customMetrics.customMetrics = metrics;
|
||||
customMetrics.populateCustomMetrics();
|
||||
|
||||
const $metricsListLi = customMetrics.$monitoredCustomMetricsList.find('li');
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsList.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$monitoredCustomMetricsNoIntegrationText.hasClass('hidden')).toBe(true);
|
||||
|
||||
expect(customMetrics.$newCustomMetricButton.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$newCustomMetricText.hasClass('hidden')).toBe(true);
|
||||
|
||||
expect($metricsListLi.length).toEqual(metrics.length);
|
||||
});
|
||||
|
||||
it('should show the NO-INTEGRATION empty state', () => {
|
||||
customMetrics.setNoIntegrationActiveState();
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsEmpty.hasClass('hidden')).toEqual(false);
|
||||
expect(customMetrics.$monitoredCustomMetricsNoIntegrationText.hasClass('hidden')).toEqual(
|
||||
false,
|
||||
);
|
||||
|
||||
expect(customMetrics.$monitoredCustomMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$monitoredCustomMetricsList.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$newCustomMetricButton.hasClass('hidden')).toBe(true);
|
||||
expect(customMetrics.$newCustomMetricText.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
export const metrics1 = [
|
||||
{
|
||||
edit_path: '/root/prometheus-test/prometheus/metrics/3/edit',
|
||||
id: 3,
|
||||
title: 'Requests',
|
||||
group: 'Business',
|
||||
},
|
||||
{
|
||||
edit_path: '/root/prometheus-test/prometheus/metrics/2/edit',
|
||||
id: 2,
|
||||
title: 'Sales by the hour',
|
||||
group: 'Business',
|
||||
},
|
||||
{
|
||||
edit_path: '/root/prometheus-test/prometheus/metrics/1/edit',
|
||||
id: 1,
|
||||
title: 'Requests',
|
||||
group: 'Business',
|
||||
},
|
||||
];
|
||||
|
||||
export const metrics2 = [
|
||||
{
|
||||
group: 'Kubernetes',
|
||||
priority: 1,
|
||||
active_metrics: 4,
|
||||
metrics_missing_requirements: 0,
|
||||
},
|
||||
{
|
||||
group: 'HAProxy',
|
||||
priority: 2,
|
||||
active_metrics: 3,
|
||||
metrics_missing_requirements: 0,
|
||||
},
|
||||
{
|
||||
group: 'Apache',
|
||||
priority: 3,
|
||||
active_metrics: 5,
|
||||
metrics_missing_requirements: 0,
|
||||
},
|
||||
];
|
||||
|
||||
export const missingVarMetrics = [
|
||||
{
|
||||
group: 'Kubernetes',
|
||||
priority: 1,
|
||||
active_metrics: 4,
|
||||
metrics_missing_requirements: 0,
|
||||
},
|
||||
{
|
||||
group: 'HAProxy',
|
||||
priority: 2,
|
||||
active_metrics: 3,
|
||||
metrics_missing_requirements: 1,
|
||||
},
|
||||
{
|
||||
group: 'Apache',
|
||||
priority: 3,
|
||||
active_metrics: 5,
|
||||
metrics_missing_requirements: 3,
|
||||
},
|
||||
];
|
||||
|
|
@ -1,176 +0,0 @@
|
|||
import MockAdapter from 'axios-mock-adapter';
|
||||
import prometheusIntegration from 'test_fixtures/integrations/prometheus/prometheus_integration.html';
|
||||
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
|
||||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
|
||||
import PANEL_STATE from '~/prometheus_metrics/constants';
|
||||
import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics';
|
||||
import { metrics2 as metrics, missingVarMetrics } from './mock_data';
|
||||
|
||||
describe('PrometheusMetrics', () => {
|
||||
beforeEach(() => {
|
||||
setHTMLFixture(prometheusIntegration);
|
||||
});
|
||||
|
||||
describe('constructor', () => {
|
||||
let prometheusMetrics;
|
||||
|
||||
beforeEach(() => {
|
||||
prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
resetHTMLFixture();
|
||||
});
|
||||
|
||||
it('should initialize wrapper element refs on class object', () => {
|
||||
expect(prometheusMetrics.$wrapper).toBeDefined();
|
||||
expect(prometheusMetrics.$monitoredMetricsPanel).toBeDefined();
|
||||
expect(prometheusMetrics.$monitoredMetricsCount).toBeDefined();
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading).toBeDefined();
|
||||
expect(prometheusMetrics.$monitoredMetricsEmpty).toBeDefined();
|
||||
expect(prometheusMetrics.$monitoredMetricsList).toBeDefined();
|
||||
expect(prometheusMetrics.$missingEnvVarPanel).toBeDefined();
|
||||
expect(prometheusMetrics.$panelToggleRight).toBeDefined();
|
||||
expect(prometheusMetrics.$panelToggleDown).toBeDefined();
|
||||
expect(prometheusMetrics.$missingEnvVarMetricCount).toBeDefined();
|
||||
expect(prometheusMetrics.$missingEnvVarMetricsList).toBeDefined();
|
||||
});
|
||||
|
||||
it('should initialize metadata on class object', () => {
|
||||
expect(prometheusMetrics.backOffRequestCounter).toEqual(0);
|
||||
expect(prometheusMetrics.activeMetricsEndpoint).toContain('/test');
|
||||
});
|
||||
});
|
||||
|
||||
describe('showMonitoringMetricsPanelState', () => {
|
||||
let prometheusMetrics;
|
||||
|
||||
beforeEach(() => {
|
||||
prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
|
||||
});
|
||||
|
||||
it('should show loading state when called with `loading`', () => {
|
||||
prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.LOADING);
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(false);
|
||||
expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('should show metrics list when called with `list`', () => {
|
||||
prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.LIST);
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBe(false);
|
||||
});
|
||||
|
||||
it('should show empty state when called with `empty`', () => {
|
||||
prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY);
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBe(false);
|
||||
expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('populateActiveMetrics', () => {
|
||||
let prometheusMetrics;
|
||||
|
||||
beforeEach(() => {
|
||||
prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
|
||||
});
|
||||
|
||||
it('should show monitored metrics list', () => {
|
||||
prometheusMetrics.populateActiveMetrics(metrics);
|
||||
|
||||
const $metricsListLi = prometheusMetrics.$monitoredMetricsList.find('li');
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBe(false);
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsCount.text()).toEqual(
|
||||
'3 exporters with 12 metrics were found',
|
||||
);
|
||||
|
||||
expect($metricsListLi.length).toEqual(metrics.length);
|
||||
expect($metricsListLi.first().find('.badge').text()).toEqual(`${metrics[0].active_metrics}`);
|
||||
});
|
||||
|
||||
it('should show missing environment variables list', () => {
|
||||
prometheusMetrics.populateActiveMetrics(missingVarMetrics);
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$missingEnvVarPanel.hasClass('hidden')).toBe(false);
|
||||
|
||||
expect(prometheusMetrics.$missingEnvVarMetricCount.text()).toEqual('2');
|
||||
expect(prometheusMetrics.$missingEnvVarPanel.find('li').length).toEqual(2);
|
||||
expect(prometheusMetrics.$missingEnvVarPanel.find('.flash-container')).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('loadActiveMetrics', () => {
|
||||
let prometheusMetrics;
|
||||
let mock;
|
||||
|
||||
function mockSuccess() {
|
||||
mock.onGet(prometheusMetrics.activeMetricsEndpoint).reply(HTTP_STATUS_OK, {
|
||||
data: metrics,
|
||||
success: true,
|
||||
});
|
||||
}
|
||||
|
||||
function mockError() {
|
||||
mock.onGet(prometheusMetrics.activeMetricsEndpoint).networkError();
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
jest.spyOn(axios, 'get');
|
||||
|
||||
prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
|
||||
|
||||
mock = new MockAdapter(axios);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
mock.restore();
|
||||
});
|
||||
|
||||
it('should show loader animation while response is being loaded and hide it when request is complete', async () => {
|
||||
mockSuccess();
|
||||
|
||||
prometheusMetrics.loadActiveMetrics();
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(false);
|
||||
expect(axios.get).toHaveBeenCalledWith(prometheusMetrics.activeMetricsEndpoint);
|
||||
|
||||
await waitForPromises();
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('should show empty state if response failed to load', async () => {
|
||||
mockError();
|
||||
|
||||
prometheusMetrics.loadActiveMetrics();
|
||||
|
||||
await waitForPromises();
|
||||
|
||||
expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBe(true);
|
||||
expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBe(false);
|
||||
});
|
||||
|
||||
it('should populate metrics list once response is loaded', async () => {
|
||||
jest.spyOn(prometheusMetrics, 'populateActiveMetrics').mockImplementation();
|
||||
mockSuccess();
|
||||
|
||||
prometheusMetrics.loadActiveMetrics();
|
||||
|
||||
await waitForPromises();
|
||||
|
||||
expect(prometheusMetrics.populateActiveMetrics).toHaveBeenCalledWith(metrics);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -38,11 +38,11 @@ RSpec.describe Import::SourceUser, type: :model, feature_category: :importers do
|
|||
describe '.awaiting_reassignment' do
|
||||
it 'only returns source users that await reassignment' do
|
||||
namespace = create(:namespace)
|
||||
pending_assignment_user = create(:import_source_user, :pending_assignment, namespace: namespace)
|
||||
pending_reassignment_user = create(:import_source_user, :pending_reassignment, namespace: namespace)
|
||||
awaiting_approval_user = create(:import_source_user, :awaiting_approval, namespace: namespace)
|
||||
|
||||
expect(namespace.import_source_users.awaiting_reassignment)
|
||||
.to match_array([pending_assignment_user, awaiting_approval_user])
|
||||
.to match_array([pending_reassignment_user, awaiting_approval_user])
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -148,6 +148,10 @@ RSpec.configure do |config|
|
|||
metadata[:type] = :feature
|
||||
end
|
||||
|
||||
config.define_derived_metadata(file_path: %r{spec/dot_gitlab_ci/}) do |metadata|
|
||||
metadata[:ci_config_validation] = true
|
||||
end
|
||||
|
||||
config.include LicenseHelpers
|
||||
config.include ActiveJob::TestHelper
|
||||
config.include ActiveSupport::Testing::TimeHelpers
|
||||
|
|
@ -395,6 +399,11 @@ RSpec.configure do |config|
|
|||
example.run if config.inclusion_filter[:quarantine] || !ENV['CI']
|
||||
end
|
||||
|
||||
config.around(:example, :ci_config_validation) do |example|
|
||||
# Skip tests for ci config validation unless we explicitly focus on them or not in CI
|
||||
example.run if config.inclusion_filter[:ci_config_validation] || !ENV['CI']
|
||||
end
|
||||
|
||||
config.around(:example, :request_store) do |example|
|
||||
::Gitlab::SafeRequestStore.ensure_request_store { example.run }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -37,10 +37,6 @@ mapping:
|
|||
- source: 'rubocop/(?<rest>.+)\.rb'
|
||||
test: 'spec/rubocop/%{rest}_spec.rb'
|
||||
|
||||
# .gitlab/ci related specs
|
||||
- source: '.gitlab/ci/(?<rest>.+)\.gitlab-ci\.yml'
|
||||
test: 'spec/dot_gitlab_ci/%{rest}_spec.rb'
|
||||
|
||||
# Map config to respective specs
|
||||
- source: 'config/(?<rest>.+)\..*'
|
||||
test: 'spec/config/%{rest}_spec.rb'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
include:
|
||||
- local: gems/gem.gitlab-ci.yml
|
||||
inputs:
|
||||
gem_name: "gitlab-topology-service-client"
|
||||
gem_path_prefix: "vendor/gems/"
|
||||
|
|
@ -0,0 +1 @@
|
|||
* @gitlab-org/tenant-scale-group/backend-engineers
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
# Topology Service Client Gem
|
||||
|
||||
This Ruby Gem is meant to initialize a client to the Cells Topology Service.
|
||||
This Gem is automatically generated via GRPC from the
|
||||
repository https://gitlab.com/gitlab-org/cells/topology-service
|
||||
|
||||
For more information about the Topology Service:
|
||||
https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/topology_service/
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
# Specify your gem's dependencies in ruby.gemspec
|
||||
gemspec
|
||||
|
|
@ -0,0 +1,137 @@
|
|||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
gitlab-topology-service-client (0.1)
|
||||
grpc
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (7.1.3.2)
|
||||
base64
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
tzinfo (~> 2.0)
|
||||
ast (2.4.2)
|
||||
base64 (0.2.0)
|
||||
bigdecimal (3.1.8)
|
||||
binding_of_caller (1.0.1)
|
||||
debug_inspector (>= 1.2.0)
|
||||
concurrent-ruby (1.2.3)
|
||||
connection_pool (2.4.1)
|
||||
debug_inspector (1.2.0)
|
||||
diff-lcs (1.5.1)
|
||||
drb (2.2.1)
|
||||
gitlab-styles (10.1.0)
|
||||
rubocop (~> 1.50.2)
|
||||
rubocop-graphql (~> 0.18)
|
||||
rubocop-performance (~> 1.15)
|
||||
rubocop-rails (~> 2.17)
|
||||
rubocop-rspec (~> 2.22)
|
||||
google-protobuf (3.25.3)
|
||||
googleapis-common-protos-types (1.14.0)
|
||||
google-protobuf (~> 3.18)
|
||||
grpc (1.63.0)
|
||||
google-protobuf (~> 3.25)
|
||||
googleapis-common-protos-types (~> 1.0)
|
||||
i18n (1.14.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
json (2.7.1)
|
||||
minitest (5.22.3)
|
||||
mutex_m (0.2.0)
|
||||
parallel (1.24.0)
|
||||
parser (3.3.0.5)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
proc_to_ast (0.2.0)
|
||||
parser
|
||||
rouge
|
||||
unparser
|
||||
racc (1.7.3)
|
||||
rack (3.0.11)
|
||||
rainbow (3.1.1)
|
||||
regexp_parser (2.9.0)
|
||||
rexml (3.2.6)
|
||||
rouge (4.3.0)
|
||||
rspec (3.13.0)
|
||||
rspec-core (~> 3.13.0)
|
||||
rspec-expectations (~> 3.13.0)
|
||||
rspec-mocks (~> 3.13.0)
|
||||
rspec-core (3.13.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-expectations (3.13.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-mocks (3.13.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-parameterized (1.0.2)
|
||||
rspec-parameterized-core (< 2)
|
||||
rspec-parameterized-table_syntax (< 2)
|
||||
rspec-parameterized-core (1.0.1)
|
||||
parser
|
||||
proc_to_ast (>= 0.2.0)
|
||||
rspec (>= 2.13, < 4)
|
||||
unparser
|
||||
rspec-parameterized-table_syntax (1.0.1)
|
||||
binding_of_caller
|
||||
rspec-parameterized-core (< 2)
|
||||
rspec-support (3.13.0)
|
||||
rubocop (1.50.2)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.2.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.28.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.30.0)
|
||||
parser (>= 3.2.1.0)
|
||||
rubocop-capybara (2.20.0)
|
||||
rubocop (~> 1.41)
|
||||
rubocop-factory_bot (2.25.1)
|
||||
rubocop (~> 1.41)
|
||||
rubocop-graphql (0.19.0)
|
||||
rubocop (>= 0.87, < 2)
|
||||
rubocop-performance (1.20.2)
|
||||
rubocop (>= 1.48.1, < 2.0)
|
||||
rubocop-ast (>= 1.30.0, < 2.0)
|
||||
rubocop-rails (2.23.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
rubocop-ast (>= 1.30.0, < 2.0)
|
||||
rubocop-rspec (2.29.2)
|
||||
rubocop (~> 1.40)
|
||||
rubocop-capybara (~> 2.17)
|
||||
rubocop-factory_bot (~> 2.22)
|
||||
rubocop-rspec_rails (~> 2.28)
|
||||
rubocop-rspec_rails (2.28.3)
|
||||
rubocop (~> 1.40)
|
||||
ruby-progressbar (1.13.0)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.5.0)
|
||||
unparser (0.6.15)
|
||||
diff-lcs (~> 1.3)
|
||||
parser (>= 3.3.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
gitlab-styles (~> 10.1.0)
|
||||
gitlab-topology-service-client!
|
||||
rspec (~> 3.0)
|
||||
rspec-parameterized (~> 1.0.2)
|
||||
rubocop (~> 1.21)
|
||||
|
||||
BUNDLED WITH
|
||||
2.4.4
|
||||
24
vendor/gems/gitlab-topology-service-client/gitlab-topology-service-client.gemspec
vendored
Normal file
24
vendor/gems/gitlab-topology-service-client/gitlab-topology-service-client.gemspec
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "lib/gitlab/cells/topology_service/version"
|
||||
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = "gitlab-topology-service-client"
|
||||
spec.version = Gitlab::Cells::TopologyService::VERSION
|
||||
spec.authors = ["group::tenant scale"]
|
||||
spec.email = ["engineering@gitlab.com"]
|
||||
|
||||
spec.summary = "Client library to interact with Topology Service for GitLab Cells architecture"
|
||||
spec.homepage = "https://gitlab.com/gitlab-org/cells/topology-service"
|
||||
spec.license = "MIT"
|
||||
spec.required_ruby_version = ">= 2.6.0"
|
||||
|
||||
spec.files = Dir['lib/**/*.rb']
|
||||
spec.require_paths = ["lib"]
|
||||
|
||||
spec.add_dependency "grpc"
|
||||
spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
|
||||
spec.add_development_dependency "rspec", "~> 3.0"
|
||||
spec.add_development_dependency "rspec-parameterized", "~> 1.0.2"
|
||||
spec.add_development_dependency "rubocop", "~> 1.21"
|
||||
end
|
||||
8
vendor/gems/gitlab-topology-service-client/lib/gitlab/cells/topology_service.rb
vendored
Normal file
8
vendor/gems/gitlab-topology-service-client/lib/gitlab/cells/topology_service.rb
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "topology_service/version"
|
||||
|
||||
require "proto/claim_service_services_pb"
|
||||
require "proto/classify_service_services_pb"
|
||||
require "proto/health_service_services_pb"
|
||||
require "proto/sequence_service_services_pb"
|
||||
9
vendor/gems/gitlab-topology-service-client/lib/gitlab/cells/topology_service/version.rb
vendored
Normal file
9
vendor/gems/gitlab-topology-service-client/lib/gitlab/cells/topology_service/version.rb
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
VERSION = "0.1"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: proto/cell_info.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_file("proto/cell_info.proto", :syntax => :proto3) do
|
||||
add_message "gitlab.cells.topology_service.CellInfo" do
|
||||
optional :id, :int64, 1
|
||||
optional :name, :string, 2
|
||||
optional :address, :string, 3
|
||||
optional :session_prefix, :string, 4
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.GetCellsRequest" do
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.GetCellsResponse" do
|
||||
repeated :cells, :message, 1, "gitlab.cells.topology_service.CellInfo"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
CellInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.CellInfo").msgclass
|
||||
GetCellsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.GetCellsRequest").msgclass
|
||||
GetCellsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.GetCellsResponse").msgclass
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: proto/claim_service.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'proto/cell_info_pb'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_file("proto/claim_service.proto", :syntax => :proto3) do
|
||||
add_message "gitlab.cells.topology_service.ClaimRecord" do
|
||||
optional :bucket, :enum, 1, "gitlab.cells.topology_service.ClaimRecord.Bucket"
|
||||
optional :value, :string, 2
|
||||
end
|
||||
add_enum "gitlab.cells.topology_service.ClaimRecord.Bucket" do
|
||||
value :Unknown, 0
|
||||
value :Routes, 1
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ParentRecord" do
|
||||
optional :model, :enum, 1, "gitlab.cells.topology_service.ParentRecord.ApplicationModel"
|
||||
optional :id, :int64, 2
|
||||
end
|
||||
add_enum "gitlab.cells.topology_service.ParentRecord.ApplicationModel" do
|
||||
value :Unknown, 0
|
||||
value :Group, 1
|
||||
value :Project, 2
|
||||
value :UserNamespace, 3
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.OwnerRecord" do
|
||||
optional :table, :enum, 1, "gitlab.cells.topology_service.OwnerRecord.Table"
|
||||
optional :id, :int64, 2
|
||||
end
|
||||
add_enum "gitlab.cells.topology_service.OwnerRecord.Table" do
|
||||
value :Unknown, 0
|
||||
value :routes, 1
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ClaimDetails" do
|
||||
optional :claim, :message, 1, "gitlab.cells.topology_service.ClaimRecord"
|
||||
optional :parent, :message, 2, "gitlab.cells.topology_service.ParentRecord"
|
||||
optional :owner, :message, 3, "gitlab.cells.topology_service.OwnerRecord"
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ClaimInfo" do
|
||||
optional :id, :int64, 1
|
||||
optional :details, :message, 2, "gitlab.cells.topology_service.ClaimDetails"
|
||||
proto3_optional :cell_info, :message, 3, "gitlab.cells.topology_service.CellInfo"
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.CreateClaimRequest" do
|
||||
optional :details, :message, 1, "gitlab.cells.topology_service.ClaimDetails"
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.CreateClaimResponse" do
|
||||
optional :claim, :message, 1, "gitlab.cells.topology_service.ClaimInfo"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
ClaimRecord = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClaimRecord").msgclass
|
||||
ClaimRecord::Bucket = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClaimRecord.Bucket").enummodule
|
||||
ParentRecord = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ParentRecord").msgclass
|
||||
ParentRecord::ApplicationModel = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ParentRecord.ApplicationModel").enummodule
|
||||
OwnerRecord = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.OwnerRecord").msgclass
|
||||
OwnerRecord::Table = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.OwnerRecord.Table").enummodule
|
||||
ClaimDetails = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClaimDetails").msgclass
|
||||
ClaimInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClaimInfo").msgclass
|
||||
CreateClaimRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.CreateClaimRequest").msgclass
|
||||
CreateClaimResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.CreateClaimResponse").msgclass
|
||||
end
|
||||
end
|
||||
end
|
||||
28
vendor/gems/gitlab-topology-service-client/lib/proto/claim_service_services_pb.rb
vendored
Normal file
28
vendor/gems/gitlab-topology-service-client/lib/proto/claim_service_services_pb.rb
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# Source: proto/claim_service.proto for package 'Gitlab.Cells.TopologyService'
|
||||
|
||||
require 'grpc'
|
||||
require 'proto/claim_service_pb'
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
module ClaimService
|
||||
# Restricted read-write service to claim global uniqueness on resources
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'gitlab.cells.topology_service.ClaimService'
|
||||
|
||||
rpc :GetCells, Gitlab::Cells::TopologyService::GetCellsRequest, Gitlab::Cells::TopologyService::GetCellsResponse
|
||||
rpc :CreateClaim, Gitlab::Cells::TopologyService::CreateClaimRequest, Gitlab::Cells::TopologyService::CreateClaimResponse
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: proto/classify_service.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'proto/cell_info_pb'
|
||||
require 'google/api/annotations_pb'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_file("proto/classify_service.proto", :syntax => :proto3) do
|
||||
add_message "gitlab.cells.topology_service.ClassifyRequest" do
|
||||
optional :type, :enum, 2, "gitlab.cells.topology_service.ClassifyType"
|
||||
optional :value, :string, 3
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ProxyInfo" do
|
||||
optional :address, :string, 1
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ClassifyResponse" do
|
||||
optional :action, :enum, 1, "gitlab.cells.topology_service.ClassifyAction"
|
||||
optional :proxy, :message, 2, "gitlab.cells.topology_service.ProxyInfo"
|
||||
end
|
||||
add_enum "gitlab.cells.topology_service.ClassifyType" do
|
||||
value :UnknownType, 0
|
||||
value :FirstCell, 1
|
||||
value :SessionPrefix, 2
|
||||
end
|
||||
add_enum "gitlab.cells.topology_service.ClassifyAction" do
|
||||
value :UnknownAction, 0
|
||||
value :Proxy, 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
ClassifyRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClassifyRequest").msgclass
|
||||
ProxyInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ProxyInfo").msgclass
|
||||
ClassifyResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClassifyResponse").msgclass
|
||||
ClassifyType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClassifyType").enummodule
|
||||
ClassifyAction = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ClassifyAction").enummodule
|
||||
end
|
||||
end
|
||||
end
|
||||
28
vendor/gems/gitlab-topology-service-client/lib/proto/classify_service_services_pb.rb
vendored
Normal file
28
vendor/gems/gitlab-topology-service-client/lib/proto/classify_service_services_pb.rb
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# Source: proto/classify_service.proto for package 'Gitlab.Cells.TopologyService'
|
||||
|
||||
require 'grpc'
|
||||
require 'proto/classify_service_pb'
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
module ClassifyService
|
||||
# Public read-only service used by various Routing Services
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'gitlab.cells.topology_service.ClassifyService'
|
||||
|
||||
rpc :GetCells, Gitlab::Cells::TopologyService::GetCellsRequest, Gitlab::Cells::TopologyService::GetCellsResponse
|
||||
rpc :Classify, Gitlab::Cells::TopologyService::ClassifyRequest, Gitlab::Cells::TopologyService::ClassifyResponse
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: proto/health_service.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'google/api/annotations_pb'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_file("proto/health_service.proto", :syntax => :proto3) do
|
||||
add_message "gitlab.cells.topology_service.ReadinessProbeRequest" do
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.ReadinessProbeResponse" do
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.LivenessProbeRequest" do
|
||||
end
|
||||
add_message "gitlab.cells.topology_service.LivenessProbeResponse" do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
ReadinessProbeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ReadinessProbeRequest").msgclass
|
||||
ReadinessProbeResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.ReadinessProbeResponse").msgclass
|
||||
LivenessProbeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.LivenessProbeRequest").msgclass
|
||||
LivenessProbeResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitlab.cells.topology_service.LivenessProbeResponse").msgclass
|
||||
end
|
||||
end
|
||||
end
|
||||
30
vendor/gems/gitlab-topology-service-client/lib/proto/health_service_services_pb.rb
vendored
Normal file
30
vendor/gems/gitlab-topology-service-client/lib/proto/health_service_services_pb.rb
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# Source: proto/health_service.proto for package 'Gitlab.Cells.TopologyService'
|
||||
|
||||
require 'grpc'
|
||||
require 'proto/health_service_pb'
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
module HealthService
|
||||
# Public read-only service
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'gitlab.cells.topology_service.HealthService'
|
||||
|
||||
# (Lightweight) Used for checking if application is ready to accept requests
|
||||
rpc :ReadinessProbe, Gitlab::Cells::TopologyService::ReadinessProbeRequest, Gitlab::Cells::TopologyService::ReadinessProbeResponse
|
||||
# (Lightweight) Used for checking if application is alive, or whether it should be restarted
|
||||
rpc :LivenessProbe, Gitlab::Cells::TopologyService::LivenessProbeRequest, Gitlab::Cells::TopologyService::LivenessProbeResponse
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: proto/sequence_service.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'proto/cell_info_pb'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_file("proto/sequence_service.proto", :syntax => :proto3) do
|
||||
end
|
||||
end
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
end
|
||||
end
|
||||
end
|
||||
27
vendor/gems/gitlab-topology-service-client/lib/proto/sequence_service_services_pb.rb
vendored
Normal file
27
vendor/gems/gitlab-topology-service-client/lib/proto/sequence_service_services_pb.rb
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# Source: proto/sequence_service.proto for package 'Gitlab.Cells.TopologyService'
|
||||
|
||||
require 'grpc'
|
||||
require 'proto/sequence_service_pb'
|
||||
|
||||
module Gitlab
|
||||
module Cells
|
||||
module TopologyService
|
||||
module SequenceService
|
||||
# Restricted read-write service to provide cluster-wide primary key uniqueness
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'gitlab.cells.topology_service.SequenceService'
|
||||
|
||||
rpc :GetCells, Gitlab::Cells::TopologyService::GetCellsRequest, Gitlab::Cells::TopologyService::GetCellsResponse
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1310,10 +1310,10 @@
|
|||
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
|
||||
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
|
||||
|
||||
"@gitlab/cluster-client@^2.2.0":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@gitlab/cluster-client/-/cluster-client-2.2.0.tgz#418a1783d8a6b38624d3f446f55b7a5c737cae73"
|
||||
integrity sha512-57k5U1dDXSvIvbveKkRccNDl3qliDp+dfaJAPktL+V6GUMleoCbsx9pXselW4RK9YoHh+Zx9afIkczlR0TUv2Q==
|
||||
"@gitlab/cluster-client@^2.2.1":
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@gitlab/cluster-client/-/cluster-client-2.2.1.tgz#9d14336d653c1df92d2d764a7eff74b5a3a43119"
|
||||
integrity sha512-YtpSfFxro0q/YRhBuZWiSfHQ44JyTfuwQgE8F77+0v5xOuvoeXR81mmJzF6ByejKVAee9auvjdd4eHSUQ5MqsQ==
|
||||
dependencies:
|
||||
axios "^0.24.0"
|
||||
core-js "^3.29.1"
|
||||
|
|
|
|||
Loading…
Reference in New Issue