Commit 96a3847e authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch '43770-change-clear-runners-cache-ujs-action-to-an-axios-request' into 'master'

Resolve "Change Clear Runners cache UJS action to an API request"

Closes #43770

See merge request gitlab-org/gitlab-ce!17466
parents 9df3aaae c63afd30
<script> <script>
import LoadingButton from '../../vue_shared/components/loading_button.vue';
export default { export default {
name: 'PipelineNavControls', name: 'PipelineNavControls',
components: {
LoadingButton,
},
props: { props: {
newPipelinePath: { newPipelinePath: {
type: String, type: String,
...@@ -19,6 +24,17 @@ ...@@ -19,6 +24,17 @@
required: false, required: false,
default: null, default: null,
}, },
isResetCacheButtonLoading: {
type: Boolean,
required: false,
default: false,
},
},
methods: {
onClickResetCache() {
this.$emit('resetRunnersCache', this.resetCachePath);
},
}, },
}; };
</script> </script>
...@@ -32,14 +48,13 @@ ...@@ -32,14 +48,13 @@
{{ s__('Pipelines|Run Pipeline') }} {{ s__('Pipelines|Run Pipeline') }}
</a> </a>
<a <loading-button
v-if="resetCachePath" v-if="resetCachePath"
data-method="post" @click="onClickResetCache"
:href="resetCachePath" :loading="isResetCacheButtonLoading"
class="btn btn-default js-clear-cache" class="btn btn-default js-clear-cache"
> :label="s__('Pipelines|Clear Runner Caches')"
{{ s__('Pipelines|Clear Runner Caches') }} />
</a>
<a <a
v-if="ciLintPath" v-if="ciLintPath"
......
<script> <script>
import _ from 'underscore'; import _ from 'underscore';
import { __, sprintf, s__ } from '../../locale'; import { __, sprintf, s__ } from '../../locale';
import createFlash from '../../flash';
import PipelinesService from '../services/pipelines_service'; import PipelinesService from '../services/pipelines_service';
import pipelinesMixin from '../mixins/pipelines'; import pipelinesMixin from '../mixins/pipelines';
import TablePagination from '../../vue_shared/components/table_pagination.vue'; import TablePagination from '../../vue_shared/components/table_pagination.vue';
...@@ -92,6 +93,7 @@ ...@@ -92,6 +93,7 @@
scope: getParameterByName('scope') || 'all', scope: getParameterByName('scope') || 'all',
page: getParameterByName('page') || '1', page: getParameterByName('page') || '1',
requestData: {}, requestData: {},
isResetCacheButtonLoading: false,
}; };
}, },
stateMap: { stateMap: {
...@@ -265,6 +267,23 @@ ...@@ -265,6 +267,23 @@
this.poll.restart({ data: this.requestData }); this.poll.restart({ data: this.requestData });
}); });
}, },
handleResetRunnersCache(endpoint) {
this.isResetCacheButtonLoading = true;
this.service.postAction(endpoint)
.then(() => {
this.isResetCacheButtonLoading = false;
createFlash(
s__('Pipelines|Project cache successfully reset.'),
'notice',
);
})
.catch(() => {
this.isResetCacheButtonLoading = false;
createFlash(s__('Pipelines|Something went wrong while cleaning runners cache.'));
});
},
}, },
}; };
</script> </script>
...@@ -301,6 +320,8 @@ ...@@ -301,6 +320,8 @@
:new-pipeline-path="newPipelinePath" :new-pipeline-path="newPipelinePath"
:reset-cache-path="resetCachePath" :reset-cache-path="resetCachePath"
:ci-lint-path="ciLintPath" :ci-lint-path="ciLintPath"
@resetRunnersCache="handleResetRunnersCache"
:is-reset-cache-button-loading="isResetCacheButtonLoading"
/> />
</div> </div>
......
...@@ -51,12 +51,10 @@ export default { ...@@ -51,12 +51,10 @@ export default {
} }
}); });
eventHub.$on('refreshPipelines', this.fetchPipelines);
eventHub.$on('postAction', this.postAction); eventHub.$on('postAction', this.postAction);
}, },
beforeDestroy() { beforeDestroy() {
eventHub.$off('refreshPipelines'); eventHub.$off('postAction', this.postAction);
eventHub.$on('postAction', this.postAction);
}, },
destroyed() { destroyed() {
this.poll.stop(); this.poll.stop();
...@@ -92,7 +90,7 @@ export default { ...@@ -92,7 +90,7 @@ export default {
}, },
postAction(endpoint) { postAction(endpoint) {
this.service.postAction(endpoint) this.service.postAction(endpoint)
.then(() => eventHub.$emit('refreshPipelines')) .then(() => this.fetchPipelines())
.catch(() => Flash(__('An error occurred while making the request.'))); .catch(() => Flash(__('An error occurred while making the request.')));
}, },
}, },
......
...@@ -13,12 +13,14 @@ module Projects ...@@ -13,12 +13,14 @@ module Projects
def reset_cache def reset_cache
if ResetProjectCacheService.new(@project, current_user).execute if ResetProjectCacheService.new(@project, current_user).execute
flash[:notice] = _("Project cache successfully reset.") respond_to do |format|
format.json { head :ok }
end
else else
flash[:error] = _("Unable to reset project cache.") respond_to do |format|
format.json { head :bad_request }
end
end end
redirect_to project_pipelines_path(@project)
end end
private private
......
...@@ -27,7 +27,7 @@ describe Projects::Settings::CiCdController do ...@@ -27,7 +27,7 @@ describe Projects::Settings::CiCdController do
allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(true) allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(true)
end end
subject { post :reset_cache, namespace_id: project.namespace, project_id: project } subject { post :reset_cache, namespace_id: project.namespace, project_id: project, format: :json }
it 'calls reset project cache service' do it 'calls reset project cache service' do
expect(ResetProjectCacheService).to receive_message_chain(:new, :execute) expect(ResetProjectCacheService).to receive_message_chain(:new, :execute)
...@@ -35,19 +35,11 @@ describe Projects::Settings::CiCdController do ...@@ -35,19 +35,11 @@ describe Projects::Settings::CiCdController do
subject subject
end end
it 'redirects to project pipelines path' do
subject
expect(response).to have_gitlab_http_status(:redirect)
expect(response).to redirect_to(project_pipelines_path(project))
end
context 'when service returns successfully' do context 'when service returns successfully' do
it 'sets the flash notice variable' do it 'returns a success header' do
subject subject
expect(controller).to set_flash[:notice] expect(response).to have_gitlab_http_status(:ok)
expect(controller).not_to set_flash[:error]
end end
end end
...@@ -56,11 +48,10 @@ describe Projects::Settings::CiCdController do ...@@ -56,11 +48,10 @@ describe Projects::Settings::CiCdController do
allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(false) allow(ResetProjectCacheService).to receive_message_chain(:new, :execute).and_return(false)
end end
it 'sets the flash error variable' do it 'returns an error header' do
subject subject
expect(controller).not_to set_flash[:notice] expect(response).to have_gitlab_http_status(:bad_request)
expect(controller).to set_flash[:error]
end end
end end
end end
......
...@@ -557,7 +557,7 @@ describe 'Pipelines', :js do ...@@ -557,7 +557,7 @@ describe 'Pipelines', :js do
end end
it 'has a clear caches button' do it 'has a clear caches button' do
expect(page).to have_link 'Clear Runner Caches' expect(page).to have_button 'Clear Runner Caches'
end end
describe 'user clicks the button' do describe 'user clicks the button' do
...@@ -567,14 +567,16 @@ describe 'Pipelines', :js do ...@@ -567,14 +567,16 @@ describe 'Pipelines', :js do
end end
it 'increments jobs_cache_index' do it 'increments jobs_cache_index' do
click_link 'Clear Runner Caches' click_button 'Clear Runner Caches'
wait_for_requests
expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.' expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.'
end end
end end
context 'when project does not have jobs_cache_index' do context 'when project does not have jobs_cache_index' do
it 'sets jobs_cache_index to 1' do it 'sets jobs_cache_index to 1' do
click_link 'Clear Runner Caches' click_button 'Clear Runner Caches'
wait_for_requests
expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.' expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.'
end end
end end
......
...@@ -39,30 +39,41 @@ describe('Pipelines Nav Controls', () => { ...@@ -39,30 +39,41 @@ describe('Pipelines Nav Controls', () => {
expect(component.$el.querySelector('.js-run-pipeline')).toEqual(null); expect(component.$el.querySelector('.js-run-pipeline')).toEqual(null);
}); });
it('should render link for resetting runner caches', () => { it('should render link for CI lint', () => {
const mockData = { const mockData = {
newPipelinePath: 'foo', newPipelinePath: 'foo',
helpPagePath: 'foo',
ciLintPath: 'foo', ciLintPath: 'foo',
resetCachePath: 'foo', resetCachePath: 'foo',
}; };
component = mountComponent(NavControlsComponent, mockData); component = mountComponent(NavControlsComponent, mockData);
expect(component.$el.querySelector('.js-clear-cache').textContent.trim()).toContain('Clear Runner Caches'); expect(component.$el.querySelector('.js-ci-lint').textContent.trim()).toContain('CI Lint');
expect(component.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(mockData.resetCachePath); expect(component.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(mockData.ciLintPath);
}); });
it('should render link for CI lint', () => { describe('Reset Runners Cache', () => {
beforeEach(() => {
const mockData = { const mockData = {
newPipelinePath: 'foo', newPipelinePath: 'foo',
helpPagePath: 'foo',
ciLintPath: 'foo', ciLintPath: 'foo',
resetCachePath: 'foo', resetCachePath: 'foo',
}; };
component = mountComponent(NavControlsComponent, mockData); component = mountComponent(NavControlsComponent, mockData);
});
expect(component.$el.querySelector('.js-ci-lint').textContent.trim()).toContain('CI Lint'); it('should render button for resetting runner caches', () => {
expect(component.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(mockData.ciLintPath); expect(component.$el.querySelector('.js-clear-cache').textContent.trim()).toContain('Clear Runner Caches');
});
it('should emit postAction event when reset runner cache button is clicked', () => {
spyOn(component, '$emit');
component.$el.querySelector('.js-clear-cache').click();
expect(component.$emit).toHaveBeenCalledWith('resetRunnersCache', 'foo');
});
}); });
}); });
...@@ -95,16 +95,16 @@ describe('Pipelines', () => { ...@@ -95,16 +95,16 @@ describe('Pipelines', () => {
expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All');
}); });
it('renders Run Pipeline button', () => { it('renders Run Pipeline link', () => {
expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
}); });
it('renders CI Lint button', () => { it('renders CI Lint link', () => {
expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath);
}); });
it('renders Clear Runner Cache button', () => { it('renders Clear Runner Cache button', () => {
expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
}); });
it('renders pipelines table', () => { it('renders pipelines table', () => {
...@@ -139,16 +139,16 @@ describe('Pipelines', () => { ...@@ -139,16 +139,16 @@ describe('Pipelines', () => {
expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All');
}); });
it('renders Run Pipeline button', () => { it('renders Run Pipeline link', () => {
expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
}); });
it('renders CI Lint button', () => { it('renders CI Lint link', () => {
expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath);
}); });
it('renders Clear Runner Cache button', () => { it('renders Clear Runner Cache button', () => {
expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
}); });
it('renders tab empty state', () => { it('renders tab empty state', () => {
...@@ -218,7 +218,7 @@ describe('Pipelines', () => { ...@@ -218,7 +218,7 @@ describe('Pipelines', () => {
it('renders buttons', () => { it('renders buttons', () => {
expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath);
expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath);
expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); expect(vm.$el.querySelector('.js-clear-cache').textContent.trim()).toEqual('Clear Runner Caches');
}); });
it('renders error state', () => { it('renders error state', () => {
......
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