debian-mirror-gitlab/app/assets/javascripts/jobs/store/actions.js

279 lines
7.6 KiB
JavaScript
Raw Normal View History

2018-11-20 20:47:30 +05:30
import Visibility from 'visibilityjs';
2021-09-30 23:02:18 +05:30
import createFlash from '~/flash';
2018-12-13 13:39:08 +05:30
import axios from '~/lib/utils/axios_utils';
2021-03-08 18:12:59 +05:30
import { setFaviconOverlay, resetFavicon } from '~/lib/utils/favicon';
2021-03-11 19:13:27 +05:30
import httpStatusCodes from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
2018-12-13 13:39:08 +05:30
import {
canScroll,
isScrolledToBottom,
isScrolledToTop,
isScrolledToMiddle,
scrollDown,
scrollUp,
} from '~/lib/utils/scroll_utils';
2021-03-11 19:13:27 +05:30
import { __ } from '~/locale';
2021-10-27 15:23:28 +05:30
import { reportToSentry } from '../utils';
2021-03-11 19:13:27 +05:30
import * as types from './mutation_types';
2018-11-20 20:47:30 +05:30
2020-03-13 15:44:24 +05:30
export const init = ({ dispatch }, { endpoint, logState, pagePath }) => {
dispatch('setJobEndpoint', endpoint);
2021-11-18 22:05:49 +05:30
dispatch('setJobLogOptions', {
2020-03-13 15:44:24 +05:30
logState,
pagePath,
});
2021-11-18 22:05:49 +05:30
return Promise.all([dispatch('fetchJob'), dispatch('fetchJobLog')]);
2020-03-13 15:44:24 +05:30
};
2018-11-20 20:47:30 +05:30
export const setJobEndpoint = ({ commit }, endpoint) => commit(types.SET_JOB_ENDPOINT, endpoint);
2021-11-18 22:05:49 +05:30
export const setJobLogOptions = ({ commit }, options) => commit(types.SET_JOB_LOG_OPTIONS, options);
2018-12-13 13:39:08 +05:30
export const hideSidebar = ({ commit }) => commit(types.HIDE_SIDEBAR);
export const showSidebar = ({ commit }) => commit(types.SHOW_SIDEBAR);
export const toggleSidebar = ({ dispatch, state }) => {
if (state.isSidebarOpen) {
dispatch('hideSidebar');
} else {
dispatch('showSidebar');
}
};
2018-11-20 20:47:30 +05:30
let eTagPoll;
export const clearEtagPoll = () => {
eTagPoll = null;
};
export const stopPolling = () => {
if (eTagPoll) eTagPoll.stop();
};
export const restartPolling = () => {
if (eTagPoll) eTagPoll.restart();
};
export const requestJob = ({ commit }) => commit(types.REQUEST_JOB);
export const fetchJob = ({ state, dispatch }) => {
dispatch('requestJob');
eTagPoll = new Poll({
resource: {
getJob(endpoint) {
return axios.get(endpoint);
},
},
data: state.jobEndpoint,
method: 'getJob',
successCallback: ({ data }) => dispatch('receiveJobSuccess', data),
errorCallback: () => dispatch('receiveJobError'),
});
if (!Visibility.hidden()) {
eTagPoll.makeRequest();
} else {
axios
.get(state.jobEndpoint)
.then(({ data }) => dispatch('receiveJobSuccess', data))
.catch(() => dispatch('receiveJobError'));
}
Visibility.change(() => {
if (!Visibility.hidden()) {
dispatch('restartPolling');
} else {
dispatch('stopPolling');
}
});
};
2018-12-13 13:39:08 +05:30
export const receiveJobSuccess = ({ commit }, data = {}) => {
2018-12-05 23:21:45 +05:30
commit(types.RECEIVE_JOB_SUCCESS, data);
2018-12-13 13:39:08 +05:30
if (data.status && data.status.favicon) {
setFaviconOverlay(data.status.favicon);
} else {
resetFavicon();
}
2018-12-05 23:21:45 +05:30
};
2018-11-20 20:47:30 +05:30
export const receiveJobError = ({ commit }) => {
commit(types.RECEIVE_JOB_ERROR);
2021-09-30 23:02:18 +05:30
createFlash({
message: __('An error occurred while fetching the job.'),
});
2018-12-13 13:39:08 +05:30
resetFavicon();
2018-11-20 20:47:30 +05:30
};
/**
2021-11-18 22:05:49 +05:30
* Job Log
2018-11-20 20:47:30 +05:30
*/
2018-12-13 13:39:08 +05:30
export const scrollTop = ({ dispatch }) => {
scrollUp();
dispatch('toggleScrollButtons');
2018-11-20 20:47:30 +05:30
};
2018-12-13 13:39:08 +05:30
export const scrollBottom = ({ dispatch }) => {
scrollDown();
dispatch('toggleScrollButtons');
};
/**
* Responsible for toggling the disabled state of the scroll buttons
*/
export const toggleScrollButtons = ({ dispatch }) => {
if (canScroll()) {
if (isScrolledToMiddle()) {
dispatch('enableScrollTop');
dispatch('enableScrollBottom');
} else if (isScrolledToTop()) {
dispatch('disableScrollTop');
dispatch('enableScrollBottom');
} else if (isScrolledToBottom()) {
dispatch('disableScrollBottom');
dispatch('enableScrollTop');
}
} else {
dispatch('disableScrollBottom');
dispatch('disableScrollTop');
}
};
export const disableScrollBottom = ({ commit }) => commit(types.DISABLE_SCROLL_BOTTOM);
export const disableScrollTop = ({ commit }) => commit(types.DISABLE_SCROLL_TOP);
export const enableScrollBottom = ({ commit }) => commit(types.ENABLE_SCROLL_BOTTOM);
export const enableScrollTop = ({ commit }) => commit(types.ENABLE_SCROLL_TOP);
/**
* While the automatic scroll down is active,
* we show the scroll down button with an animation
*/
export const toggleScrollAnimation = ({ commit }, toggle) =>
commit(types.TOGGLE_SCROLL_ANIMATION, toggle);
/**
* Responsible to handle automatic scroll
*/
export const toggleScrollisInBottom = ({ commit }, toggle) => {
2021-11-18 22:05:49 +05:30
commit(types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG, toggle);
2018-11-20 20:47:30 +05:30
};
2021-11-18 22:05:49 +05:30
export const requestJobLog = ({ commit }) => commit(types.REQUEST_JOB_LOG);
2018-11-20 20:47:30 +05:30
2021-11-18 22:05:49 +05:30
export const fetchJobLog = ({ dispatch, state }) =>
// update trace endpoint once BE compeletes trace re-naming in #340626
2018-11-20 20:47:30 +05:30
axios
2021-11-18 22:05:49 +05:30
.get(`${state.jobLogEndpoint}/trace.json`, {
params: { state: state.jobLogState },
2018-11-20 20:47:30 +05:30
})
.then(({ data }) => {
2018-12-13 13:39:08 +05:30
dispatch('toggleScrollisInBottom', isScrolledToBottom());
2021-11-18 22:05:49 +05:30
dispatch('receiveJobLogSuccess', data);
2018-11-20 20:47:30 +05:30
2020-03-13 15:44:24 +05:30
if (data.complete) {
2021-11-18 22:05:49 +05:30
dispatch('stopPollingJobLog');
} else if (!state.jobLogTimeout) {
dispatch('startPollingJobLog');
2018-11-20 20:47:30 +05:30
}
})
2021-10-27 15:23:28 +05:30
.catch((e) => {
if (e.response.status === httpStatusCodes.FORBIDDEN) {
2021-11-18 22:05:49 +05:30
dispatch('receiveJobLogUnauthorizedError');
2021-10-27 15:23:28 +05:30
} else {
reportToSentry('job_actions', e);
2021-11-18 22:05:49 +05:30
dispatch('receiveJobLogError');
2021-10-27 15:23:28 +05:30
}
});
2018-12-13 13:39:08 +05:30
2021-11-18 22:05:49 +05:30
export const startPollingJobLog = ({ dispatch, commit }) => {
const jobLogTimeout = setTimeout(() => {
commit(types.SET_JOB_LOG_TIMEOUT, 0);
dispatch('fetchJobLog');
2020-03-13 15:44:24 +05:30
}, 4000);
2021-11-18 22:05:49 +05:30
commit(types.SET_JOB_LOG_TIMEOUT, jobLogTimeout);
2020-03-13 15:44:24 +05:30
};
2021-11-18 22:05:49 +05:30
export const stopPollingJobLog = ({ state, commit }) => {
clearTimeout(state.jobLogTimeout);
commit(types.SET_JOB_LOG_TIMEOUT, 0);
commit(types.STOP_POLLING_JOB_LOG);
2018-11-20 20:47:30 +05:30
};
2020-03-13 15:44:24 +05:30
2021-11-18 22:05:49 +05:30
export const receiveJobLogSuccess = ({ commit }, log) => commit(types.RECEIVE_JOB_LOG_SUCCESS, log);
export const receiveJobLogError = ({ dispatch }) => {
dispatch('stopPollingJobLog');
2021-09-30 23:02:18 +05:30
createFlash({
message: __('An error occurred while fetching the job log.'),
});
2018-11-20 20:47:30 +05:30
};
2021-11-18 22:05:49 +05:30
export const receiveJobLogUnauthorizedError = ({ dispatch }) => {
dispatch('stopPollingJobLog');
2021-09-30 23:02:18 +05:30
createFlash({
message: __('The current user is not authorized to access the job log.'),
});
2021-02-22 17:27:13 +05:30
};
2019-12-04 20:38:33 +05:30
/**
2020-07-28 23:09:34 +05:30
* When the user clicks a collapsible line in the job
2019-12-04 20:38:33 +05:30
* log, we commit a mutation to update the state
*
* @param {Object} section
*/
export const toggleCollapsibleLine = ({ commit }, section) =>
commit(types.TOGGLE_COLLAPSIBLE_LINE, section);
2018-11-20 20:47:30 +05:30
/**
* Jobs list on sidebar - depend on stages dropdown
*/
2018-12-05 23:21:45 +05:30
export const requestJobsForStage = ({ commit }, stage) =>
commit(types.REQUEST_JOBS_FOR_STAGE, stage);
2018-11-20 20:47:30 +05:30
// On stage click, set selected stage + fetch job
2019-09-04 21:01:54 +05:30
export const fetchJobsForStage = ({ dispatch }, stage = {}) => {
2018-12-05 23:21:45 +05:30
dispatch('requestJobsForStage', stage);
2018-11-20 20:47:30 +05:30
axios
2018-12-05 23:21:45 +05:30
.get(stage.dropdown_path, {
params: {
retried: 1,
},
})
.then(({ data }) => {
2021-03-08 18:12:59 +05:30
const retriedJobs = data.retried.map((job) => ({ ...job, retried: true }));
2018-12-05 23:21:45 +05:30
const jobs = data.latest_statuses.concat(retriedJobs);
dispatch('receiveJobsForStageSuccess', jobs);
})
2018-11-20 20:47:30 +05:30
.catch(() => dispatch('receiveJobsForStageError'));
};
export const receiveJobsForStageSuccess = ({ commit }, data) =>
commit(types.RECEIVE_JOBS_FOR_STAGE_SUCCESS, data);
2021-11-18 22:05:49 +05:30
2018-11-20 20:47:30 +05:30
export const receiveJobsForStageError = ({ commit }) => {
commit(types.RECEIVE_JOBS_FOR_STAGE_ERROR);
2021-09-30 23:02:18 +05:30
createFlash({
message: __('An error occurred while fetching the jobs.'),
});
2018-11-20 20:47:30 +05:30
};
2019-10-12 21:52:04 +05:30
export const triggerManualJob = ({ state }, variables) => {
2021-03-08 18:12:59 +05:30
const parsedVariables = variables.map((variable) => {
2020-05-24 23:13:21 +05:30
const copyVar = { ...variable };
2019-10-12 21:52:04 +05:30
delete copyVar.id;
return copyVar;
});
axios
.post(state.job.status.action.path, {
job_variables_attributes: parsedVariables,
})
2021-09-30 23:02:18 +05:30
.catch(() =>
createFlash({
message: __('An error occurred while triggering the job.'),
}),
);
2019-10-12 21:52:04 +05:30
};