diff options
author | Sean McGivern <sean@gitlab.com> | 2019-07-03 12:28:13 +0300 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2019-07-03 12:28:13 +0300 |
commit | b94daa35a4be584623792653b537d6ab68bdabdd (patch) | |
tree | cd620ef82dc85cec1cb401c7a5cf880c47418708 | |
parent | 83330822d6ee3c59a057adeda35b23ab0021b63a (diff) | |
parent | f90a7601c40c82bd230f9c014bc4f64744e77b5e (diff) |
Merge branch 'master' into michel.engelen/gitlab-ce-issue/55953
1083 files changed, 6442 insertions, 24394 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index f65e62068d6..b865b212ac0 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -6,8 +6,8 @@ /doc/ @axil @marcia @eread @mikelewis # Frontend maintainers should see everything in `app/assets/` -app/assets/ @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya -*.scss @annabeldunstone @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya +app/assets/ @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya @pslaughter +*.scss @annabeldunstone @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya @pslaughter # Someone from the database team should review changes in `db/` db/ @abrandl @NikolayS diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml index 6e80cb530f1..45a6a177943 100644 --- a/.gitlab/ci/frontend.gitlab-ci.yml +++ b/.gitlab/ci/frontend.gitlab-ci.yml @@ -8,7 +8,7 @@ .use-pg: &use-pg services: - - name: postgres:9.6 + - name: postgres:9.6.11 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - name: redis:alpine @@ -32,7 +32,7 @@ DOCKER_HOST: tcp://docker:2375 script: - node --version - - retry yarn install --frozen-lockfile --production --cache-folder .yarn-cache + - retry yarn install --frozen-lockfile --production --cache-folder .yarn-cache --prefer-offline - free -m - retry bundle exec rake gitlab:assets:compile - time scripts/build_assets_image @@ -82,7 +82,7 @@ gitlab:assets:compile pull-cache: stage: prepare script: - node --version - - retry yarn install --frozen-lockfile --cache-folder .yarn-cache + - retry yarn install --frozen-lockfile --cache-folder .yarn-cache --prefer-offline - free -m - retry bundle exec rake gitlab:assets:compile - scripts/clean-old-cached-assets @@ -231,7 +231,7 @@ qa:selectors: before_script: [] script: - date - - yarn install --frozen-lockfile --cache-folder .yarn-cache + - yarn install --frozen-lockfile --cache-folder .yarn-cache --prefer-offline - date - yarn run webpack-prod diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 9d24099b85c..01c96e06547 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -1,6 +1,6 @@ .use-pg: &use-pg services: - - name: postgres:9.6 + - name: postgres:9.6.11 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - name: redis:alpine @@ -245,7 +245,7 @@ migration:path-pg: .db-rollback: &db-rollback extends: .dedicated-no-docs-and-no-qa-pull-cache-job script: - - bundle exec rake db:migrate VERSION=20170523121229 + - bundle exec rake db:migrate VERSION=20180101160629 - bundle exec rake db:migrate SKIP_SCHEMA_VERSION_CHECK=true dependencies: - setup-test-env diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml index 933af90c85a..61fd48fd72e 100644 --- a/.gitlab/ci/review.gitlab-ci.yml +++ b/.gitlab/ci/review.gitlab-ci.yml @@ -236,5 +236,5 @@ danger-review: script: - git version - node --version - - yarn install --frozen-lockfile --cache-folder .yarn-cache + - yarn install --frozen-lockfile --cache-folder .yarn-cache --prefer-offline - danger --fail-on-errors=true diff --git a/app/assets/javascripts/diffs/components/diff_discussion_reply.vue b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue new file mode 100644 index 00000000000..2aa5e9b3339 --- /dev/null +++ b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue @@ -0,0 +1,55 @@ +<script> +import { mapGetters } from 'vuex'; +import NoteSignedOutWidget from '~/notes/components/note_signed_out_widget.vue'; +import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue'; +import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue'; + +export default { + name: 'DiffDiscussionReply', + components: { + NoteSignedOutWidget, + ReplyPlaceholder, + UserAvatarLink, + }, + props: { + hasForm: { + type: Boolean, + required: false, + default: false, + }, + renderReplyPlaceholder: { + type: Boolean, + required: true, + }, + }, + computed: { + ...mapGetters({ + currentUser: 'getUserData', + userCanReply: 'userCanReply', + }), + }, +}; +</script> + +<template> + <div class="discussion-reply-holder d-flex clearfix"> + <template v-if="userCanReply"> + <slot v-if="hasForm" name="form"></slot> + <template v-else-if="renderReplyPlaceholder"> + <user-avatar-link + :link-href="currentUser.path" + :img-src="currentUser.avatar_url" + :img-alt="currentUser.name" + :img-size="40" + class="d-none d-sm-block" + /> + <reply-placeholder + class="qa-discussion-reply" + :button-text="__('Start a new discussion...')" + @onClick="$emit('showNewDiscussionForm')" + /> + </template> + </template> + <note-signed-out-widget v-else /> + </div> +</template> diff --git a/app/assets/javascripts/diffs/components/diff_discussions.vue b/app/assets/javascripts/diffs/components/diff_discussions.vue index 4c73eea4049..b0460bacff2 100644 --- a/app/assets/javascripts/diffs/components/diff_discussions.vue +++ b/app/assets/javascripts/diffs/components/diff_discussions.vue @@ -80,7 +80,6 @@ export default { v-show="isExpanded(discussion)" :discussion="discussion" :render-diff-file="false" - :always-expanded="true" :discussions-by-diff-order="true" :line="line" :help-page-path="helpPagePath" diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue index eb9f1465945..4b226e30699 100644 --- a/app/assets/javascripts/diffs/components/diff_file_header.vue +++ b/app/assets/javascripts/diffs/components/diff_file_header.vue @@ -151,7 +151,11 @@ export default { stickyMonitor(this.$refs.header, contentTop() - fileHeaderHeight - 1, false); }, methods: { - ...mapActions('diffs', ['toggleFileDiscussions', 'toggleFullDiff']), + ...mapActions('diffs', [ + 'toggleFileDiscussions', + 'toggleFileDiscussionWrappers', + 'toggleFullDiff', + ]), handleToggleFile(e, checkTarget) { if ( !checkTarget || @@ -165,7 +169,7 @@ export default { this.$emit('showForkMessage'); }, handleToggleDiscussions() { - this.toggleFileDiscussions(this.diffFile); + this.toggleFileDiscussionWrappers(this.diffFile); }, handleFileNameClick(e) { const isLinkToOtherPage = diff --git a/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue b/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue index e28909b7be3..af5550aec3b 100644 --- a/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue +++ b/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue @@ -1,5 +1,4 @@ <script> -import { mapActions } from 'vuex'; import Icon from '~/vue_shared/components/icon.vue'; import { pluralize, truncate } from '~/lib/utils/text_utility'; import UserAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue'; @@ -19,11 +18,13 @@ export default { type: Array, required: true, }, + discussionsExpanded: { + type: Boolean, + required: false, + default: false, + }, }, computed: { - discussionsExpanded() { - return this.discussions.every(discussion => discussion.expanded); - }, allDiscussions() { return this.discussions.reduce((acc, note) => acc.concat(note.notes), []); }, @@ -45,26 +46,14 @@ export default { }, }, methods: { - ...mapActions(['toggleDiscussion']), getTooltipText(noteData) { let { note } = noteData; - if (note.length > LENGTH_OF_AVATAR_TOOLTIP) { note = truncate(note, LENGTH_OF_AVATAR_TOOLTIP); } return `${noteData.author.name}: ${note}`; }, - toggleDiscussions() { - const forceExpanded = this.discussions.some(discussion => !discussion.expanded); - - this.discussions.forEach(discussion => { - this.toggleDiscussion({ - discussionId: discussion.id, - forceExpanded, - }); - }); - }, }, }; </script> @@ -76,7 +65,7 @@ export default { type="button" :aria-label="__('Show comments')" class="diff-notes-collapse js-diff-comment-avatar js-diff-comment-button" - @click="toggleDiscussions" + @click="$emit('toggleLineDiscussions')" > <icon :size="12" name="collapse" /> </button> @@ -87,7 +76,7 @@ export default { :img-src="note.author.avatar_url" :tooltip-text="getTooltipText(note)" class="diff-comment-avatar js-diff-comment-avatar" - @click.native="toggleDiscussions" + @click.native="$emit('toggleLineDiscussions')" /> <span v-if="moreText" @@ -97,7 +86,7 @@ export default { data-container="body" data-placement="top" role="button" - @click="toggleDiscussions" + @click="$emit('toggleLineDiscussions')" >+{{ moreCount }}</span > </template> diff --git a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue index 1281f9b17ef..351110f0a87 100644 --- a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue +++ b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue @@ -105,7 +105,13 @@ export default { }, }, methods: { - ...mapActions('diffs', ['loadMoreLines', 'showCommentForm', 'setHighlightedRow']), + ...mapActions('diffs', [ + 'loadMoreLines', + 'showCommentForm', + 'setHighlightedRow', + 'toggleLineDiscussions', + 'toggleLineDiscussionWrappers', + ]), handleCommentButton() { this.showCommentForm({ lineCode: this.line.line_code, fileHash: this.fileHash }); }, @@ -184,7 +190,14 @@ export default { @click="setHighlightedRow(lineCode)" > </a> - <diff-gutter-avatars v-if="shouldShowAvatarsOnGutter" :discussions="line.discussions" /> + <diff-gutter-avatars + v-if="shouldShowAvatarsOnGutter" + :discussions="line.discussions" + :discussions-expanded="line.discussionsExpanded" + @toggleLineDiscussions=" + toggleLineDiscussions({ lineCode, fileHash, expanded: !line.discussionsExpanded }) + " + /> </template> </div> </template> diff --git a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue index 1faa0493e79..ca3285e9afd 100644 --- a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue +++ b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue @@ -1,11 +1,14 @@ <script> -import diffDiscussions from './diff_discussions.vue'; -import diffLineNoteForm from './diff_line_note_form.vue'; +import { mapActions } from 'vuex'; +import DiffDiscussions from './diff_discussions.vue'; +import DiffLineNoteForm from './diff_line_note_form.vue'; +import DiffDiscussionReply from './diff_discussion_reply.vue'; export default { components: { - diffDiscussions, - diffLineNoteForm, + DiffDiscussions, + DiffLineNoteForm, + DiffDiscussionReply, }, props: { line: { @@ -32,10 +35,12 @@ export default { if (!this.line.discussions || !this.line.discussions.length) { return false; } - - return this.line.discussions.every(discussion => discussion.expanded); + return this.line.discussionsExpanded; }, }, + methods: { + ...mapActions('diffs', ['showCommentForm']), + }, }; </script> @@ -49,13 +54,22 @@ export default { :discussions="line.discussions" :help-page-path="helpPagePath" /> - <diff-line-note-form - v-if="line.hasForm" - :diff-file-hash="diffFileHash" - :line="line" - :note-target-line="line" - :help-page-path="helpPagePath" - /> + <diff-discussion-reply + :has-form="line.hasForm" + :render-reply-placeholder="Boolean(line.discussions.length)" + @showNewDiscussionForm=" + showCommentForm({ lineCode: line.line_code, fileHash: diffFileHash }) + " + > + <template #form> + <diff-line-note-form + :diff-file-hash="diffFileHash" + :line="line" + :note-target-line="line" + :help-page-path="helpPagePath" + /> + </template> + </diff-discussion-reply> </div> </td> </tr> diff --git a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue index d2e54edca85..c00b0e010ff 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue @@ -1,11 +1,14 @@ <script> -import diffDiscussions from './diff_discussions.vue'; -import diffLineNoteForm from './diff_line_note_form.vue'; +import { mapActions } from 'vuex'; +import DiffDiscussions from './diff_discussions.vue'; +import DiffLineNoteForm from './diff_line_note_form.vue'; +import DiffDiscussionReply from './diff_discussion_reply.vue'; export default { components: { - diffDiscussions, - diffLineNoteForm, + DiffDiscussions, + DiffLineNoteForm, + DiffDiscussionReply, }, props: { line: { @@ -29,24 +32,30 @@ export default { computed: { hasExpandedDiscussionOnLeft() { return this.line.left && this.line.left.discussions.length - ? this.line.left.discussions.every(discussion => discussion.expanded) + ? this.line.left.discussionsExpanded : false; }, hasExpandedDiscussionOnRight() { return this.line.right && this.line.right.discussions.length - ? this.line.right.discussions.every(discussion => discussion.expanded) + ? this.line.right.discussionsExpanded : false; }, hasAnyExpandedDiscussion() { return this.hasExpandedDiscussionOnLeft || this.hasExpandedDiscussionOnRight; }, shouldRenderDiscussionsOnLeft() { - return this.line.left && this.line.left.discussions && this.hasExpandedDiscussionOnLeft; + return ( + this.line.left && + this.line.left.discussions && + this.line.left.discussions.length && + this.hasExpandedDiscussionOnLeft + ); }, shouldRenderDiscussionsOnRight() { return ( this.line.right && this.line.right.discussions && + this.line.right.discussions.length && this.hasExpandedDiscussionOnRight && this.line.right.type ); @@ -81,6 +90,22 @@ export default { return hasCommentFormOnLeft || hasCommentFormOnRight; }, + shouldRenderReplyPlaceholderOnLeft() { + return Boolean( + this.line.left && this.line.left.discussions && this.line.left.discussions.length, + ); + }, + shouldRenderReplyPlaceholderOnRight() { + return Boolean( + this.line.right && this.line.right.discussions && this.line.right.discussions.length, + ); + }, + }, + methods: { + ...mapActions('diffs', ['showCommentForm']), + showNewDiscussionForm() { + this.showCommentForm({ lineCode: this.line.line_code, fileHash: this.diffFileHash }); + }, }, }; </script> @@ -90,37 +115,49 @@ export default { <td class="notes-content parallel old" colspan="2"> <div v-if="shouldRenderDiscussionsOnLeft" class="content"> <diff-discussions - v-if="line.left.discussions.length" :discussions="line.left.discussions" :line="line.left" :help-page-path="helpPagePath" /> </div> - <diff-line-note-form - v-if="showLeftSideCommentForm" - :diff-file-hash="diffFileHash" - :line="line.left" - :note-target-line="line.left" - :help-page-path="helpPagePath" - line-position="left" - /> + <diff-discussion-reply + :has-form="showLeftSideCommentForm" + :render-reply-placeholder="shouldRenderReplyPlaceholderOnLeft" + @showNewDiscussionForm="showNewDiscussionForm" + > + <template #form> + <diff-line-note-form + :diff-file-hash="diffFileHash" + :line="line.left" + :note-target-line="line.left" + :help-page-path="helpPagePath" + line-position="left" + /> + </template> + </diff-discussion-reply> </td> <td class="notes-content parallel new" colspan="2"> <div v-if="shouldRenderDiscussionsOnRight" class="content"> <diff-discussions - v-if="line.right.discussions.length" :discussions="line.right.discussions" :line="line.right" :help-page-path="helpPagePath" /> </div> - <diff-line-note-form - v-if="showRightSideCommentForm" - :diff-file-hash="diffFileHash" - :line="line.right" - :note-target-line="line.right" - line-position="right" - /> + <diff-discussion-reply + :has-form="showRightSideCommentForm" + :render-reply-placeholder="shouldRenderReplyPlaceholderOnRight" + @showNewDiscussionForm="showNewDiscussionForm" + > + <template #form> + <diff-line-note-form + :diff-file-hash="diffFileHash" + :line="line.right" + :note-target-line="line.right" + line-position="right" + /> + </template> + </diff-discussion-reply> </td> </tr> </template> diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 88d7b4bba63..32e0d8f42ee 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -12,6 +12,7 @@ import { getNoteFormData, convertExpandLines, idleCallback, + allDiscussionWrappersExpanded, } from './utils'; import * as types from './mutation_types'; import { @@ -79,6 +80,7 @@ export const assignDiscussionsToDiff = ( discussions = rootState.notes.discussions, ) => { const diffPositionByLineCode = getDiffPositionByLineCode(state.diffFiles); + const hash = getLocationHash(); discussions .filter(discussion => discussion.diff_discussion) @@ -86,6 +88,7 @@ export const assignDiscussionsToDiff = ( commit(types.SET_LINE_DISCUSSIONS_FOR_FILE, { discussion, diffPositionByLineCode, + hash, }); }); @@ -99,6 +102,10 @@ export const removeDiscussionsFromDiff = ({ commit }, removeDiscussion) => { commit(types.REMOVE_LINE_DISCUSSIONS_FOR_FILE, { fileHash: file_hash, lineCode: line_code, id }); }; +export const toggleLineDiscussions = ({ commit }, options) => { + commit(types.TOGGLE_LINE_DISCUSSIONS, options); +}; + export const renderFileForDiscussionId = ({ commit, rootState, state }, discussionId) => { const discussion = rootState.notes.discussions.find(d => d.id === discussionId); @@ -257,6 +264,31 @@ export const toggleFileDiscussions = ({ getters, dispatch }, diff) => { }); }; +export const toggleFileDiscussionWrappers = ({ commit }, diff) => { + const discussionWrappersExpanded = allDiscussionWrappersExpanded(diff); + let linesWithDiscussions; + if (diff.highlighted_diff_lines) { + linesWithDiscussions = diff.highlighted_diff_lines.filter(line => line.discussions.length); + } + if (diff.parallel_diff_lines) { + linesWithDiscussions = diff.parallel_diff_lines.filter( + line => + (line.left && line.left.discussions.length) || + (line.right && line.right.discussions.length), + ); + } + + if (linesWithDiscussions.length) { + linesWithDiscussions.forEach(line => { + commit(types.TOGGLE_LINE_DISCUSSIONS, { + fileHash: diff.file_hash, + lineCode: line.line_code, + expanded: !discussionWrappersExpanded, + }); + }); + } +}; + export const saveDiffDiscussion = ({ state, dispatch }, { note, formData }) => { const postData = getNoteFormData({ commit: state.commit, @@ -267,7 +299,7 @@ export const saveDiffDiscussion = ({ state, dispatch }, { note, formData }) => { return dispatch('saveNote', postData, { root: true }) .then(result => dispatch('updateDiscussion', result.discussion, { root: true })) .then(discussion => dispatch('assignDiscussionsToDiff', [discussion])) - .then(() => dispatch('updateResolvableDiscussonsCounts', null, { root: true })) + .then(() => dispatch('updateResolvableDiscussionsCounts', null, { root: true })) .then(() => dispatch('closeDiffFileCommentForm', formData.diffFile.file_hash)) .catch(() => createFlash(s__('MergeRequests|Saving the comment failed'))); }; diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js index 8d6111da500..9db56331faa 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -35,3 +35,5 @@ export const ADD_CURRENT_VIEW_DIFF_FILE_LINES = 'ADD_CURRENT_VIEW_DIFF_FILE_LINE export const TOGGLE_DIFF_FILE_RENDERING_MORE = 'TOGGLE_DIFF_FILE_RENDERING_MORE'; export const SET_SHOW_SUGGEST_POPOVER = 'SET_SHOW_SUGGEST_POPOVER'; + +export const TOGGLE_LINE_DISCUSSIONS = 'TOGGLE_LINE_DISCUSSIONS'; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 00181a63c43..a66f205bbbd 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -6,6 +6,7 @@ import { addContextLines, prepareDiffData, isDiscussionApplicableToLine, + updateLineInFile, } from './utils'; import * as types from './mutation_types'; @@ -109,7 +110,7 @@ export default { })); }, - [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { discussion, diffPositionByLineCode }) { + [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { discussion, diffPositionByLineCode, hash }) { const { latestDiff } = state; const discussionLineCode = discussion.line_code; @@ -130,13 +131,27 @@ export default { : [], }); + const setDiscussionsExpanded = line => { + const isLineNoteTargeted = line.discussions.some( + disc => disc.notes && disc.notes.find(note => hash === `note_${note.id}`), + ); + + return { + ...line, + discussionsExpanded: + line.discussions && line.discussions.length + ? line.discussions.some(disc => !disc.resolved) || isLineNoteTargeted + : false, + }; + }; + state.diffFiles = state.diffFiles.map(diffFile => { if (diffFile.file_hash === fileHash) { const file = { ...diffFile }; if (file.highlighted_diff_lines) { file.highlighted_diff_lines = file.highlighted_diff_lines.map(line => - lineCheck(line) ? mapDiscussions(line) : line, + setDiscussionsExpanded(lineCheck(line) ? mapDiscussions(line) : line), ); } @@ -148,8 +163,10 @@ export default { if (left || right) { return { ...line, - left: line.left ? mapDiscussions(line.left) : null, - right: line.right ? mapDiscussions(line.right, () => !left) : null, + left: line.left ? setDiscussionsExpanded(mapDiscussions(line.left)) : null, + right: line.right + ? setDiscussionsExpanded(mapDiscussions(line.right, () => !left)) + : null, }; } @@ -173,32 +190,11 @@ export default { [types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, { fileHash, lineCode }) { const selectedFile = state.diffFiles.find(f => f.file_hash === fileHash); if (selectedFile) { - if (selectedFile.parallel_diff_lines) { - const targetLine = selectedFile.parallel_diff_lines.find( - line => - (line.left && line.left.line_code === lineCode) || - (line.right && line.right.line_code === lineCode), - ); - if (targetLine) { - const side = targetLine.left && targetLine.left.line_code === lineCode ? 'left' : 'right'; - - Object.assign(targetLine[side], { - discussions: targetLine[side].discussions.filter(discussion => discussion.notes.length), - }); - } - } - - if (selectedFile.highlighted_diff_lines) { - const targetInlineLine = selectedFile.highlighted_diff_lines.find( - line => line.line_code === lineCode, - ); - - if (targetInlineLine) { - Object.assign(targetInlineLine, { - discussions: targetInlineLine.discussions.filter(discussion => discussion.notes.length), - }); - } - } + updateLineInFile(selectedFile, lineCode, line => + Object.assign(line, { + discussions: line.discussions.filter(discussion => discussion.notes.length), + }), + ); if (selectedFile.discussions && selectedFile.discussions.length) { selectedFile.discussions = selectedFile.discussions.filter( @@ -207,6 +203,15 @@ export default { } } }, + + [types.TOGGLE_LINE_DISCUSSIONS](state, { fileHash, lineCode, expanded }) { + const selectedFile = state.diffFiles.find(f => f.file_hash === fileHash); + + updateLineInFile(selectedFile, lineCode, line => + Object.assign(line, { discussionsExpanded: expanded }), + ); + }, + [types.TOGGLE_FOLDER_OPEN](state, path) { state.treeEntries[path].opened = !state.treeEntries[path].opened; }, diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index 71956255eef..1c3ed84001c 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -454,3 +454,48 @@ export const convertExpandLines = ({ }; export const idleCallback = cb => requestIdleCallback(cb); + +export const updateLineInFile = (selectedFile, lineCode, updateFn) => { + if (selectedFile.parallel_diff_lines) { + const targetLine = selectedFile.parallel_diff_lines.find( + line => + (line.left && line.left.line_code === lineCode) || + (line.right && line.right.line_code === lineCode), + ); + if (targetLine) { + const side = targetLine.left && targetLine.left.line_code === lineCode ? 'left' : 'right'; + + updateFn(targetLine[side]); + } + } + if (selectedFile.highlighted_diff_lines) { + const targetInlineLine = selectedFile.highlighted_diff_lines.find( + line => line.line_code === lineCode, + ); + + if (targetInlineLine) { + updateFn(targetInlineLine); + } + } +}; + +export const allDiscussionWrappersExpanded = diff => { + const discussionsExpandedArray = []; + if (diff.parallel_diff_lines) { + diff.parallel_diff_lines.forEach(line => { + if (line.left && line.left.discussions.length) { + discussionsExpandedArray.push(line.left.discussionsExpanded); + } + if (line.right && line.right.discussions.length) { + discussionsExpandedArray.push(line.right.discussionsExpanded); + } + }); + } else if (diff.highlighted_diff_lines) { + diff.parallel_diff_lines.forEach(line => { + if (line.discussions.length) { + discussionsExpandedArray.push(line.discussionsExpanded); + } + }); + } + return discussionsExpandedArray.every(el => el); +}; diff --git a/app/assets/javascripts/group.js b/app/assets/javascripts/group.js index 903c838e266..460174caf4d 100644 --- a/app/assets/javascripts/group.js +++ b/app/assets/javascripts/group.js @@ -1,5 +1,5 @@ import $ from 'jquery'; -import { slugifyWithHyphens } from './lib/utils/text_utility'; +import { slugify } from './lib/utils/text_utility'; export default class Group { constructor() { @@ -14,7 +14,7 @@ export default class Group { } update() { - const slug = slugifyWithHyphens(this.groupName.val()); + const slug = slugify(this.groupName.val()); this.groupPath.val(slug); } diff --git a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue index 4be4b02ac1e..c8fbc3cb9f1 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue @@ -107,7 +107,8 @@ export default { @click="openFileInEditor" > <span class="multi-file-commit-list-file-path d-flex align-items-center"> - <file-icon :file-name="file.name" class="append-right-8" />{{ file.name }} + <file-icon :file-name="file.name" class="append-right-8" /> + {{ file.name }} </span> <div class="ml-auto d-flex align-items-center"> <div class="d-flex align-items-center ide-commit-list-changed-icon"> diff --git a/app/assets/javascripts/ide/components/external_link.vue b/app/assets/javascripts/ide/components/external_link.vue index 954f84cea17..d1857f0176a 100644 --- a/app/assets/javascripts/ide/components/external_link.vue +++ b/app/assets/javascripts/ide/components/external_link.vue @@ -27,7 +27,7 @@ export default { target="_blank" rel="noopener noreferrer" > - <span class="vertical-align-middle">Open in file view</span> + <span class="vertical-align-middle">{{ __('Open in file view') }}</span> <icon :size="16" name="external-link" css-classes="vertical-align-middle space-right" /> </a> </div> diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue index f952b1e7b80..5fcb11a232e 100644 --- a/app/assets/javascripts/ide/components/repo_editor.vue +++ b/app/assets/javascripts/ide/components/repo_editor.vue @@ -8,6 +8,7 @@ import { activityBarViews, viewerTypes } from '../constants'; import Editor from '../lib/editor'; import ExternalLink from './external_link.vue'; import FileTemplatesBar from './file_templates/bar.vue'; +import { __ } from '~/locale'; export default { components: { @@ -160,7 +161,14 @@ export default { this.createEditorInstance(); }) .catch(err => { - flash('Error setting up editor. Please try again.', 'alert', document, null, false, true); + flash( + __('Error setting up editor. Please try again.'), + 'alert', + document, + null, + false, + true, + ); throw err; }); }, @@ -247,12 +255,8 @@ export default { role="button" @click.prevent="setFileViewMode({ file, viewMode: 'editor' })" > - <template v-if="viewer === $options.viewerTypes.edit"> - {{ __('Edit') }} - </template> - <template v-else> - {{ __('Review') }} - </template> + <template v-if="viewer === $options.viewerTypes.edit">{{ __('Edit') }}</template> + <template v-else>{{ __('Review') }}</template> </a> </li> <li v-if="file.previewMode" :class="previewTabCSS"> @@ -260,9 +264,8 @@ export default { href="javascript:void(0);" role="button" @click.prevent="setFileViewMode({ file, viewMode: 'preview' })" + >{{ file.previewMode.previewTitle }}</a > - {{ file.previewMode.previewTitle }} - </a> </li> </ul> <external-link :file="file" /> diff --git a/app/assets/javascripts/ide/components/repo_file_status_icon.vue b/app/assets/javascripts/ide/components/repo_file_status_icon.vue index a964d90b090..84a962bfc7d 100644 --- a/app/assets/javascripts/ide/components/repo_file_status_icon.vue +++ b/app/assets/javascripts/ide/components/repo_file_status_icon.vue @@ -1,4 +1,5 @@ <script> +import { __, sprintf } from '~/locale'; import icon from '~/vue_shared/components/icon.vue'; import tooltip from '~/vue_shared/directives/tooltip'; import '~/lib/utils/datetime_utility'; @@ -18,7 +19,9 @@ export default { }, computed: { lockTooltip() { - return `Locked by ${this.file.file_lock.user.name}`; + return sprintf(__(`Locked by %{fileLockUserName}`), { + fileLockUserName: this.file.file_lock.user.name, + }); }, }, }; diff --git a/app/assets/javascripts/ide/components/repo_tab.vue b/app/assets/javascripts/ide/components/repo_tab.vue index f6aa2295844..7615cfc966e 100644 --- a/app/assets/javascripts/ide/components/repo_tab.vue +++ b/app/assets/javascripts/ide/components/repo_tab.vue @@ -1,4 +1,5 @@ <script> +import { __, sprintf } from '~/locale'; import { mapActions } from 'vuex'; import FileIcon from '~/vue_shared/components/file_icon.vue'; @@ -27,9 +28,9 @@ export default { computed: { closeLabel() { if (this.fileHasChanged) { - return `${this.tab.name} changed`; + return sprintf(__(`%{tabname} changed`), { tabname: this.tab.name }); } - return `Close ${this.tab.name}`; + return sprintf(__(`Close %{tabname}`, { tabname: this.tab.name })); }, showChangedIcon() { if (this.tab.pending) return true; diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js index cc1d85fd97d..d38f59b5861 100644 --- a/app/assets/javascripts/lib/utils/text_utility.js +++ b/app/assets/javascripts/lib/utils/text_utility.js @@ -44,11 +44,18 @@ export const pluralize = (str, count) => str + (count > 1 || count === 0 ? 's' : export const dasherize = str => str.replace(/[_\s]+/g, '-'); /** - * Replaces whitespaces with hyphens and converts to lower case + * Replaces whitespaces with hyphens, convert to lower case and remove non-allowed special characters * @param {String} str * @returns {String} */ -export const slugifyWithHyphens = str => str.toLowerCase().replace(/\s+/g, '-'); +export const slugify = str => { + const slug = str + .trim() + .toLowerCase() + .replace(/[^a-zA-Z0-9_.-]+/g, '-'); + + return slug === '-' ? '' : slug; +}; /** * Replaces whitespaces with underscore and converts to lower case diff --git a/app/assets/javascripts/manual_ordering.js b/app/assets/javascripts/manual_ordering.js index e16ddbfef7e..012d1e70410 100644 --- a/app/assets/javascripts/manual_ordering.js +++ b/app/assets/javascripts/manual_ordering.js @@ -21,7 +21,7 @@ const updateIssue = (url, issueList, { move_before_id, move_after_id }) => const initManualOrdering = () => { const issueList = document.querySelector('.manual-ordering'); - if (!issueList || !(gon.features && gon.features.manualSorting)) { + if (!issueList || !(gon.features && gon.features.manualSorting) || !(gon.current_user_id > 0)) { return; } diff --git a/app/assets/javascripts/notes/components/discussion_actions.vue b/app/assets/javascripts/notes/components/discussion_actions.vue index 1357a5268d6..f4570c1292c 100644 --- a/app/assets/javascripts/notes/components/discussion_actions.vue +++ b/app/assets/javascripts/notes/components/discussion_actions.vue @@ -39,15 +39,23 @@ export default { </script> <template> - <div class="discussion-with-resolve-btn clearfix"> - <reply-placeholder class="qa-discussion-reply" @onClick="$emit('showReplyForm')" /> - - <div class="btn-group discussion-actions" role="group"> - <resolve-discussion-button - v-if="discussion.resolvable" - :is-resolving="isResolving" - :button-title="resolveButtonTitle" - @onClick="$emit('resolve')" + <div class="discussion-with-resolve-btn"> + <reply-placeholder + :button-text="s__('MergeRequests|Reply...')" + class="qa-discussion-reply" + @onClick="$emit('showReplyForm')" + /> + <resolve-discussion-button + v-if="discussion.resolvable" + :is-resolving="isResolving" + :button-title="resolveButtonTitle" + @onClick="$emit('resolve')" + /> + <div v-if="discussion.resolvable" class="btn-group discussion-actions ml-sm-2" role="group"> + <resolve-with-issue-button v-if="resolveWithIssuePath" :url="resolveWithIssuePath" /> + <jump-to-next-discussion-button + v-if="shouldShowJumpToNextDiscussion" + @onClick="$emit('jumpToNextDiscussion')" /> <resolve-with-issue-button v-if="discussion.resolvable && resolveWithIssuePath" diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue index 30971ad5227..2ff0fee62f3 100644 --- a/app/assets/javascripts/notes/components/discussion_notes.vue +++ b/app/assets/javascripts/notes/components/discussion_notes.vue @@ -1,11 +1,11 @@ <script> -import { mapGetters } from 'vuex'; +import { mapGetters, mapActions } from 'vuex'; import { SYSTEM_NOTE } from '../constants'; import { __ } from '~/locale'; -import NoteableNote from './noteable_note.vue'; -import PlaceholderNote from '../../vue_shared/components/notes/placeholder_note.vue'; -import PlaceholderSystemNote from '../../vue_shared/components/notes/placeholder_system_note.vue'; +import PlaceholderNote from '~/vue_shared/components/notes/placeholder_note.vue'; +import PlaceholderSystemNote from '~/vue_shared/components/notes/placeholder_system_note.vue'; import SystemNote from '~/vue_shared/components/notes/system_note.vue'; +import NoteableNote from './noteable_note.vue'; import ToggleRepliesWidget from './toggle_replies_widget.vue'; import NoteEditedText from './note_edited_text.vue'; @@ -72,6 +72,7 @@ export default { }, }, methods: { + ...mapActions(['toggleDiscussion']), componentName(note) { if (note.isPlaceholderNote) { if (note.placeholderType === SYSTEM_NOTE) { @@ -101,7 +102,7 @@ export default { <component :is="componentName(firstNote)" :note="componentData(firstNote)" - :line="line" + :line="line || diffLine" :commit="commit" :help-page-path="helpPagePath" :show-reply-button="userCanReply" @@ -118,23 +119,29 @@ export default { /> <slot slot="avatar-badge" name="avatar-badge"></slot> </component> - <toggle-replies-widget - v-if="hasReplies" - :collapsed="!isExpanded" - :replies="replies" - @toggle="$emit('toggleDiscussion')" - /> - <template v-if="isExpanded"> - <component - :is="componentName(note)" - v-for="note in replies" - :key="note.id" - :note="componentData(note)" - :help-page-path="helpPagePath" - :line="line" - @handleDeleteNote="$emit('deleteNote')" + <div + :class="discussion.diff_discussion ? 'discussion-collapsible bordered-box clearfix' : ''" + > + <toggle-replies-widget + v-if="hasReplies" + :collapsed="!isExpanded" + :replies="replies" + :class="{ 'discussion-toggle-replies': discussion.diff_discussion }" + @toggle="toggleDiscussion({ discussionId: discussion.id })" /> - </template> + <template v-if="isExpanded"> + <component + :is="componentName(note)" + v-for="note in replies" + :key="note.id" + :note="componentData(note)" + :help-page-path="helpPagePath" + :line="line" + @handleDeleteNote="$emit('deleteNote')" + /> + </template> + <slot :show-replies="isExpanded || !hasReplies" name="footer"></slot> + </div> </template> <template v-else> <component @@ -148,8 +155,8 @@ export default { > <slot v-if="index === 0" slot="avatar-badge" name="avatar-badge"></slot> </component> + <slot :show-replies="isExpanded || !hasReplies" name="footer"></slot> </template> </ul> - <slot :show-replies="isExpanded || !hasReplies" name="footer"></slot> </div> </template> diff --git a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue index ea590905e3c..0204169214b 100644 --- a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue +++ b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue @@ -1,6 +1,12 @@ <script> export default { name: 'ReplyPlaceholder', + props: { + buttonText: { + type: String, + required: true, + }, + }, }; </script> @@ -12,6 +18,6 @@ export default { :title="s__('MergeRequests|Add a reply')" @click="$emit('onClick')" > - {{ s__('MergeRequests|Reply...') }} + {{ buttonText }} </button> </template> diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue index 0031056ad4f..a71a89cfffc 100644 --- a/app/assets/javascripts/notes/components/noteable_discussion.vue +++ b/app/assets/javascripts/notes/components/noteable_discussion.vue @@ -132,7 +132,7 @@ export default { return this.discussion.diff_discussion && this.renderDiffFile; }, shouldGroupReplies() { - return !this.shouldRenderDiffs && !this.discussion.diff_discussion; + return !this.shouldRenderDiffs; }, wrapperComponent() { return this.shouldRenderDiffs ? diffWithNote : 'div'; @@ -248,6 +248,11 @@ export default { clearDraft(this.autosaveKey); }, saveReply(noteText, form, callback) { + if (!noteText) { + this.cancelReplyForm(); + callback(); + return; + } const postData = { in_reply_to_discussion_id: this.discussion.reply_id, target_type: this.getNoteableData.targetType, @@ -361,7 +366,6 @@ Please check your network connection and try again.`; :line="line" :should-group-replies="shouldGroupReplies" @startReplying="showReplyForm" - @toggleDiscussion="toggleDiscussionHandler" @deleteNote="deleteNoteHandler" > <slot slot="avatar-badge" name="avatar-badge"></slot> @@ -374,7 +378,7 @@ Please check your network connection and try again.`; <div v-else-if="showReplies" :class="{ 'is-replying': isReplying }" - class="discussion-reply-holder" + class="discussion-reply-holder clearfix" > <user-avatar-link v-if="!isReplying && userCanReply" diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js index 63658d49a05..9054b4779aa 100644 --- a/app/assets/javascripts/notes/stores/actions.js +++ b/app/assets/javascripts/notes/stores/actions.js @@ -51,7 +51,7 @@ export const fetchDiscussions = ({ commit, dispatch }, { path, filter }) => .then(res => res.json()) .then(discussions => { commit(types.SET_INITIAL_DISCUSSIONS, discussions); - dispatch('updateResolvableDiscussonsCounts'); + dispatch('updateResolvableDiscussionsCounts'); }); export const updateDiscussion = ({ commit, state }, discussion) => { @@ -67,7 +67,7 @@ export const deleteNote = ({ commit, dispatch, state }, note) => commit(types.DELETE_NOTE, note); dispatch('updateMergeRequestWidget'); - dispatch('updateResolvableDiscussonsCounts'); + dispatch('updateResolvableDiscussionsCounts'); if (isInMRPage()) { dispatch('diffs/removeDiscussionsFromDiff', discussion); @@ -117,7 +117,7 @@ export const replyToDiscussion = ({ commit, state, getters, dispatch }, { endpoi dispatch('updateMergeRequestWidget'); dispatch('startTaskList'); - dispatch('updateResolvableDiscussonsCounts'); + dispatch('updateResolvableDiscussionsCounts'); } else { commit(types.ADD_NEW_REPLY_TO_DISCUSSION, res); } @@ -135,7 +135,7 @@ export const createNewNote = ({ commit, dispatch }, { endpoint, data }) => dispatch('updateMergeRequestWidget'); dispatch('startTaskList'); - dispatch('updateResolvableDiscussonsCounts'); + dispatch('updateResolvableDiscussionsCounts'); } return res; }); @@ -168,7 +168,7 @@ export const toggleResolveNote = ({ commit, dispatch }, { endpoint, isResolved, commit(mutationType, res); - dispatch('updateResolvableDiscussonsCounts'); + dispatch('updateResolvableDiscussionsCounts'); dispatch('updateMergeRequestWidget'); }); @@ -442,7 +442,7 @@ export const startTaskList = ({ dispatch }) => }), ); -export const updateResolvableDiscussonsCounts = ({ commit }) => +export const updateResolvableDiscussionsCounts = ({ commit }) => commit(types.UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS); export const submitSuggestion = ( diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue index 185003c306e..015c1527500 100644 --- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue +++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue @@ -4,14 +4,12 @@ import { glEmojiTag } from '~/emoji'; import detailedMetric from './detailed_metric.vue'; import requestSelector from './request_selector.vue'; -import simpleMetric from './simple_metric.vue'; import { s__ } from '~/locale'; export default { components: { detailedMetric, requestSelector, - simpleMetric, }, props: { store: { @@ -43,8 +41,13 @@ export default { details: 'details', keys: ['feature', 'request'], }, + { + metric: 'redis', + header: 'Redis calls', + details: 'details', + keys: ['cmd'], + }, ], - simpleMetrics: ['redis'], data() { return { currentRequestId: '' }; }, @@ -124,12 +127,6 @@ export default { </button> <a v-else :href="profileUrl">{{ s__('PerformanceBar|profile') }}</a> </div> - <simple-metric - v-for="metric in $options.simpleMetrics" - :key="metric" - :current-request="currentRequest" - :metric="metric" - /> <div id="peek-view-gc" class="view"> <span v-if="currentRequest.details" class="bold"> <span title="Invoke Time">{{ currentRequest.details.gc.gc_time }}</span diff --git a/app/assets/javascripts/performance_bar/components/simple_metric.vue b/app/assets/javascripts/performance_bar/components/simple_metric.vue deleted file mode 100644 index 358a57d5bc5..00000000000 --- a/app/assets/javascripts/performance_bar/components/simple_metric.vue +++ /dev/null @@ -1,33 +0,0 @@ -<script> -export default { - props: { - currentRequest: { - type: Object, - required: true, - }, - metric: { - type: String, - required: true, - }, - }, - computed: { - duration() { - return ( - this.currentRequest.details[this.metric] && - this.currentRequest.details[this.metric].duration - ); - }, - calls() { - return ( - this.currentRequest.details[this.metric] && this.currentRequest.details[this.metric].calls - ); - }, - }, -}; -</script> -<template> - <div :id="`peek-view-${metric}`" class="view"> - <span v-if="currentRequest.details" class="bold"> {{ duration }} / {{ calls }} </span> - {{ metric }} - </div> -</template> diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js index ea82ff4e340..9066844f687 100644 --- a/app/assets/javascripts/projects/project_new.js +++ b/app/assets/javascripts/projects/project_new.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import { addSelectOnFocusBehaviour } from '../lib/utils/common_utils'; -import { slugifyWithHyphens } from '../lib/utils/text_utility'; +import { slugify } from '../lib/utils/text_utility'; import { s__ } from '~/locale'; let hasUserDefinedProjectPath = false; @@ -34,7 +34,7 @@ const deriveProjectPathFromUrl = $projectImportUrl => { }; const onProjectNameChange = ($projectNameInput, $projectPathInput) => { - const slug = slugifyWithHyphens($projectNameInput.val()); + const slug = slugify($projectNameInput.val()); $projectPathInput.val(slug); }; diff --git a/app/assets/javascripts/registry/components/app.vue b/app/assets/javascripts/registry/components/app.vue index ee973017387..7752723baac 100644 --- a/app/assets/javascripts/registry/components/app.vue +++ b/app/assets/javascripts/registry/components/app.vue @@ -3,22 +3,81 @@ import { mapGetters, mapActions } from 'vuex'; import { GlLoadingIcon } from '@gitlab/ui'; import store from '../stores'; import CollapsibleContainer from './collapsible_container.vue'; +import SvgMessage from './svg_message.vue'; +import { s__, sprintf } from '../../locale'; export default { name: 'RegistryListApp', components: { CollapsibleContainer, GlLoadingIcon, + SvgMessage, }, props: { endpoint: { type: String, required: true, }, + characterError: { + type: Boolean, + required: false, + default: false, + }, + helpPagePath: { + type: String, + required: true, + }, + noContainersImage: { + type: String, + required: true, + }, + containersErrorImage: { + type: String, + required: true, + }, + repositoryUrl: { + type: String, + required: true, + }, }, store, computed: { ...mapGetters(['isLoading', 'repos']), + dockerConnectionErrorText() { + return sprintf( + s__(`ContainerRegistry|We are having trouble connecting to Docker, which could be due to an + issue with your project name or path. For more information, please review the + %{docLinkStart}Container Registry documentation%{docLinkEnd}.`), + { + docLinkStart: `<a href="${this.helpPagePath}#docker-connection-error">`, + docLinkEnd: '</a>', + }, + false, + ); + }, + introText() { + return sprintf( + s__(`ContainerRegistry|With the Docker Container Registry integrated into GitLab, every + project can have its own space to store its Docker images. Learn more about the + %{docLinkStart}Container Registry%{docLinkEnd}.`), + { + docLinkStart: `<a href="${this.helpPagePath}">`, + docLinkEnd: '</a>', + }, + false, + ); + }, + noContainerImagesText() { + return sprintf( + s__(`ContainerRegistry|With the Container Registry, every project can have its own space to + store its Docker images. Learn more about the %{docLinkStart}Container Registry%{docLinkEnd}.`), + { + docLinkStart: `<a href="${this.helpPagePath}">`, + docLinkEnd: '</a>', + }, + false, + ); + }, }, created() { this.setMainEndpoint(this.endpoint); @@ -33,20 +92,44 @@ export default { </script> <template> <div> - <gl-loading-icon v-if="isLoading" size="md" /> + <svg-message v-if="characterError" id="invalid-characters" :svg-path="containersErrorImage"> + <h4> + {{ s__('ContainerRegistry|Docker connection error') }} + </h4> + <p v-html="dockerConnectionErrorText"></p> + </svg-message> + + <gl-loading-icon v-else-if="isLoading" size="md" class="prepend-top-16" /> + + <div v-else-if="!isLoading && !characterError && repos.length"> + <h4>{{ s__('ContainerRegistry|Container Registry') }}</h4> + <p v-html="introText"></p> + <collapsible-container v-for="item in repos" :key="item.id" :repo="item" /> + </div> + + <svg-message + v-else-if="!isLoading && !characterError && !repos.length" + id="no-container-images" + :svg-path="noContainersImage" + > + <h4> + {{ s__('ContainerRegistry|There are no container images stored for this project') }} + </h4> + <p v-html="noContainerImagesText"></p> - <collapsible-container - v-for="item in repos" - v-else-if="!isLoading && repos.length" - :key="item.id" - :repo="item" - /> + <h5>{{ s__('ContainerRegistry|Quick Start') }}</h5> + <p> + {{ + s__( + 'ContainerRegistry|You can add an image to this registry with the following commands:', + ) + }} + </p> - <p v-else-if="!isLoading && !repos.length"> - {{ - __(`No container images stored for this project. - Add one by following the instructions above.`) - }} - </p> + <pre> + docker build -t {{ repositoryUrl }} . + docker push {{ repositoryUrl }} + </pre> + </svg-message> </div> </template> diff --git a/app/assets/javascripts/registry/components/svg_message.vue b/app/assets/javascripts/registry/components/svg_message.vue new file mode 100644 index 00000000000..d0d44bf2d14 --- /dev/null +++ b/app/assets/javascripts/registry/components/svg_message.vue @@ -0,0 +1,24 @@ +<script> +export default { + name: 'RegistrySvgMessage', + props: { + id: { + type: String, + required: true, + }, + svgPath: { + type: String, + required: true, + }, + }, +}; +</script> + +<template> + <div :id="id" class="empty-state container-message mw-70p"> + <div class="svg-content"> + <img :src="svgPath" class="flex-align-self-center" /> + </div> + <slot></slot> + </div> +</template> diff --git a/app/assets/javascripts/registry/index.js b/app/assets/javascripts/registry/index.js index 025afefe7f0..d8daec29fda 100644 --- a/app/assets/javascripts/registry/index.js +++ b/app/assets/javascripts/registry/index.js @@ -14,12 +14,22 @@ export default () => const { dataset } = document.querySelector(this.$options.el); return { endpoint: dataset.endpoint, + characterError: Boolean(dataset.characterError), + helpPagePath: dataset.helpPagePath, + noContainersImage: dataset.noContainersImage, + containersErrorImage: dataset.containersErrorImage, + repositoryUrl: dataset.repositoryUrl, }; }, render(createElement) { return createElement('registry-app', { props: { endpoint: this.endpoint, + characterError: this.characterError, + helpPagePath: this.helpPagePath, + noContainersImage: this.noContainersImage, + containersErrorImage: this.containersErrorImage, + repositoryUrl: this.repositoryUrl, }, }); }, diff --git a/app/assets/javascripts/releases/components/release_block.vue b/app/assets/javascripts/releases/components/release_block.vue index c82b65cd97b..0031ba04d78 100644 --- a/app/assets/javascripts/releases/components/release_block.vue +++ b/app/assets/javascripts/releases/components/release_block.vue @@ -28,7 +28,7 @@ export default { computed: { releasedTimeAgo() { return sprintf(__('released %{time}'), { - time: this.timeFormated(this.release.created_at), + time: this.timeFormated(this.release.released_at), }); }, userImageAltDescription() { @@ -56,8 +56,8 @@ export default { <div class="card-body"> <h2 class="card-title mt-0"> {{ release.name }} - <gl-badge v-if="release.pre_release" variant="warning" class="align-middle">{{ - __('Pre-release') + <gl-badge v-if="release.upcoming_release" variant="warning" class="align-middle">{{ + __('Upcoming Release') }}</gl-badge> </h2> @@ -74,7 +74,7 @@ export default { <div class="append-right-4"> • - <span v-gl-tooltip.bottom :title="tooltipTitle(release.created_at)"> + <span v-gl-tooltip.bottom :title="tooltipTitle(release.released_at)"> {{ releasedTimeAgo }} </span> </div> diff --git a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue index baed26a157c..af02b8969ee 100644 --- a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue +++ b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue @@ -39,7 +39,7 @@ export default { </script> <template> - <timeline-entry-item class="note being-posted fade-in-half"> + <timeline-entry-item class="note note-wrapper being-posted fade-in-half"> <div class="timeline-icon"> <user-avatar-link :link-href="getUserData.path" diff --git a/app/assets/stylesheets/pages/container_registry.scss b/app/assets/stylesheets/pages/container_registry.scss index dfff3e15556..cca5214a508 100644 --- a/app/assets/stylesheets/pages/container_registry.scss +++ b/app/assets/stylesheets/pages/container_registry.scss @@ -2,6 +2,12 @@ * Container Registry */ +.container-message { + pre { + white-space: pre-line; + } +} + .container-image { border-bottom: 1px solid $white-normal; } diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index d2d35d91e0b..623c44e062f 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -1093,6 +1093,17 @@ table.code { line-height: 0; } +.discussion-collapsible { + margin: 0 $gl-padding $gl-padding 71px; +} + +.parallel { + .discussion-collapsible { + margin: $gl-padding; + margin-top: 0; + } +} + @media (max-width: map-get($grid-breakpoints, md)-1) { .diffs .files { @include fixed-width-container; @@ -1110,6 +1121,11 @@ table.code { padding-right: 0; } } + + .discussion-collapsible { + margin: $gl-padding; + margin-top: 0; + } } .image-diff-overlay, diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index e880b941d67..7bd1a4138e4 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -134,6 +134,16 @@ $note-form-margin-left: 72px; } } + .discussion-toggle-replies { + border-top: 0; + border-radius: 4px 4px 0 0; + + &.collapsed { + border: 0; + border-radius: 4px; + } + } + .note-created-ago, .note-updated-at { white-space: normal; @@ -462,6 +472,14 @@ $note-form-margin-left: 72px; position: relative; } + .notes-content .discussion-notes.diff-discussions { + border-bottom: 1px solid $border-color; + + &:nth-last-child(1) { + border-bottom: 0; + } + } + .notes_holder { font-family: $regular-font; @@ -517,6 +535,17 @@ $note-form-margin-left: 72px; .discussion-reply-holder { border-radius: 0 0 $border-radius-default $border-radius-default; position: relative; + + .discussion-form { + width: 100%; + background-color: $gray-light; + padding: 0; + } + + .disabled-comment { + padding: $gl-vert-padding 0; + width: 100%; + } } } diff --git a/app/controllers/projects/registry/repositories_controller.rb b/app/controllers/projects/registry/repositories_controller.rb index 6d60117c37d..e205e2fd4f8 100644 --- a/app/controllers/projects/registry/repositories_controller.rb +++ b/app/controllers/projects/registry/repositories_controller.rb @@ -46,6 +46,8 @@ module Projects repository.save! if repository.has_tags? end end + rescue ContainerRegistry::Path::InvalidRegistryPathError + @character_error = true end end end diff --git a/app/controllers/projects/settings/repository_controller.rb b/app/controllers/projects/settings/repository_controller.rb index ac3004d069f..bc2ce15286f 100644 --- a/app/controllers/projects/settings/repository_controller.rb +++ b/app/controllers/projects/settings/repository_controller.rb @@ -99,7 +99,7 @@ module Projects end def deploy_token_params - params.require(:deploy_token).permit(:name, :expires_at, :read_repository, :read_registry) + params.require(:deploy_token).permit(:name, :expires_at, :read_repository, :read_registry, :username) end end end diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb index a1023f44049..1430b82c2f2 100644 --- a/app/models/clusters/applications/ingress.rb +++ b/app/models/clusters/applications/ingress.rb @@ -35,11 +35,8 @@ module Clusters 'stable/nginx-ingress' end - # We will implement this in future MRs. - # Basically we need to check all dependent applications are not installed - # first. def allowed_to_uninstall? - false + external_ip_or_hostname? && application_jupyter_nil_or_installable? end def install_command @@ -52,6 +49,10 @@ module Clusters ) end + def external_ip_or_hostname? + external_ip.present? || external_hostname.present? + end + def schedule_status_update return unless installed? return if external_ip @@ -63,6 +64,12 @@ module Clusters def ingress_service cluster.kubeclient.get_service('ingress-nginx-ingress-controller', Gitlab::Kubernetes::Helm::NAMESPACE) end + + private + + def application_jupyter_nil_or_installable? + cluster.application_jupyter.nil? || cluster.application_jupyter&.installable? + end end end end diff --git a/app/models/clusters/applications/jupyter.rb b/app/models/clusters/applications/jupyter.rb index 9e4b87d0993..9ede0615fa3 100644 --- a/app/models/clusters/applications/jupyter.rb +++ b/app/models/clusters/applications/jupyter.rb @@ -23,9 +23,7 @@ module Clusters return unless cluster&.application_ingress_available? ingress = cluster.application_ingress - if ingress.external_ip || ingress.external_hostname - self.status = 'installable' - end + self.status = 'installable' if ingress.external_ip_or_hostname? end def chart diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb index a6b7617b830..805c8a73f8c 100644 --- a/app/models/clusters/applications/prometheus.rb +++ b/app/models/clusters/applications/prometheus.rb @@ -49,14 +49,6 @@ module Clusters ) end - def uninstall_command - Gitlab::Kubernetes::Helm::DeleteCommand.new( - name: name, - rbac: cluster.platform_kubernetes_rbac?, - files: files - ) - end - def upgrade_command(values) ::Gitlab::Kubernetes::Helm::InstallCommand.new( name: name, diff --git a/app/models/concerns/update_project_statistics.rb b/app/models/concerns/update_project_statistics.rb index 1f881249322..570a735973f 100644 --- a/app/models/concerns/update_project_statistics.rb +++ b/app/models/concerns/update_project_statistics.rb @@ -19,9 +19,9 @@ # # - `statistic_attribute` must be an ActiveRecord attribute # - The model must implement `project` and `project_id`. i.e. direct Project relationship or delegation -# module UpdateProjectStatistics extend ActiveSupport::Concern + include AfterCommitQueue class_methods do attr_reader :project_statistics_name, :statistic_attribute @@ -31,7 +31,6 @@ module UpdateProjectStatistics # # - project_statistics_name: A column of `ProjectStatistics` to update # - statistic_attribute: An attribute of the current model, default to `size` - # def update_project_statistics(project_statistics_name:, statistic_attribute: :size) @project_statistics_name = project_statistics_name @statistic_attribute = statistic_attribute @@ -51,6 +50,7 @@ module UpdateProjectStatistics delta = read_attribute(attr).to_i - attribute_before_last_save(attr).to_i update_project_statistics(delta) + schedule_namespace_aggregation_worker end def update_project_statistics_attribute_changed? @@ -59,6 +59,8 @@ module UpdateProjectStatistics def update_project_statistics_after_destroy update_project_statistics(-read_attribute(self.class.statistic_attribute).to_i) + + schedule_namespace_aggregation_worker end def project_destroyed? @@ -68,5 +70,18 @@ module UpdateProjectStatistics def update_project_statistics(delta) ProjectStatistics.increment_statistic(project_id, self.class.project_statistics_name, delta) end + + def schedule_namespace_aggregation_worker + run_after_commit do + next unless schedule_aggregation_worker? + + Namespaces::ScheduleAggregationWorker.perform_async(project.namespace_id) + end + end + + def schedule_aggregation_worker? + !project.nil? && + Feature.enabled?(:update_statistics_namespace, project.root_ancestor) + end end end diff --git a/app/models/deploy_token.rb b/app/models/deploy_token.rb index b0e570f52ba..33f0be91632 100644 --- a/app/models/deploy_token.rb +++ b/app/models/deploy_token.rb @@ -16,6 +16,14 @@ class DeployToken < ApplicationRecord has_many :projects, through: :project_deploy_tokens validate :ensure_at_least_one_scope + validates :username, + length: { maximum: 255 }, + allow_nil: true, + format: { + with: /\A[a-zA-Z0-9\.\+_-]+\z/, + message: "can contain only letters, digits, '_', '-', '+', and '.'" + } + before_save :ensure_token accepts_nested_attributes_for :project_deploy_tokens @@ -39,7 +47,7 @@ class DeployToken < ApplicationRecord end def username - "gitlab+deploy-token-#{id}" + super || default_username end def has_access_to?(requested_project) @@ -75,4 +83,8 @@ class DeployToken < ApplicationRecord def ensure_at_least_one_scope errors.add(:base, "Scopes can't be blank") unless read_repository || read_registry end + + def default_username + "gitlab+deploy-token-#{id}" if persisted? + end end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index bfa33dc86ac..af50293a179 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -293,6 +293,10 @@ class Namespace < ApplicationRecord end end + def aggregation_scheduled? + aggregation_schedule.present? + end + private def parent_changed? diff --git a/app/models/namespace/aggregation_schedule.rb b/app/models/namespace/aggregation_schedule.rb index 43afd0b954c..355593597c6 100644 --- a/app/models/namespace/aggregation_schedule.rb +++ b/app/models/namespace/aggregation_schedule.rb @@ -1,7 +1,47 @@ # frozen_string_literal: true class Namespace::AggregationSchedule < ApplicationRecord + include AfterCommitQueue + include ExclusiveLeaseGuard + self.primary_key = :namespace_id + DEFAULT_LEASE_TIMEOUT = 3.hours + REDIS_SHARED_KEY = 'gitlab:update_namespace_statistics_delay'.freeze + belongs_to :namespace + + after_create :schedule_root_storage_statistics + + def self.delay_timeout + redis_timeout = Gitlab::Redis::SharedState.with do |redis| + redis.get(REDIS_SHARED_KEY) + end + + redis_timeout.nil? ? DEFAULT_LEASE_TIMEOUT : redis_timeout.to_i + end + + def schedule_root_storage_statistics + run_after_commit_or_now do + try_obtain_lease do + Namespaces::RootStatisticsWorker + .perform_async(namespace_id) + + Namespaces::RootStatisticsWorker + .perform_in(self.class.delay_timeout, namespace_id) + end + end + end + + private + + # Used by ExclusiveLeaseGuard + def lease_timeout + self.class.delay_timeout + end + + # Used by ExclusiveLeaseGuard + def lease_key + "namespace:namespaces_root_statistics:#{namespace_id}" + end end diff --git a/app/models/namespace/root_storage_statistics.rb b/app/models/namespace/root_storage_statistics.rb index de28eb6b37f..56c430013ee 100644 --- a/app/models/namespace/root_storage_statistics.rb +++ b/app/models/namespace/root_storage_statistics.rb @@ -1,10 +1,38 @@ # frozen_string_literal: true class Namespace::RootStorageStatistics < ApplicationRecord + STATISTICS_ATTRIBUTES = %w(storage_size repository_size wiki_size lfs_objects_size build_artifacts_size packages_size).freeze + self.primary_key = :namespace_id belongs_to :namespace has_one :route, through: :namespace delegate :all_projects, to: :namespace + + def recalculate! + update!(attributes_from_project_statistics) + end + + private + + def attributes_from_project_statistics + from_project_statistics + .take + .attributes + .slice(*STATISTICS_ATTRIBUTES) + end + + def from_project_statistics + all_projects + .joins('INNER JOIN project_statistics ps ON ps.project_id = projects.id') + .select( + 'COALESCE(SUM(ps.storage_size), 0) AS storage_size', + 'COALESCE(SUM(ps.repository_size), 0) AS repository_size', + 'COALESCE(SUM(ps.wiki_size), 0) AS wiki_size', + 'COALESCE(SUM(ps.lfs_objects_size), 0) AS lfs_objects_size', + 'COALESCE(SUM(ps.build_artifacts_size), 0) AS build_artifacts_size', + 'COALESCE(SUM(ps.packages_size), 0) AS packages_size' + ) + end end diff --git a/app/models/project_services/bugzilla_service.rb b/app/models/project_services/bugzilla_service.rb index 1a2bb6a171b..8b79b5e9f0c 100644 --- a/app/models/project_services/bugzilla_service.rb +++ b/app/models/project_services/bugzilla_service.rb @@ -3,22 +3,14 @@ class BugzillaService < IssueTrackerService validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated? - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + prop_accessor :project_url, :issues_url, :new_issue_url - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Bugzilla' - end + def default_title + 'Bugzilla' end - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Bugzilla issue tracker' - end + def default_description + s_('IssueTracker|Bugzilla issue tracker') end def self.to_param diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index b8f8072869c..535fcf6b94e 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -5,24 +5,12 @@ class CustomIssueTrackerService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Custom Issue Tracker' - end + def default_title + 'Custom Issue Tracker' end - def title=(value) - self.properties['title'] = value if self.properties - end - - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Custom issue tracker' - end + def default_description + s_('IssueTracker|Custom issue tracker') end def self.to_param diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index fa9abf58e62..51032932eab 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -5,10 +5,18 @@ class GitlabIssueTrackerService < IssueTrackerService validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated? - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + prop_accessor :project_url, :issues_url, :new_issue_url default_value_for :default, true + def default_title + 'GitLab' + end + + def default_description + s_('IssueTracker|GitLab issue tracker') + end + def self.to_param 'gitlab' end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index f54497fc6d8..3a1130ffc15 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -5,6 +5,8 @@ class IssueTrackerService < Service default_value_for :category, 'issue_tracker' + before_save :handle_properties + # Pattern used to extract links from comments # Override this method on services that uses different patterns # This pattern does not support cross-project references @@ -18,6 +20,37 @@ class IssueTrackerService < Service end end + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + def title + if title_attribute = read_attribute(:title) + title_attribute + elsif self.properties && self.properties['title'].present? + self.properties['title'] + else + default_title + end + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + def description + if description_attribute = read_attribute(:description) + description_attribute + elsif self.properties && self.properties['description'].present? + self.properties['description'] + else + default_description + end + end + + def handle_properties + properties.slice('title', 'description').each do |key, _| + current_value = self.properties.delete(key) + value = attribute_changed?(key) ? attribute_change(key).last : current_value + + write_attribute(key, value) + end + end + def default? default end diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index f31eb7fd19a..a3b89b2543a 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -17,7 +17,7 @@ class JiraService < IssueTrackerService # Jira Cloud version is deprecating authentication via username and password. # We should use username/password for Jira Server and email/api_token for Jira Cloud, # for more information check: https://gitlab.com/gitlab-org/gitlab-ce/issues/49936. - prop_accessor :username, :password, :url, :api_url, :jira_issue_transition_id, :title, :description + prop_accessor :username, :password, :url, :api_url, :jira_issue_transition_id before_update :reset_password @@ -37,7 +37,6 @@ class JiraService < IssueTrackerService def initialize_properties super do self.properties = { - title: issues_tracker['title'], url: issues_tracker['url'], api_url: issues_tracker['api_url'] } @@ -74,20 +73,12 @@ class JiraService < IssueTrackerService [Jira service documentation](#{help_page_url('user/project/integrations/jira')})." end - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Jira' - end + def default_title + 'Jira' end - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - s_('JiraService|Jira issue tracker') - end + def default_description + s_('JiraService|Jira issue tracker') end def self.to_param diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index a80be4b06da..5ca057ca833 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -3,22 +3,14 @@ class RedmineService < IssueTrackerService validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated? - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + prop_accessor :project_url, :issues_url, :new_issue_url - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Redmine' - end + def default_title + 'Redmine' end - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Redmine issue tracker' - end + def default_description + s_('IssueTracker|Redmine issue tracker') end def self.to_param diff --git a/app/models/project_services/youtrack_service.rb b/app/models/project_services/youtrack_service.rb index 175c2ebf197..f9de1f7dc49 100644 --- a/app/models/project_services/youtrack_service.rb +++ b/app/models/project_services/youtrack_service.rb @@ -3,7 +3,7 @@ class YoutrackService < IssueTrackerService validates :project_url, :issues_url, presence: true, public_url: true, if: :activated? - prop_accessor :description, :project_url, :issues_url + prop_accessor :project_url, :issues_url # {PROJECT-KEY}-{NUMBER} Examples: YT-1, PRJ-1, gl-030 def self.reference_pattern(only_long: false) @@ -14,16 +14,12 @@ class YoutrackService < IssueTrackerService end end - def title + def default_title 'YouTrack' end - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'YouTrack issue tracker' - end + def default_description + s_('IssueTracker|YouTrack issue tracker') end def self.to_param diff --git a/app/models/release.rb b/app/models/release.rb index 7bbeb3c9976..459a7c29ad0 100644 --- a/app/models/release.rb +++ b/app/models/release.rb @@ -12,12 +12,16 @@ class Release < ApplicationRecord has_many :links, class_name: 'Releases::Link' + default_value_for :released_at, allows_nil: false do + Time.zone.now + end + accepts_nested_attributes_for :links, allow_destroy: true validates :description, :project, :tag, presence: true validates :name, presence: true, on: :create - scope :sorted, -> { order(created_at: :desc) } + scope :sorted, -> { order(released_at: :desc) } delegate :repository, to: :project @@ -44,6 +48,10 @@ class Release < ApplicationRecord end end + def upcoming_release? + released_at.present? && released_at > Time.zone.now + end + private def actual_sha diff --git a/app/models/service.rb b/app/models/service.rb index 40033003f3b..752467622f2 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -129,7 +129,7 @@ class Service < ApplicationRecord def api_field_names fields.map { |field| field[:name] } - .reject { |field_name| field_name =~ /(password|token|key)/ } + .reject { |field_name| field_name =~ /(password|token|key|title|description)/ } end def global_fields diff --git a/app/services/deploy_tokens/create_service.rb b/app/services/deploy_tokens/create_service.rb index dc0122002e9..327a1dbf408 100644 --- a/app/services/deploy_tokens/create_service.rb +++ b/app/services/deploy_tokens/create_service.rb @@ -3,7 +3,9 @@ module DeployTokens class CreateService < BaseService def execute - @project.deploy_tokens.create(params) + @project.deploy_tokens.create(params) do |deploy_token| + deploy_token.username = params[:username].presence + end end end end diff --git a/app/services/namespaces/statistics_refresher_service.rb b/app/services/namespaces/statistics_refresher_service.rb new file mode 100644 index 00000000000..c07b302839b --- /dev/null +++ b/app/services/namespaces/statistics_refresher_service.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Namespaces + class StatisticsRefresherService + RefresherError = Class.new(StandardError) + + def execute(root_namespace) + root_storage_statistics = find_or_create_root_storage_statistics(root_namespace.id) + + root_storage_statistics.recalculate! + rescue ActiveRecord::ActiveRecordError => e + raise RefresherError.new(e.message) + end + + private + + def find_or_create_root_storage_statistics(root_namespace_id) + Namespace::RootStorageStatistics + .safe_find_or_create_by!(namespace_id: root_namespace_id) + end + end +end diff --git a/app/services/releases/concerns.rb b/app/services/releases/concerns.rb index ff6b696ca96..618d96717b8 100644 --- a/app/services/releases/concerns.rb +++ b/app/services/releases/concerns.rb @@ -22,6 +22,10 @@ module Releases params[:description] end + def released_at + params[:released_at] + end + def release strong_memoize(:release) do project.releases.find_by_tag(tag_name) diff --git a/app/services/releases/create_service.rb b/app/services/releases/create_service.rb index a271a7e5e49..5b13ac631ba 100644 --- a/app/services/releases/create_service.rb +++ b/app/services/releases/create_service.rb @@ -58,6 +58,7 @@ module Releases author: current_user, tag: tag.name, sha: tag.dereferenced_target.sha, + released_at: released_at, links_attributes: params.dig(:assets, 'links') || [] ) end diff --git a/app/views/clusters/clusters/_form.html.haml b/app/views/clusters/clusters/_form.html.haml index 455322b2089..3d0266a2d5b 100644 --- a/app/views/clusters/clusters/_form.html.haml +++ b/app/views/clusters/clusters/_form.html.haml @@ -1,4 +1,4 @@ -= form_for @cluster, url: clusterable.cluster_path(@cluster), as: :cluster do |field| += form_for @cluster, url: clusterable.cluster_path(@cluster), as: :cluster, html: { class: 'cluster_integration_form' } do |field| = form_errors(@cluster) .form-group %h5= s_('ClusterIntegration|Integration status') diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml index e12748666c8..db1849ebb45 100644 --- a/app/views/groups/settings/_general.html.haml +++ b/app/views/groups/settings/_general.html.haml @@ -13,7 +13,7 @@ = f.text_field :id, class: 'form-control w-auto', readonly: true .row.prepend-top-8 - .form-group.col-md-9.append-bottom-0 + .form-group.col-md-9 = f.label :description, _('Group description (optional)'), class: 'label-bold' = f.text_area :description, class: 'form-control', rows: 3, maxlength: 250 diff --git a/app/views/projects/deploy_tokens/_form.html.haml b/app/views/projects/deploy_tokens/_form.html.haml index 5412fcbc9d8..f846dbd3763 100644 --- a/app/views/projects/deploy_tokens/_form.html.haml +++ b/app/views/projects/deploy_tokens/_form.html.haml @@ -13,6 +13,11 @@ = f.text_field :expires_at, class: 'datepicker form-control qa-deploy-token-expires-at', value: f.object.expires_at .form-group + = f.label :username, class: 'label-bold' + = f.text_field :username, class: 'form-control qa-deploy-token-username' + .text-secondary= s_('DeployTokens|Default format is "gitlab+deploy-token-{n}". Enter custom username if you want to change it.') + + .form-group = f.label :scopes, class: 'label-bold' %fieldset.form-group.form-check = f.check_box :read_repository, class: 'form-check-input qa-deploy-token-read-repository' diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml index db1f15f96b8..e34973f1f43 100644 --- a/app/views/projects/registry/repositories/index.html.haml +++ b/app/views/projects/registry/repositories/index.html.haml @@ -1,49 +1,9 @@ -- page_title "Container Registry" - %section - .settings-header - %h4 - = page_title - %p - = s_('ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images.') - %p.append-bottom-0 - = succeed '.' do - = s_('ContainerRegistry|Learn more about') - = link_to _('Container Registry'), help_page_path('user/project/container_registry'), target: '_blank' .row.registry-placeholder.prepend-bottom-10 - .col-lg-12 - #js-vue-registry-images{ data: { endpoint: project_container_registry_index_path(@project, format: :json) } } - - .row.prepend-top-10 - .col-lg-12 - .card - .card-header - = s_('ContainerRegistry|How to use the Container Registry') - .card-body - %p - - link_token = link_to(_('personal access token'), help_page_path('user/profile/account/two_factor_authentication', anchor: 'personal-access-tokens'), target: '_blank') - - link_2fa = link_to(_('2FA enabled'), help_page_path('user/profile/account/two_factor_authentication'), target: '_blank') - = s_('ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:').html_safe % { link_2fa: link_2fa, link_token: link_token } - %pre - docker login #{Gitlab.config.registry.host_port} - %br - %p - - deploy_token = link_to(_('deploy token'), help_page_path('user/project/deploy_tokens/index', anchor: 'read-container-registry-images'), target: '_blank') - = s_('ContainerRegistry|You can also use a %{deploy_token} for read-only access to the registry images.').html_safe % { deploy_token: deploy_token } - %br - %p - = s_('ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands').html_safe % { build: "<code>build</code>".html_safe, push: "<code>push</code>".html_safe } - %pre - :plain - docker build -t #{escape_once(@project.container_registry_url)} . - docker push #{escape_once(@project.container_registry_url)} - %hr - %h5.prepend-top-default - = s_('ContainerRegistry|Use different image names') - %p.light - = s_('ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:') - %pre - :plain - #{escape_once(@project.container_registry_url)}:tag - #{escape_once(@project.container_registry_url)}/optional-image-name:tag - #{escape_once(@project.container_registry_url)}/optional-name/optional-image-name:tag + .col-12 + #js-vue-registry-images{ data: { endpoint: project_container_registry_index_path(@project, format: :json), + "help_page_path" => help_page_path('user/project/container_registry'), + "no_containers_image" => image_path('illustrations/docker-empty-state.svg'), + "containers_error_image" => image_path('illustrations/docker-error-state.svg'), + "repository_url" => escape_once(@project.container_registry_url), + character_error: @character_error.to_s } } diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index e55962b629e..3d34bfc05c7 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -26,6 +26,7 @@ - cronjob:issue_due_scheduler - cronjob:prune_web_hook_logs - cronjob:schedule_migrate_external_diffs +- cronjob:namespaces_prune_aggregation_schedules - gcp_cluster:cluster_install_app - gcp_cluster:cluster_patch_app @@ -101,6 +102,9 @@ - todos_destroyer:todos_destroyer_project_private - todos_destroyer:todos_destroyer_private_features +- update_namespace_statistics:namespaces_schedule_aggregation +- update_namespace_statistics:namespaces_root_statistics + - object_pool:object_pool_create - object_pool:object_pool_schedule_join - object_pool:object_pool_join diff --git a/app/workers/namespaces/prune_aggregation_schedules_worker.rb b/app/workers/namespaces/prune_aggregation_schedules_worker.rb new file mode 100644 index 00000000000..4e40feee702 --- /dev/null +++ b/app/workers/namespaces/prune_aggregation_schedules_worker.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Namespaces + class PruneAggregationSchedulesWorker + include ApplicationWorker + include CronjobQueue + + # Worker to prune pending rows on Namespace::AggregationSchedule + # It's scheduled to run once a day at 1:05am. + def perform + aggregation_schedules.find_each do |aggregation_schedule| + aggregation_schedule.schedule_root_storage_statistics + end + end + + private + + def aggregation_schedules + Namespace::AggregationSchedule.all + end + end +end diff --git a/app/workers/namespaces/root_statistics_worker.rb b/app/workers/namespaces/root_statistics_worker.rb new file mode 100644 index 00000000000..48876825564 --- /dev/null +++ b/app/workers/namespaces/root_statistics_worker.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Namespaces + class RootStatisticsWorker + include ApplicationWorker + + queue_namespace :update_namespace_statistics + + def perform(namespace_id) + namespace = Namespace.find(namespace_id) + + return unless update_statistics_enabled_for?(namespace) && namespace.aggregation_scheduled? + + Namespaces::StatisticsRefresherService.new.execute(namespace) + + namespace.aggregation_schedule.destroy + rescue ::Namespaces::StatisticsRefresherService::RefresherError, ActiveRecord::RecordNotFound => ex + log_error(namespace.full_path, ex.message) if namespace + end + + private + + def log_error(namespace_path, error_message) + Gitlab::SidekiqLogger.error("Namespace statistics can't be updated for #{namespace_path}: #{error_message}") + end + + def update_statistics_enabled_for?(namespace) + Feature.enabled?(:update_statistics_namespace, namespace) + end + end +end diff --git a/app/workers/namespaces/schedule_aggregation_worker.rb b/app/workers/namespaces/schedule_aggregation_worker.rb new file mode 100644 index 00000000000..a4594b84b13 --- /dev/null +++ b/app/workers/namespaces/schedule_aggregation_worker.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Namespaces + class ScheduleAggregationWorker + include ApplicationWorker + + queue_namespace :update_namespace_statistics + + def perform(namespace_id) + return unless aggregation_schedules_table_exists? + + namespace = Namespace.find(namespace_id) + root_ancestor = namespace.root_ancestor + + return unless update_statistics_enabled_for?(root_ancestor) && !root_ancestor.aggregation_scheduled? + + Namespace::AggregationSchedule.safe_find_or_create_by!(namespace_id: root_ancestor.id) + rescue ActiveRecord::RecordNotFound + log_error(namespace_id) + end + + private + + # On db/post_migrate/20180529152628_schedule_to_archive_legacy_traces.rb + # traces are archived through build.trace.archive, which in consequence + # calls UpdateProjectStatistics#schedule_namespace_statistics_worker. + # + # The migration and specs fails since NamespaceAggregationSchedule table + # does not exist at that point. + # https://gitlab.com/gitlab-org/gitlab-ce/issues/50712 + def aggregation_schedules_table_exists? + return true unless Rails.env.test? + + Namespace::AggregationSchedule.table_exists? + end + + def log_error(root_ancestor_id) + Gitlab::SidekiqLogger.error("Namespace can't be scheduled for aggregation: #{root_ancestor_id} does not exist") + end + + def update_statistics_enabled_for?(root_ancestor) + Feature.enabled?(:update_statistics_namespace, root_ancestor) + end + end +end diff --git a/changelogs/unreleased/32452-multiple-discussions.yml b/changelogs/unreleased/32452-multiple-discussions.yml new file mode 100644 index 00000000000..5552340ee66 --- /dev/null +++ b/changelogs/unreleased/32452-multiple-discussions.yml @@ -0,0 +1,5 @@ +--- +title: Resolve Multiple discussions per line in merge request diffs +merge_request: 28748 +author: +type: added diff --git a/changelogs/unreleased/45104-special-characters-in-project-name-path-prevent-users-from-using-the-container-registry.yml b/changelogs/unreleased/45104-special-characters-in-project-name-path-prevent-users-from-using-the-container-registry.yml new file mode 100644 index 00000000000..ddde0cc9c39 --- /dev/null +++ b/changelogs/unreleased/45104-special-characters-in-project-name-path-prevent-users-from-using-the-container-registry.yml @@ -0,0 +1,5 @@ +--- +title: Updated container registry to display error message when special characters in path. Documentation has also been updated. +merge_request: 29616 +author: +type: changed diff --git a/changelogs/unreleased/50228-deploy-tokens-custom-username.yml b/changelogs/unreleased/50228-deploy-tokens-custom-username.yml new file mode 100644 index 00000000000..fdafa7b1113 --- /dev/null +++ b/changelogs/unreleased/50228-deploy-tokens-custom-username.yml @@ -0,0 +1,5 @@ +--- +title: Allow custom username for deploy tokens +merge_request: 29639 +author: +type: added diff --git a/changelogs/unreleased/62124-new-threaded-discussion-design.yml b/changelogs/unreleased/62124-new-threaded-discussion-design.yml new file mode 100644 index 00000000000..6614e05be74 --- /dev/null +++ b/changelogs/unreleased/62124-new-threaded-discussion-design.yml @@ -0,0 +1,5 @@ +--- +title: Implement borderless discussion design with new reply field +merge_request: 28580 +author: +type: added diff --git a/changelogs/unreleased/63971-remove-istanbul.yml b/changelogs/unreleased/63971-remove-istanbul.yml new file mode 100644 index 00000000000..674df82db35 --- /dev/null +++ b/changelogs/unreleased/63971-remove-istanbul.yml @@ -0,0 +1,5 @@ +--- +title: Remove istanbul JavaScript package +merge_request: 30232 +author: Takuya Noguchi +type: other diff --git a/changelogs/unreleased/feature-uninstall_cluster_ingress.yml b/changelogs/unreleased/feature-uninstall_cluster_ingress.yml new file mode 100644 index 00000000000..c3f8464c4b4 --- /dev/null +++ b/changelogs/unreleased/feature-uninstall_cluster_ingress.yml @@ -0,0 +1,5 @@ +--- +title: Allow Ingress to be uninstalled from the UI +merge_request: 29977 +author: +type: added diff --git a/changelogs/unreleased/pre-releases-38105a.yml b/changelogs/unreleased/pre-releases-38105a.yml new file mode 100644 index 00000000000..8b7cf6065d4 --- /dev/null +++ b/changelogs/unreleased/pre-releases-38105a.yml @@ -0,0 +1,5 @@ +--- +title: Show an Upcoming Status for Releases +merge_request: 29577 +author: +type: added diff --git a/changelogs/unreleased/rj-fix-manual-order.yml b/changelogs/unreleased/rj-fix-manual-order.yml new file mode 100644 index 00000000000..ecc39b78b06 --- /dev/null +++ b/changelogs/unreleased/rj-fix-manual-order.yml @@ -0,0 +1,5 @@ +--- +title: Don't let logged out user do manual order +merge_request: 30264 +author: +type: fixed diff --git a/changelogs/unreleased/sh-cache-flipper-names-memory-cache.yml b/changelogs/unreleased/sh-cache-flipper-names-memory-cache.yml new file mode 100644 index 00000000000..00443e81244 --- /dev/null +++ b/changelogs/unreleased/sh-cache-flipper-names-memory-cache.yml @@ -0,0 +1,5 @@ +--- +title: Cache Flipper persisted names directly to local memory storage +merge_request: 30265 +author: +type: performance diff --git a/changelogs/unreleased/sh-improve-redis-peek.yml b/changelogs/unreleased/sh-improve-redis-peek.yml new file mode 100644 index 00000000000..940be103ab7 --- /dev/null +++ b/changelogs/unreleased/sh-improve-redis-peek.yml @@ -0,0 +1,5 @@ +--- +title: Add Redis call details in Peek performance bar +merge_request: 30191 +author: +type: changed diff --git a/changelogs/unreleased/slugify.yml b/changelogs/unreleased/slugify.yml new file mode 100644 index 00000000000..853e90b8bed --- /dev/null +++ b/changelogs/unreleased/slugify.yml @@ -0,0 +1,5 @@ +--- +title: Replace slugifyWithHyphens with improved slugify function +merge_request: 30172 +author: Luke Ward +type: fixed diff --git a/changelogs/unreleased/unicorn-sampler-fix.yml b/changelogs/unreleased/unicorn-sampler-fix.yml new file mode 100644 index 00000000000..3f0e509f15f --- /dev/null +++ b/changelogs/unreleased/unicorn-sampler-fix.yml @@ -0,0 +1,5 @@ +--- +title: Make sure UnicornSampler is started only in master process. +merge_request: 30215 +author: +type: fixed diff --git a/changelogs/unreleased/use-pg-9-6-11-on-ci.yml b/changelogs/unreleased/use-pg-9-6-11-on-ci.yml new file mode 100644 index 00000000000..785eb352895 --- /dev/null +++ b/changelogs/unreleased/use-pg-9-6-11-on-ci.yml @@ -0,0 +1,5 @@ +--- +title: Use PostgreSQL 9.6.11 in CI tests +merge_request: 30270 +author: Takuya Noguchi +type: other diff --git a/changelogs/unreleased/winh-updateResolvableDiscussionsCounts-typo.yml b/changelogs/unreleased/winh-updateResolvableDiscussionsCounts-typo.yml new file mode 100644 index 00000000000..24b10bb3edc --- /dev/null +++ b/changelogs/unreleased/winh-updateResolvableDiscussionsCounts-typo.yml @@ -0,0 +1,5 @@ +--- +title: Fix typo in updateResolvableDiscussionsCounts action +merge_request: 30278 +author: Frank van Rest +type: other diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index c803e4615b4..bf187e9a282 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -441,6 +441,9 @@ Settings.cron_jobs['prune_web_hook_logs_worker']['job_class'] = 'PruneWebHookLog Settings.cron_jobs['schedule_migrate_external_diffs_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['schedule_migrate_external_diffs_worker']['cron'] ||= '15 * * * *' Settings.cron_jobs['schedule_migrate_external_diffs_worker']['job_class'] = 'ScheduleMigrateExternalDiffsWorker' +Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker'] ||= Settingslogic.new({}) +Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker']['cron'] ||= '5 1 * * *' +Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker']['job_class'] = 'Namespaces::PruneAggregationSchedulesWorker' Gitlab.ee do Settings.cron_jobs['clear_shared_runners_minutes_worker'] ||= Settingslogic.new({}) diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb index 54cdefc2a10..741c8ef1ca0 100644 --- a/config/initializers/7_prometheus_metrics.rb +++ b/config/initializers/7_prometheus_metrics.rb @@ -1,15 +1,27 @@ require 'prometheus/client' require 'prometheus/client/support/unicorn' +# Keep separate directories for separate processes +def prometheus_default_multiproc_dir + return unless Rails.env.development? || Rails.env.test? + + if Sidekiq.server? + Rails.root.join('tmp/prometheus_multiproc_dir/sidekiq') + elsif defined?(Unicorn::Worker) + Rails.root.join('tmp/prometheus_multiproc_dir/unicorn') + elsif defined?(::Puma) + Rails.root.join('tmp/prometheus_multiproc_dir/puma') + else + Rails.root.join('tmp/prometheus_multiproc_dir') + end +end + Prometheus::Client.configure do |config| config.logger = Rails.logger config.initial_mmap_file_size = 4 * 1024 - config.multiprocess_files_dir = ENV['prometheus_multiproc_dir'] - if Rails.env.development? || Rails.env.test? - config.multiprocess_files_dir ||= Rails.root.join('tmp/prometheus_multiproc_dir') - end + config.multiprocess_files_dir = ENV['prometheus_multiproc_dir'] || prometheus_default_multiproc_dir config.pid_provider = Prometheus::Client::Support::Unicorn.method(:worker_pid_provider) end @@ -29,15 +41,13 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled? Gitlab::Cluster::LifecycleEvents.on_worker_start do defined?(::Prometheus::Client.reinitialize_on_pid_change) && Prometheus::Client.reinitialize_on_pid_change - if defined?(::Unicorn) - Gitlab::Metrics::Samplers::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start - end - Gitlab::Metrics::Samplers::RubySampler.initialize_instance(Settings.monitoring.ruby_sampler_interval).start end - if defined?(::Puma) - Gitlab::Cluster::LifecycleEvents.on_master_start do + Gitlab::Cluster::LifecycleEvents.on_master_start do + if defined?(::Unicorn) + Gitlab::Metrics::Samplers::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start + elsif defined?(::Puma) Gitlab::Metrics::Samplers::PumaSampler.initialize_instance(Settings.monitoring.puma_sampler_interval).start end end diff --git a/config/initializers/rack_attack_logging.rb b/config/initializers/rack_attack_logging.rb index 2a3fdc8de5f..338e968cc6c 100644 --- a/config/initializers/rack_attack_logging.rb +++ b/config/initializers/rack_attack_logging.rb @@ -4,12 +4,22 @@ ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, req| if [:throttle, :blacklist].include? req.env['rack.attack.match_type'] - Gitlab::AuthLogger.error( + rack_attack_info = { message: 'Rack_Attack', env: req.env['rack.attack.match_type'], ip: req.ip, request_method: req.request_method, fullpath: req.fullpath - ) + } + + if req.env['rack.attack.matched'] != 'throttle_unauthenticated' + user_id = req.env['rack.attack.match_discriminator'] + user = User.find_by(id: user_id) + + rack_attack_info[:user_id] = user_id + rack_attack_info[:username] = user.username unless user.nil? + end + + Gitlab::AuthLogger.error(rack_attack_info) end end diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index 25fd65d8644..80791795390 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -94,6 +94,7 @@ - [migrate_external_diffs, 1] - [update_project_statistics, 1] - [phabricator_import_import_tasks, 1] + - [update_namespace_statistics, 1] # EE-specific queues - [ldap_group_sync, 2] diff --git a/db/migrate/20140313092127_init_schema.rb b/db/migrate/20140313092127_init_schema.rb deleted file mode 100644 index 4188599b4b4..00000000000 --- a/db/migrate/20140313092127_init_schema.rb +++ /dev/null @@ -1,338 +0,0 @@ -class InitSchema < ActiveRecord::Migration[4.2] - DOWNTIME = true - - # rubocop:disable Metrics/AbcSize - def up - create_table "broadcast_messages", force: :cascade do |t| - t.text "message", null: false - t.datetime "starts_at" - t.datetime "ends_at" - t.integer "alert_type" - t.datetime "created_at" - t.datetime "updated_at" - t.string "color" - t.string "font" - end - create_table "deploy_keys_projects", force: :cascade do |t| - t.integer "deploy_key_id", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - add_index "deploy_keys_projects", ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree - create_table "emails", force: :cascade do |t| - t.integer "user_id", null: false - t.string "email", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - add_index "emails", ["email"], name: "index_emails_on_email", unique: true, using: :btree - add_index "emails", ["user_id"], name: "index_emails_on_user_id", using: :btree - create_table "events", force: :cascade do |t| - t.string "target_type" - t.integer "target_id" - t.string "title" - t.text "data" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "action" - t.integer "author_id" - end - add_index "events", ["action"], name: "index_events_on_action", using: :btree - add_index "events", ["author_id"], name: "index_events_on_author_id", using: :btree - add_index "events", ["created_at"], name: "index_events_on_created_at", using: :btree - add_index "events", ["project_id"], name: "index_events_on_project_id", using: :btree - add_index "events", ["target_id"], name: "index_events_on_target_id", using: :btree - add_index "events", ["target_type"], name: "index_events_on_target_type", using: :btree - create_table "forked_project_links", force: :cascade do |t| - t.integer "forked_to_project_id", null: false - t.integer "forked_from_project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree - create_table "issues", force: :cascade do |t| - t.string "title" - t.integer "assignee_id" - t.integer "author_id" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "position", default: 0 - t.string "branch_name" - t.text "description" - t.integer "milestone_id" - t.string "state" - t.integer "iid" - end - add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree - add_index "issues", ["author_id"], name: "index_issues_on_author_id", using: :btree - add_index "issues", ["created_at"], name: "index_issues_on_created_at", using: :btree - add_index "issues", ["milestone_id"], name: "index_issues_on_milestone_id", using: :btree - add_index "issues", ["project_id"], name: "index_issues_on_project_id", using: :btree - add_index "issues", ["title"], name: "index_issues_on_title", using: :btree - create_table "keys", force: :cascade do |t| - t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" - t.text "key" - t.string "title" - t.string "type" - t.string "fingerprint" - end - add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree - create_table "merge_request_diffs", force: :cascade do |t| - t.string "state", default: "collected", null: false - t.text "st_commits" - t.text "st_diffs" - t.integer "merge_request_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - add_index "merge_request_diffs", ["merge_request_id"], name: "index_merge_request_diffs_on_merge_request_id", unique: true, using: :btree - create_table "merge_requests", force: :cascade do |t| - t.string "target_branch", null: false - t.string "source_branch", null: false - t.integer "source_project_id", null: false - t.integer "author_id" - t.integer "assignee_id" - t.string "title" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "milestone_id" - t.string "state" - t.string "merge_status" - t.integer "target_project_id", null: false - t.integer "iid" - t.text "description" - end - add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree - add_index "merge_requests", ["author_id"], name: "index_merge_requests_on_author_id", using: :btree - add_index "merge_requests", ["created_at"], name: "index_merge_requests_on_created_at", using: :btree - add_index "merge_requests", ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree - add_index "merge_requests", ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree - add_index "merge_requests", ["source_project_id"], name: "index_merge_requests_on_source_project_id", using: :btree - add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree - add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree - create_table "milestones", force: :cascade do |t| - t.string "title", null: false - t.integer "project_id", null: false - t.text "description" - t.date "due_date" - t.datetime "created_at" - t.datetime "updated_at" - t.string "state" - t.integer "iid" - end - add_index "milestones", ["due_date"], name: "index_milestones_on_due_date", using: :btree - add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree - create_table "namespaces", force: :cascade do |t| - t.string "name", null: false - t.string "path", null: false - t.integer "owner_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "type" - t.string "description", default: "", null: false - t.string "avatar" - end - add_index "namespaces", ["name"], name: "index_namespaces_on_name", using: :btree - add_index "namespaces", ["owner_id"], name: "index_namespaces_on_owner_id", using: :btree - add_index "namespaces", ["path"], name: "index_namespaces_on_path", using: :btree - add_index "namespaces", ["type"], name: "index_namespaces_on_type", using: :btree - create_table "notes", force: :cascade do |t| - t.text "note" - t.string "noteable_type" - t.integer "author_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "project_id" - t.string "attachment" - t.string "line_code" - t.string "commit_id" - t.integer "noteable_id" - t.boolean "system", default: false, null: false - t.text "st_diff" - end - add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree - add_index "notes", ["commit_id"], name: "index_notes_on_commit_id", using: :btree - add_index "notes", ["created_at"], name: "index_notes_on_created_at", using: :btree - add_index "notes", %w[noteable_id noteable_type], name: "index_notes_on_noteable_id_and_noteable_type", using: :btree - add_index "notes", ["noteable_type"], name: "index_notes_on_noteable_type", using: :btree - add_index "notes", %w[project_id noteable_type], name: "index_notes_on_project_id_and_noteable_type", using: :btree - add_index "notes", ["project_id"], name: "index_notes_on_project_id", using: :btree - create_table "project_group_links", force: :cascade do |t| - t.integer "project_id", null: false - t.integer "group_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "group_access", default: 30, null: false - end - create_table "projects", force: :cascade do |t| - t.string "name" - t.string "path" - t.text "description" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "creator_id" - t.boolean "issues_enabled", default: true, null: false - t.boolean "wall_enabled", default: true, null: false - t.boolean "merge_requests_enabled", default: true, null: false - t.boolean "wiki_enabled", default: true, null: false - t.integer "namespace_id" - t.string "issues_tracker", default: "gitlab", null: false - t.string "issues_tracker_id" - t.boolean "snippets_enabled", default: true, null: false - t.datetime "last_activity_at" - t.string "import_url" - t.integer "visibility_level", default: 0, null: false - t.boolean "archived", default: false, null: false - t.string "avatar" - t.string "import_status" - end - add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree - add_index "projects", ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree - add_index "projects", ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree - create_table "protected_branches", force: :cascade do |t| - t.integer "project_id", null: false - t.string "name", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - add_index "protected_branches", ["project_id"], name: "index_protected_branches_on_project_id", using: :btree - create_table "services", force: :cascade do |t| - t.string "type" - t.string "title" - t.string "token" - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "active", default: false, null: false - t.string "project_url" - t.string "subdomain" - t.string "room" - t.text "recipients" - t.string "api_key" - end - add_index "services", ["project_id"], name: "index_services_on_project_id", using: :btree - create_table "snippets", force: :cascade do |t| - t.string "title" - t.text "content" - t.integer "author_id", null: false - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "file_name" - t.datetime "expires_at" - t.boolean "private", default: true, null: false - t.string "type" - end - add_index "snippets", ["author_id"], name: "index_snippets_on_author_id", using: :btree - add_index "snippets", ["created_at"], name: "index_snippets_on_created_at", using: :btree - add_index "snippets", ["expires_at"], name: "index_snippets_on_expires_at", using: :btree - add_index "snippets", ["project_id"], name: "index_snippets_on_project_id", using: :btree - create_table "taggings", force: :cascade do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context" - t.datetime "created_at" - end - add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree - add_index "taggings", %w[taggable_id taggable_type context], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree - create_table "tags", force: :cascade do |t| - t.string "name" - end - create_table "users", force: :cascade do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" - t.datetime "reset_password_sent_at" - t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0 - t.datetime "current_sign_in_at" - t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" - t.string "name" - t.boolean "admin", default: false, null: false - t.integer "projects_limit", default: 10 - t.string "skype", default: "", null: false - t.string "linkedin", default: "", null: false - t.string "twitter", default: "", null: false - t.string "authentication_token" - t.integer "theme_id", default: 1, null: false - t.string "bio" - t.integer "failed_attempts", default: 0 - t.datetime "locked_at" - t.string "extern_uid" - t.string "provider" - t.string "username" - t.boolean "can_create_group", default: true, null: false - t.boolean "can_create_team", default: true, null: false - t.string "state" - t.integer "color_scheme_id", default: 1, null: false - t.integer "notification_level", default: 1, null: false - t.datetime "password_expires_at" - t.integer "created_by_id" - t.datetime "last_credential_check_at" - t.string "avatar" - t.string "confirmation_token" - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" - t.string "unconfirmed_email" - t.boolean "hide_no_ssh_key", default: false - t.string "website_url", default: "", null: false - end - add_index "users", ["admin"], name: "index_users_on_admin", using: :btree - add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree - add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree - add_index "users", %w[extern_uid provider], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree - add_index "users", ["name"], name: "index_users_on_name", using: :btree - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree - add_index "users", ["username"], name: "index_users_on_username", using: :btree - create_table "users_groups", force: :cascade do |t| - t.integer "group_access", null: false - t.integer "group_id", null: false - t.integer "user_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "notification_level", default: 3, null: false - end - add_index "users_groups", ["user_id"], name: "index_users_groups_on_user_id", using: :btree - create_table "users_projects", force: :cascade do |t| - t.integer "user_id", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "project_access", default: 0, null: false - t.integer "notification_level", default: 3, null: false - end - add_index "users_projects", ["project_access"], name: "index_users_projects_on_project_access", using: :btree - add_index "users_projects", ["project_id"], name: "index_users_projects_on_project_id", using: :btree - add_index "users_projects", ["user_id"], name: "index_users_projects_on_user_id", using: :btree - create_table "web_hooks", force: :cascade do |t| - t.string "url" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "type", default: "ProjectHook" - t.integer "service_id" - t.boolean "push_events", default: true, null: false - t.boolean "issues_events", default: false, null: false - t.boolean "merge_requests_events", default: false, null: false - t.boolean "tag_push_events", default: false - end - add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree - end - - def down - raise ActiveRecord::IrreversibleMigration, "The initial migration is not revertable" - end -end diff --git a/db/migrate/20140407135544_fix_namespaces.rb b/db/migrate/20140407135544_fix_namespaces.rb deleted file mode 100644 index b16d65c4b51..00000000000 --- a/db/migrate/20140407135544_fix_namespaces.rb +++ /dev/null @@ -1,16 +0,0 @@ -class FixNamespaces < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - namespaces = exec_query('SELECT id, path FROM namespaces WHERE name <> path and type is null') - - namespaces.each do |row| - id = row['id'] - path = row['path'] - exec_query("UPDATE namespaces SET name = '#{path}' WHERE id = #{id}") - end - end - - def down - end -end diff --git a/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb b/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb deleted file mode 100644 index 1f9ae3f0080..00000000000 --- a/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb +++ /dev/null @@ -1,11 +0,0 @@ -class ChangeStateToAllowEmptyMergeRequestDiffs < ActiveRecord::Migration[4.2] - def up - change_column :merge_request_diffs, :state, :string, null: true, - default: nil - end - - def down - change_column :merge_request_diffs, :state, :string, null: false, - default: 'collected' - end -end diff --git a/db/migrate/20140415124820_limits_to_mysql.rb b/db/migrate/20140415124820_limits_to_mysql.rb deleted file mode 100644 index 3f6e62617c5..00000000000 --- a/db/migrate/20140415124820_limits_to_mysql.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative 'limits_to_mysql' diff --git a/db/migrate/20140416074002_add_index_on_iid.rb b/db/migrate/20140416074002_add_index_on_iid.rb deleted file mode 100644 index c7f707ca123..00000000000 --- a/db/migrate/20140416074002_add_index_on_iid.rb +++ /dev/null @@ -1,33 +0,0 @@ -# rubocop:disable all -class AddIndexOnIid < ActiveRecord::Migration[4.2] - def change - RemoveDuplicateIid.clean(Issue) - RemoveDuplicateIid.clean(MergeRequest, 'target_project_id') - RemoveDuplicateIid.clean(Milestone) - - add_index :issues, [:project_id, :iid], unique: true - add_index :merge_requests, [:target_project_id, :iid], unique: true - add_index :milestones, [:project_id, :iid], unique: true - end -end - -class RemoveDuplicateIid - def self.clean(klass, project_field = 'project_id') - duplicates = klass.find_by_sql("SELECT iid, #{project_field} FROM #{klass.table_name} GROUP BY #{project_field}, iid HAVING COUNT(*) > 1") - - duplicates.each do |duplicate| - project_id = duplicate.send(project_field) - iid = duplicate.iid - items = klass.of_projects(project_id).where(iid: iid) - - if items.size > 1 - puts "Remove #{klass.name} duplicates for iid: #{iid} and project_id: #{project_id}" - items.shift - items.each do |item| - item.destroy - puts '.' - end - end - end - end -end diff --git a/db/migrate/20140416185734_index_on_current_sign_in_at.rb b/db/migrate/20140416185734_index_on_current_sign_in_at.rb deleted file mode 100644 index 7dabcb937b3..00000000000 --- a/db/migrate/20140416185734_index_on_current_sign_in_at.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class IndexOnCurrentSignInAt < ActiveRecord::Migration[4.2] - def change - add_index :users, :current_sign_in_at - end -end diff --git a/db/migrate/20140428105831_add_notes_index_updated_at.rb b/db/migrate/20140428105831_add_notes_index_updated_at.rb deleted file mode 100644 index 25bdf477e24..00000000000 --- a/db/migrate/20140428105831_add_notes_index_updated_at.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddNotesIndexUpdatedAt < ActiveRecord::Migration[4.2] - def change - add_index :notes, :updated_at - end -end diff --git a/db/migrate/20140502115131_add_repo_size_to_db.rb b/db/migrate/20140502115131_add_repo_size_to_db.rb deleted file mode 100644 index 4cb7a01bbf2..00000000000 --- a/db/migrate/20140502115131_add_repo_size_to_db.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddRepoSizeToDb < ActiveRecord::Migration[4.2] - def change - add_column :projects, :repository_size, :float, default: 0 - end -end diff --git a/db/migrate/20140502125220_migrate_repo_size.rb b/db/migrate/20140502125220_migrate_repo_size.rb deleted file mode 100644 index bff1f01c654..00000000000 --- a/db/migrate/20140502125220_migrate_repo_size.rb +++ /dev/null @@ -1,31 +0,0 @@ -# rubocop:disable all -class MigrateRepoSize < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - project_data = execute('SELECT projects.id, namespaces.path AS namespace_path, projects.path AS project_path FROM projects LEFT JOIN namespaces ON projects.namespace_id = namespaces.id') - - project_data.each do |project| - id = project['id'] - namespace_path = project['namespace_path'] || '' - path = File.join(namespace_path, project['project_path'] + '.git') - - begin - repo = Gitlab::Git::Repository.new('default', path, '', '') - if repo.empty? - print '-' - else - size = repo.size - print '.' - execute("UPDATE projects SET repository_size = #{size} WHERE id = #{id}") - end - rescue => e - puts "\nFailed to update project #{id}: #{e}" - end - end - puts "\nDone" - end - - def down - end -end diff --git a/db/migrate/20140611135229_add_position_to_merge_request.rb b/db/migrate/20140611135229_add_position_to_merge_request.rb deleted file mode 100644 index 6ec644eecce..00000000000 --- a/db/migrate/20140611135229_add_position_to_merge_request.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPositionToMergeRequest < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :position, :integer, default: 0 - end -end diff --git a/db/migrate/20140625115202_create_users_star_projects.rb b/db/migrate/20140625115202_create_users_star_projects.rb deleted file mode 100644 index 2237927fc78..00000000000 --- a/db/migrate/20140625115202_create_users_star_projects.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable all -class CreateUsersStarProjects < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :users_star_projects do |t| - t.integer :project_id, null: false - t.integer :user_id, null: false - t.timestamps null: true - end - add_index :users_star_projects, :user_id - add_index :users_star_projects, :project_id - add_index :users_star_projects, [:user_id, :project_id], unique: true - - add_column :projects, :star_count, :integer, default: 0, null: false - add_index :projects, :star_count, using: :btree - end -end diff --git a/db/migrate/20140729134820_create_labels.rb b/db/migrate/20140729134820_create_labels.rb deleted file mode 100644 index 1060610b660..00000000000 --- a/db/migrate/20140729134820_create_labels.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable all -class CreateLabels < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :labels do |t| - t.string :title - t.string :color - t.integer :project_id - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20140729140420_create_label_links.rb b/db/migrate/20140729140420_create_label_links.rb deleted file mode 100644 index b8596a44a21..00000000000 --- a/db/migrate/20140729140420_create_label_links.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable all -class CreateLabelLinks < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :label_links do |t| - t.integer :label_id - t.integer :target_id - t.string :target_type - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20140729145339_migrate_project_tags.rb b/db/migrate/20140729145339_migrate_project_tags.rb deleted file mode 100644 index 711a2d262aa..00000000000 --- a/db/migrate/20140729145339_migrate_project_tags.rb +++ /dev/null @@ -1,9 +0,0 @@ -class MigrateProjectTags < ActiveRecord::Migration[4.2] - def up - ActsAsTaggableOn::Tagging.where(taggable_type: 'Project', context: 'labels').update_all(context: 'tags') - end - - def down - ActsAsTaggableOn::Tagging.where(taggable_type: 'Project', context: 'tags').update_all(context: 'labels') - end -end diff --git a/db/migrate/20140729152420_migrate_taggable_labels.rb b/db/migrate/20140729152420_migrate_taggable_labels.rb deleted file mode 100644 index a8bf8022dfc..00000000000 --- a/db/migrate/20140729152420_migrate_taggable_labels.rb +++ /dev/null @@ -1,36 +0,0 @@ -# rubocop:disable all -class MigrateTaggableLabels < ActiveRecord::Migration[4.2] - def up - taggings = ActsAsTaggableOn::Tagging.where(taggable_type: ['Issue', 'MergeRequest'], context: 'labels') - taggings.find_each(batch_size: 500) do |tagging| - # Clean up orphaned taggings while we are here - if tagging.taggable.blank? || tagging.tag.nil? - tagging.destroy - print 'D' - next - end - create_label_from_tagging(tagging) - end - end - - def down - Label.destroy_all - LabelLink.destroy_all - end - - private - - def create_label_from_tagging(tagging) - target = tagging.taggable - label_name = tagging.tag.name - # '?', '&' and ',' are no longer allowed in label names so we remove them - label_name.tr!('?&,', '') - label = target.project.labels.find_or_create_by(title: label_name, color: Label::DEFAULT_COLOR) - - if label.valid? && LabelLink.create(label: label, target: target) - print '.' - else - print 'F' - end - end -end diff --git a/db/migrate/20140730111702_add_index_to_labels.rb b/db/migrate/20140730111702_add_index_to_labels.rb deleted file mode 100644 index 21f9dfd5d47..00000000000 --- a/db/migrate/20140730111702_add_index_to_labels.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable all -class AddIndexToLabels < ActiveRecord::Migration[4.2] - def change - add_index "labels", :project_id - add_index "label_links", :label_id - add_index "label_links", [:target_id, :target_type] - end -end diff --git a/db/migrate/20140903115954_migrate_to_new_shell.rb b/db/migrate/20140903115954_migrate_to_new_shell.rb deleted file mode 100644 index cc0cce483b1..00000000000 --- a/db/migrate/20140903115954_migrate_to_new_shell.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable all -class MigrateToNewShell < ActiveRecord::Migration[4.2] - def change - return if Rails.env.test? - - gitlab_shell_path = Gitlab.config.gitlab_shell.path - if system("#{gitlab_shell_path}/bin/create-hooks") - puts 'Repositories updated with new hooks' - else - raise 'Failed to rewrite gitlab-shell hooks in repositories' - end - end -end diff --git a/db/migrate/20140907220153_serialize_service_properties.rb b/db/migrate/20140907220153_serialize_service_properties.rb deleted file mode 100644 index bf94c64654b..00000000000 --- a/db/migrate/20140907220153_serialize_service_properties.rb +++ /dev/null @@ -1,43 +0,0 @@ -# rubocop:disable all -class SerializeServiceProperties < ActiveRecord::Migration[4.2] - def change - unless column_exists?(:services, :properties) - add_column :services, :properties, :text - end - - Service.reset_column_information - - associations = - { - AssemblaService: [:token, :subdomain], - CampfireService: [:token, :subdomain, :room], - EmailsOnPushService: [:recipients], - FlowdockService: [:token], - GemnasiumService: [:api_key, :token], - GitlabCiService: [:token, :project_url], - HipchatService: [:token, :room], - PivotaltrackerService: [:token], - SlackService: [:subdomain, :token, :room], - JenkinsService: [:project_url], - JiraService: [:project_url, :username, :password, - :api_version, :jira_issue_transition_id], - } - - Service.find_each(batch_size: 500).each do |service| - associations[service.type.to_sym].each do |attribute| - service.send("#{attribute}=", service.attributes[attribute.to_s]) - end - - service.save(validate: false) - end - - if column_exists?(:services, :project_url) - remove_column :services, :project_url, :string - remove_column :services, :subdomain, :string - remove_column :services, :room, :string - remove_column :services, :recipients, :text - remove_column :services, :api_key, :string - remove_column :services, :token, :string - end - end -end diff --git a/db/migrate/20140914113604_add_members_table.rb b/db/migrate/20140914113604_add_members_table.rb deleted file mode 100644 index 312ea1b94df..00000000000 --- a/db/migrate/20140914113604_add_members_table.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable all -class AddMembersTable < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :members do |t| - t.integer :access_level, null: false - t.integer :source_id, null: false - t.string :source_type, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false - t.string :type - - t.timestamps null: true - end - - add_index :members, :type - add_index :members, :user_id - add_index :members, :access_level - add_index :members, [:source_id, :source_type] - end -end diff --git a/db/migrate/20140914145549_migrate_to_new_members_model.rb b/db/migrate/20140914145549_migrate_to_new_members_model.rb deleted file mode 100644 index 22d8b3d651b..00000000000 --- a/db/migrate/20140914145549_migrate_to_new_members_model.rb +++ /dev/null @@ -1,12 +0,0 @@ -# rubocop:disable all -class MigrateToNewMembersModel < ActiveRecord::Migration[4.2] - def up - execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, group_id, 'Namespace', group_access, notification_level, 'GroupMember' FROM users_groups" - execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, project_id, 'Project', project_access, notification_level, 'ProjectMember' FROM users_projects" - end - - def down - Member.delete_all - end -end - diff --git a/db/migrate/20140914173417_remove_old_member_tables.rb b/db/migrate/20140914173417_remove_old_member_tables.rb deleted file mode 100644 index edd69caa470..00000000000 --- a/db/migrate/20140914173417_remove_old_member_tables.rb +++ /dev/null @@ -1,29 +0,0 @@ -# rubocop:disable all -class RemoveOldMemberTables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - drop_table :users_groups - drop_table :users_projects - end - - def down - create_table :users_groups do |t| - t.integer :group_access, null: false - t.integer :group_id, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false, default: 3 - - t.timestamps null: true - end - - create_table :users_projects do |t| - t.integer :project_access, null: false - t.integer :project_id, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false, default: 3 - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20141006143943_move_slack_service_to_webhook.rb b/db/migrate/20141006143943_move_slack_service_to_webhook.rb deleted file mode 100644 index 1c9a1a74a4e..00000000000 --- a/db/migrate/20141006143943_move_slack_service_to_webhook.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable all -class MoveSlackServiceToWebhook < ActiveRecord::Migration[4.2] - - DOWNTIME = true - DOWNTIME_REASON = 'Move old fields "token" and "subdomain" to one single field "webhook"' - - def change - SlackService.all.each do |slack_service| - if ["token", "subdomain"].all? { |property| slack_service.properties.key? property } - token = slack_service.properties['token'] - subdomain = slack_service.properties['subdomain'] - webhook = "https://#{subdomain}.slack.com/services/hooks/incoming-webhook?token=#{token}" - slack_service.properties['webhook'] = webhook - slack_service.properties.delete('token') - slack_service.properties.delete('subdomain') - # Room is configured on the Slack side - slack_service.properties.delete('room') - slack_service.save(validate: false) - end - end - end -end diff --git a/db/migrate/20141007100818_add_visibility_level_to_snippet.rb b/db/migrate/20141007100818_add_visibility_level_to_snippet.rb deleted file mode 100644 index 9501aed8931..00000000000 --- a/db/migrate/20141007100818_add_visibility_level_to_snippet.rb +++ /dev/null @@ -1,24 +0,0 @@ -# rubocop:disable all -class AddVisibilityLevelToSnippet < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - add_column :snippets, :visibility_level, :integer, :default => 0, :null => false - - execute("UPDATE snippets SET visibility_level = #{Gitlab::VisibilityLevel::PRIVATE} WHERE private = #{true_value}") - execute("UPDATE snippets SET visibility_level = #{Gitlab::VisibilityLevel::INTERNAL} WHERE private = #{false_value}") - - add_index :snippets, :visibility_level - - remove_column :snippets, :private - end - - def down - add_column :snippets, :private, :boolean, :default => false, :null => false - - execute("UPDATE snippets SET private = #{false_value} WHERE visibility_level = #{Gitlab::VisibilityLevel::INTERNAL}") - execute("UPDATE snippets SET private = #{true_value} WHERE visibility_level = #{Gitlab::VisibilityLevel::PRIVATE}") - - remove_column :snippets, :visibility_level - end -end diff --git a/db/migrate/20141118150935_add_audit_event.rb b/db/migrate/20141118150935_add_audit_event.rb deleted file mode 100644 index 1e7dba568c9..00000000000 --- a/db/migrate/20141118150935_add_audit_event.rb +++ /dev/null @@ -1,25 +0,0 @@ -# rubocop:disable all -class AddAuditEvent < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :audit_events do |t| - t.integer :author_id, null: false - t.string :type, null: false - - # "Namespace" where the change occurs - # eg. On a project, group or user - t.integer :entity_id, null: false - t.string :entity_type, null: false - - # Details for the event - t.text :details - - t.timestamps null: true - end - - add_index :audit_events, :author_id - add_index :audit_events, :type - add_index :audit_events, [:entity_id, :entity_type] - end -end diff --git a/db/migrate/20141121133009_add_timestamps_to_members.rb b/db/migrate/20141121133009_add_timestamps_to_members.rb deleted file mode 100644 index cb575fc9ed7..00000000000 --- a/db/migrate/20141121133009_add_timestamps_to_members.rb +++ /dev/null @@ -1,15 +0,0 @@ -# In 20140914145549_migrate_to_new_members_model.rb we forgot to set the -# created_at and updated_at times for new records in the 'members' table. This -# became a problem after commit c8e78d972a5a628870eefca0f2ccea0199c55bda which -# was added in GitLab 7.5. With this migration we ensure that all rows in -# 'members' have at least some created_at and updated_at timestamp. -class AddTimestampsToMembers < ActiveRecord::Migration[4.2] - def up - execute "UPDATE members SET created_at = NOW() WHERE created_at is NULL" - execute "UPDATE members SET updated_at = NOW() WHERE updated_at is NULL" - end - - def down - # no change - end -end diff --git a/db/migrate/20141121161704_add_identity_table.rb b/db/migrate/20141121161704_add_identity_table.rb deleted file mode 100644 index 92f7a568077..00000000000 --- a/db/migrate/20141121161704_add_identity_table.rb +++ /dev/null @@ -1,47 +0,0 @@ -# rubocop:disable all -class AddIdentityTable < ActiveRecord::Migration[4.2] - def up - create_table :identities do |t| - t.string :extern_uid - t.string :provider - t.references :user - end - - add_index :identities, :user_id - - execute <<eos -INSERT INTO identities (provider, extern_uid, user_id) -SELECT provider, extern_uid, id FROM users -WHERE provider IS NOT NULL -eos - - if index_exists?(:users, ["extern_uid", "provider"]) - remove_index :users, ["extern_uid", "provider"] - end - - remove_column :users, :extern_uid - remove_column :users, :provider - end - - def down - add_column :users, :extern_uid, :string - add_column :users, :provider, :string - - if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL' - execute <<eos -UPDATE users u -SET provider = i.provider, extern_uid = i.extern_uid -FROM identities i -WHERE i.user_id = u.id -eos - else - execute "UPDATE users u, identities i SET u.provider = i.provider, u.extern_uid = i.extern_uid WHERE u.id = i.user_id" - end - - drop_table :identities - - unless index_exists?(:users, ["extern_uid", "provider"]) - add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree - end - end -end diff --git a/db/migrate/20141126120926_add_merge_request_rebase_enabled_to_projects.rb b/db/migrate/20141126120926_add_merge_request_rebase_enabled_to_projects.rb deleted file mode 100644 index b9d8a5cb435..00000000000 --- a/db/migrate/20141126120926_add_merge_request_rebase_enabled_to_projects.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class AddMergeRequestRebaseEnabledToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:projects, :merge_requests_rebase_enabled, :boolean, default: false) - end - - def down - remove_column(:projects, :merge_requests_rebase_enabled) - end -end diff --git a/db/migrate/20141205134006_add_locked_at_to_merge_request.rb b/db/migrate/20141205134006_add_locked_at_to_merge_request.rb deleted file mode 100644 index 6fdfb3eb974..00000000000 --- a/db/migrate/20141205134006_add_locked_at_to_merge_request.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddLockedAtToMergeRequest < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :locked_at, :datetime - end -end diff --git a/db/migrate/20141216155758_create_doorkeeper_tables.rb b/db/migrate/20141216155758_create_doorkeeper_tables.rb deleted file mode 100644 index 7bd0a15e7f5..00000000000 --- a/db/migrate/20141216155758_create_doorkeeper_tables.rb +++ /dev/null @@ -1,45 +0,0 @@ -# rubocop:disable all -class CreateDoorkeeperTables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :oauth_applications do |t| - t.string :name, null: false - t.string :uid, null: false - t.string :secret, null: false - t.text :redirect_uri, null: false - t.string :scopes, null: false, default: '' - t.timestamps null: true - end - - add_index :oauth_applications, :uid, unique: true - - create_table :oauth_access_grants do |t| - t.integer :resource_owner_id, null: false - t.integer :application_id, null: false - t.string :token, null: false - t.integer :expires_in, null: false - t.text :redirect_uri, null: false - t.datetime :created_at, null: false - t.datetime :revoked_at - t.string :scopes - end - - add_index :oauth_access_grants, :token, unique: true - - create_table :oauth_access_tokens do |t| - t.integer :resource_owner_id - t.integer :application_id - t.string :token, null: false - t.string :refresh_token - t.integer :expires_in - t.datetime :revoked_at - t.datetime :created_at, null: false - t.string :scopes - end - - add_index :oauth_access_tokens, :token, unique: true - add_index :oauth_access_tokens, :resource_owner_id - add_index :oauth_access_tokens, :refresh_token, unique: true - end -end diff --git a/db/migrate/20141217125223_add_owner_to_application.rb b/db/migrate/20141217125223_add_owner_to_application.rb deleted file mode 100644 index 482a53f3ad5..00000000000 --- a/db/migrate/20141217125223_add_owner_to_application.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable all -class AddOwnerToApplication < ActiveRecord::Migration[4.2] - def change - add_column :oauth_applications, :owner_id, :integer, null: true - add_column :oauth_applications, :owner_type, :string, null: true - add_index :oauth_applications, [:owner_id, :owner_type] - end -end
\ No newline at end of file diff --git a/db/migrate/20141223135007_add_import_data_to_project_table.rb b/db/migrate/20141223135007_add_import_data_to_project_table.rb deleted file mode 100644 index 516f58d645e..00000000000 --- a/db/migrate/20141223135007_add_import_data_to_project_table.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddImportDataToProjectTable < ActiveRecord::Migration[4.2] - def change - add_column :projects, :import_type, :string - add_column :projects, :import_source, :string - - add_column :users, :github_access_token, :string - end -end diff --git a/db/migrate/20141226080412_add_developers_can_push_to_protected_branches.rb b/db/migrate/20141226080412_add_developers_can_push_to_protected_branches.rb deleted file mode 100644 index 43b7de85228..00000000000 --- a/db/migrate/20141226080412_add_developers_can_push_to_protected_branches.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddDevelopersCanPushToProtectedBranches < ActiveRecord::Migration[4.2] - def change - add_column :protected_branches, :developers_can_push, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20150108073740_create_application_settings.rb b/db/migrate/20150108073740_create_application_settings.rb deleted file mode 100644 index be139fee63a..00000000000 --- a/db/migrate/20150108073740_create_application_settings.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable all -class CreateApplicationSettings < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :application_settings do |t| - t.integer :default_projects_limit - t.boolean :signup_enabled - t.boolean :signin_enabled - t.boolean :gravatar_enabled - t.text :sign_in_text - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb b/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb deleted file mode 100644 index e630e2cc878..00000000000 --- a/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHomePageUrlForApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :home_page_url, :string - end -end diff --git a/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb b/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb deleted file mode 100644 index 673628e106b..00000000000 --- a/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddGitlabAccessTokenToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :gitlab_access_token, :string - end -end diff --git a/db/migrate/20150125163100_add_default_branch_protection_setting.rb b/db/migrate/20150125163100_add_default_branch_protection_setting.rb deleted file mode 100644 index f6bfa422124..00000000000 --- a/db/migrate/20150125163100_add_default_branch_protection_setting.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddDefaultBranchProtectionSetting < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :default_branch_protection, :integer, :default => 2 - end -end diff --git a/db/migrate/20150205211843_add_timestamps_to_identities.rb b/db/migrate/20150205211843_add_timestamps_to_identities.rb deleted file mode 100644 index c535a7ec781..00000000000 --- a/db/migrate/20150205211843_add_timestamps_to_identities.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddTimestampsToIdentities < ActiveRecord::Migration[4.2] - def change - add_timestamps(:identities) - end -end diff --git a/db/migrate/20150206181414_add_index_to_created_at.rb b/db/migrate/20150206181414_add_index_to_created_at.rb deleted file mode 100644 index 501acd6a720..00000000000 --- a/db/migrate/20150206181414_add_index_to_created_at.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class AddIndexToCreatedAt < ActiveRecord::Migration[4.2] - def change - add_index "users", [:created_at, :id] - add_index "members", [:created_at, :id] - add_index "projects", [:created_at, :id] - add_index "issues", [:created_at, :id] - add_index "merge_requests", [:created_at, :id] - add_index "milestones", [:created_at, :id] - add_index "namespaces", [:created_at, :id] - add_index "notes", [:created_at, :id] - add_index "identities", [:created_at, :id] - add_index "keys", [:created_at, :id] - add_index "web_hooks", [:created_at, :id] - add_index "snippets", [:created_at, :id] - end -end diff --git a/db/migrate/20150206222854_add_notification_email_to_user.rb b/db/migrate/20150206222854_add_notification_email_to_user.rb deleted file mode 100644 index 7b0c251db4f..00000000000 --- a/db/migrate/20150206222854_add_notification_email_to_user.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddNotificationEmailToUser < ActiveRecord::Migration[4.2] - def up - add_column :users, :notification_email, :string - - execute "UPDATE users SET notification_email = email" - end - - def down - remove_column :users, :notification_email - end -end diff --git a/db/migrate/20150209222013_add_missing_index.rb b/db/migrate/20150209222013_add_missing_index.rb deleted file mode 100644 index 99544ab3928..00000000000 --- a/db/migrate/20150209222013_add_missing_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddMissingIndex < ActiveRecord::Migration[4.2] - def change - add_index "services", [:created_at, :id] - end -end diff --git a/db/migrate/20150211172122_add_template_to_service.rb b/db/migrate/20150211172122_add_template_to_service.rb deleted file mode 100644 index dd192a0fe76..00000000000 --- a/db/migrate/20150211172122_add_template_to_service.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddTemplateToService < ActiveRecord::Migration[4.2] - def change - add_column :services, :template, :boolean, default: false - end -end diff --git a/db/migrate/20150211174341_allow_null_in_services_project_id.rb b/db/migrate/20150211174341_allow_null_in_services_project_id.rb deleted file mode 100644 index 4c90bf9c419..00000000000 --- a/db/migrate/20150211174341_allow_null_in_services_project_id.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AllowNullInServicesProjectId < ActiveRecord::Migration[4.2] - def change - change_column :services, :project_id, :integer, null: true - end -end diff --git a/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb b/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb deleted file mode 100644 index 7d7b9242cd6..00000000000 --- a/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddTwitterSharingEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :twitter_sharing_enabled, :boolean, default: true - end -end diff --git a/db/migrate/20150213114800_add_hide_no_password_to_user.rb b/db/migrate/20150213114800_add_hide_no_password_to_user.rb deleted file mode 100644 index 348c0d22aba..00000000000 --- a/db/migrate/20150213114800_add_hide_no_password_to_user.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddHideNoPasswordToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :hide_no_password, :boolean, default: false - end -end diff --git a/db/migrate/20150213121042_add_password_automatically_set_to_user.rb b/db/migrate/20150213121042_add_password_automatically_set_to_user.rb deleted file mode 100644 index d0eb753b887..00000000000 --- a/db/migrate/20150213121042_add_password_automatically_set_to_user.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPasswordAutomaticallySetToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :password_automatically_set, :boolean, default: false - end -end diff --git a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb b/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb deleted file mode 100644 index 639644174ca..00000000000 --- a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddBitbucketAccessTokenAndSecretToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :bitbucket_access_token, :string - add_column :users, :bitbucket_access_token_secret, :string - end -end diff --git a/db/migrate/20150219004514_add_events_to_services.rb b/db/migrate/20150219004514_add_events_to_services.rb deleted file mode 100644 index 7072056adcb..00000000000 --- a/db/migrate/20150219004514_add_events_to_services.rb +++ /dev/null @@ -1,9 +0,0 @@ -# rubocop:disable all -class AddEventsToServices < ActiveRecord::Migration[4.2] - def change - add_column :services, :push_events, :boolean, :default => true - add_column :services, :issues_events, :boolean, :default => true - add_column :services, :merge_requests_events, :boolean, :default => true - add_column :services, :tag_push_events, :boolean, :default => true - end -end diff --git a/db/migrate/20150223022001_set_missing_last_activity_at.rb b/db/migrate/20150223022001_set_missing_last_activity_at.rb deleted file mode 100644 index c77ffbd4ebd..00000000000 --- a/db/migrate/20150223022001_set_missing_last_activity_at.rb +++ /dev/null @@ -1,8 +0,0 @@ -class SetMissingLastActivityAt < ActiveRecord::Migration[4.2] - def up - execute "UPDATE projects SET last_activity_at = updated_at WHERE last_activity_at IS NULL" - end - - def down - end -end diff --git a/db/migrate/20150225065047_add_note_events_to_services.rb b/db/migrate/20150225065047_add_note_events_to_services.rb deleted file mode 100644 index 32c538e8681..00000000000 --- a/db/migrate/20150225065047_add_note_events_to_services.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddNoteEventsToServices < ActiveRecord::Migration[4.2] - def change - add_column :services, :note_events, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb b/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb deleted file mode 100644 index 3091790f199..00000000000 --- a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRestrictedVisibilityLevelsToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :restricted_visibility_levels, :text - end -end diff --git a/db/migrate/20150306023106_fix_namespace_duplication.rb b/db/migrate/20150306023106_fix_namespace_duplication.rb deleted file mode 100644 index 49be152a75c..00000000000 --- a/db/migrate/20150306023106_fix_namespace_duplication.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable all -class FixNamespaceDuplication < ActiveRecord::Migration[4.2] - def up - #fixes path duplication - select_all('SELECT MAX(id) max, COUNT(id) cnt, path FROM namespaces GROUP BY path HAVING COUNT(id) > 1').each do |nms| - bad_nms_ids = select_all("SELECT id FROM namespaces WHERE path = '#{nms['path']}' AND id <> #{nms['max']}").map{|x| x["id"]} - execute("UPDATE projects SET namespace_id = #{nms["max"]} WHERE namespace_id IN(#{bad_nms_ids.join(', ')})") - execute("DELETE FROM namespaces WHERE id IN(#{bad_nms_ids.join(', ')})") - end - - #fixes name duplication - select_all('SELECT MAX(id) max, COUNT(id) cnt, name FROM namespaces GROUP BY name HAVING COUNT(id) > 1').each do |nms| - bad_nms_ids = select_all("SELECT id FROM namespaces WHERE name = '#{nms['name']}' AND id <> #{nms['max']}").map{|x| x["id"]} - execute("UPDATE projects SET namespace_id = #{nms["max"]} WHERE namespace_id IN(#{bad_nms_ids.join(', ')})") - execute("DELETE FROM namespaces WHERE id IN(#{bad_nms_ids.join(', ')})") - end - end - - def down - # not implemented - end -end diff --git a/db/migrate/20150306023112_add_unique_index_to_namespace.rb b/db/migrate/20150306023112_add_unique_index_to_namespace.rb deleted file mode 100644 index 11472324cbf..00000000000 --- a/db/migrate/20150306023112_add_unique_index_to_namespace.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddUniqueIndexToNamespace < ActiveRecord::Migration[4.2] - def change - remove_index :namespaces, column: :name if index_exists?(:namespaces, :name) - remove_index :namespaces, column: :path if index_exists?(:namespaces, :path) - - add_index :namespaces, :name, unique: true - add_index :namespaces, :path, unique: true - end -end diff --git a/db/migrate/20150310194358_add_version_check_to_application_settings.rb b/db/migrate/20150310194358_add_version_check_to_application_settings.rb deleted file mode 100644 index cc1b19f302e..00000000000 --- a/db/migrate/20150310194358_add_version_check_to_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddVersionCheckToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :version_check_enabled, :boolean, default: true - end -end diff --git a/db/migrate/20150313012111_create_subscriptions_table.rb b/db/migrate/20150313012111_create_subscriptions_table.rb deleted file mode 100644 index 37011504b49..00000000000 --- a/db/migrate/20150313012111_create_subscriptions_table.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable all -class CreateSubscriptionsTable < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :subscriptions do |t| - t.integer :user_id - t.references :subscribable, polymorphic: true - t.boolean :subscribed - - t.timestamps null: true - end - - add_index :subscriptions, - [:subscribable_id, :subscribable_type, :user_id], - unique: true, - name: 'subscriptions_user_id_and_ref_fields' - end -end diff --git a/db/migrate/20150320234437_add_location_to_user.rb b/db/migrate/20150320234437_add_location_to_user.rb deleted file mode 100644 index cf273ff916e..00000000000 --- a/db/migrate/20150320234437_add_location_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddLocationToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :location, :string - end -end diff --git a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb b/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb deleted file mode 100644 index a895d5f24f5..00000000000 --- a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb +++ /dev/null @@ -1,6 +0,0 @@ -class SetIncorrectAssigneeIdToNull < ActiveRecord::Migration[4.2] - def up - execute "UPDATE issues SET assignee_id = NULL WHERE assignee_id = -1" - execute "UPDATE merge_requests SET assignee_id = NULL WHERE assignee_id = -1" - end -end diff --git a/db/migrate/20150327122227_add_public_to_key.rb b/db/migrate/20150327122227_add_public_to_key.rb deleted file mode 100644 index 58d8c16476f..00000000000 --- a/db/migrate/20150327122227_add_public_to_key.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPublicToKey < ActiveRecord::Migration[4.2] - def change - add_column :keys, :public, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20150327150017_add_import_data_to_project.rb b/db/migrate/20150327150017_add_import_data_to_project.rb deleted file mode 100644 index 5d393364ee6..00000000000 --- a/db/migrate/20150327150017_add_import_data_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImportDataToProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :import_data, :text - end -end diff --git a/db/migrate/20150327223628_add_devise_two_factor_to_users.rb b/db/migrate/20150327223628_add_devise_two_factor_to_users.rb deleted file mode 100644 index 22202796547..00000000000 --- a/db/migrate/20150327223628_add_devise_two_factor_to_users.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddDeviseTwoFactorToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :encrypted_otp_secret, :string - add_column :users, :encrypted_otp_secret_iv, :string - add_column :users, :encrypted_otp_secret_salt, :string - add_column :users, :otp_required_for_login, :boolean - end -end diff --git a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb b/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb deleted file mode 100644 index 4ce60a257cb..00000000000 --- a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMaxAttachmentSizeToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :max_attachment_size, :integer, default: 10, null: false - end -end diff --git a/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb b/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb deleted file mode 100644 index 792b98c91f0..00000000000 --- a/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDeviseTwoFactorBackupableToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :otp_backup_codes, :text - end -end diff --git a/db/migrate/20150406133311_add_invite_data_to_member.rb b/db/migrate/20150406133311_add_invite_data_to_member.rb deleted file mode 100644 index eee991185ab..00000000000 --- a/db/migrate/20150406133311_add_invite_data_to_member.rb +++ /dev/null @@ -1,24 +0,0 @@ -# rubocop:disable all -class AddInviteDataToMember < ActiveRecord::Migration[4.2] - def up - add_column :members, :created_by_id, :integer - add_column :members, :invite_email, :string - add_column :members, :invite_token, :string - add_column :members, :invite_accepted_at, :datetime - - change_column :members, :user_id, :integer, null: true - - add_index :members, :invite_token, unique: true - end - - def down - remove_index :members, :invite_token - - change_column :members, :user_id, :integer, null: false - - remove_column :members, :invite_accepted_at - remove_column :members, :invite_token - remove_column :members, :invite_email - remove_column :members, :created_by_id - end -end diff --git a/db/migrate/20150411000035_fix_identities.rb b/db/migrate/20150411000035_fix_identities.rb deleted file mode 100644 index a449fc51ecc..00000000000 --- a/db/migrate/20150411000035_fix_identities.rb +++ /dev/null @@ -1,45 +0,0 @@ -class FixIdentities < ActiveRecord::Migration[4.2] - def up - # Up until now, legacy 'ldap' references in the database were charitably - # interpreted to point to the first LDAP server specified in the GitLab - # configuration. So if the database said 'provider: ldap' but the first - # LDAP server was called 'ldapmain', then we would try to interpret - # 'provider: ldap' as if it said 'provider: ldapmain'. This migration (and - # accompanying changes in the GitLab LDAP code) get rid of this complicated - # behavior. Any database references to 'provider: ldap' get rewritten to - # whatever the code would have interpreted it as, i.e. as a reference to - # the first LDAP server specified in gitlab.yml / gitlab.rb. - new_provider = if Gitlab.config.ldap.enabled - first_ldap_server = Gitlab.config.ldap.servers.values.first - first_ldap_server['provider_name'] - else - 'ldapmain' - end - - # Delete duplicate identities - # We use a sort of self-join to find rows in identities which match on - # user_id but where one has provider 'ldap'. We delete the duplicate row - # with provider 'ldap'. - delete_statement = '' - case adapter_name.downcase - when /^mysql/ - delete_statement << 'DELETE FROM id1 USING identities AS id1, identities AS id2' - when 'postgresql' - delete_statement << 'DELETE FROM identities AS id1 USING identities AS id2' - else - raise "Unknown DB adapter: #{adapter_name}" - end - delete_statement << " WHERE id1.user_id = id2.user_id AND id1.provider = 'ldap' AND id2.provider = '#{new_provider}'" - execute delete_statement - - # Update legacy identities - execute "UPDATE identities SET provider = '#{new_provider}' WHERE provider = 'ldap'" - - if table_exists?('ldap_group_links') - execute "UPDATE ldap_group_links SET provider = '#{new_provider}' WHERE provider IS NULL OR provider = 'ldap'" - end - end - - def down - end -end diff --git a/db/migrate/20150411180045_rename_buildbox_service.rb b/db/migrate/20150411180045_rename_buildbox_service.rb deleted file mode 100644 index ac4ccdfb723..00000000000 --- a/db/migrate/20150411180045_rename_buildbox_service.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RenameBuildboxService < ActiveRecord::Migration[4.2] - def up - execute "UPDATE services SET type = 'BuildkiteService' WHERE type = 'BuildboxService';" - end - - def down - execute "UPDATE services SET type = 'BuildboxService' WHERE type = 'BuildkiteService';" - end -end diff --git a/db/migrate/20150413192223_add_public_email_to_users.rb b/db/migrate/20150413192223_add_public_email_to_users.rb deleted file mode 100644 index 991f0c668c3..00000000000 --- a/db/migrate/20150413192223_add_public_email_to_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPublicEmailToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :public_email, :string, default: "", null: false - end -end diff --git a/db/migrate/20150417121913_create_project_import_data.rb b/db/migrate/20150417121913_create_project_import_data.rb deleted file mode 100644 index 383f64fd2c6..00000000000 --- a/db/migrate/20150417121913_create_project_import_data.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreateProjectImportData < ActiveRecord::Migration[4.2] - def change - create_table :project_import_data do |t| - t.references :project - t.text :data - end - end -end diff --git a/db/migrate/20150417122318_remove_import_data_from_project.rb b/db/migrate/20150417122318_remove_import_data_from_project.rb deleted file mode 100644 index c9a225a9d17..00000000000 --- a/db/migrate/20150417122318_remove_import_data_from_project.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class RemoveImportDataFromProject < ActiveRecord::Migration[4.2] - def up - remove_column :projects, :import_data - end - - def down - add_column :projects, :import_data, :text - end -end diff --git a/db/migrate/20150421120000_remove_periods_at_ends_of_usernames.rb b/db/migrate/20150421120000_remove_periods_at_ends_of_usernames.rb deleted file mode 100644 index d2e7656c9d4..00000000000 --- a/db/migrate/20150421120000_remove_periods_at_ends_of_usernames.rb +++ /dev/null @@ -1,89 +0,0 @@ -# rubocop:disable all -class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration[4.2] - include Gitlab::ShellAdapter - - class Namespace < ActiveRecord::Base - class << self - def find_by_path_or_name(path) - find_by("lower(path) = :path OR lower(name) = :path", path: path.downcase) - end - - def clean_path(path) - path = path.dup - # Get the email username by removing everything after an `@` sign. - path.gsub!(/@.*\z/, "") - # Usernames can't end in .git, so remove it. - path.gsub!(/\.git\z/, "") - # Remove dashes at the start of the username. - path.gsub!(/\A-+/, "") - # Remove periods at the end of the username. - path.gsub!(/\.+\z/, "") - # Remove everything that's not in the list of allowed characters. - path.gsub!(/[^a-zA-Z0-9_\-\.]/, "") - - # Users with the great usernames of "." or ".." would end up with a blank username. - # Work around that by setting their username to "blank", followed by a counter. - path = "blank" if path.blank? - - counter = 0 - base = path - while Namespace.find_by_path_or_name(path) - counter += 1 - path = "#{base}#{counter}" - end - - path - end - end - end - - def up - changed_paths = {} - - select_all("SELECT id, username FROM users WHERE username LIKE '%.'").each do |user| - username_was = user["username"] - username = Namespace.clean_path(username_was) - changed_paths[username_was] = username - - username = quote_string(username) - execute "UPDATE users SET username = '#{username}' WHERE id = #{user["id"]}" - execute "UPDATE namespaces SET path = '#{username}', name = '#{username}' WHERE type IS NULL AND owner_id = #{user["id"]}" - end - - select_all("SELECT id, path FROM namespaces WHERE type = 'Group' AND path LIKE '%.'").each do |group| - path_was = group["path"] - path = Namespace.clean_path(path_was) - changed_paths[path_was] = path - - path = quote_string(path) - execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{group["id"]}" - end - - changed_paths.each do |path_was, path| - # Don't attempt to move if original path only contains periods. - next if path_was =~ /\A\.+\z/ - - if gitlab_shell.mv_namespace(path_was, path) - # If repositories moved successfully we need to remove old satellites - # and send update instructions to users. - # However we cannot allow rollback since we moved namespace dir - # So we basically we mute exceptions in next actions - begin - gitlab_shell.rm_satellites(path_was) - # We cannot send update instructions since models and mailers - # can't safely be used from migrations as they may be written for - # later versions of the database. - # send_update_instructions - rescue - # Returning false does not rollback after_* transaction but gives - # us information about failing some of tasks - false - end - else - # if we cannot move namespace directory we should rollback - # db changes in order to prevent out of sync between db and fs - raise Exception.new('namespace directory cannot be moved') - end - end - end -end diff --git a/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb b/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb deleted file mode 100644 index e0f35da422a..00000000000 --- a/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddDefaultProjectVisibililtyToApplicationSettings < ActiveRecord::Migration[4.2] - def up - add_column :application_settings, :default_project_visibility, :integer - visibility = Settings.gitlab.default_projects_features['visibility_level'] - execute("update application_settings set default_project_visibility = #{visibility}") - end - - def down - remove_column :application_settings, :default_project_visibility - end -end diff --git a/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb b/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb deleted file mode 100644 index 5b2e692eb17..00000000000 --- a/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration is a duplicate of 20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb -# It shold be applied before the index additions to ensure that `name` is case sensitive. - -class GitlabChangeCollationForTagNames < ActiveRecord::Migration[4.2] - def up - if ActsAsTaggableOn::Utils.using_mysql? - execute("ALTER TABLE tags MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_bin;") - end - end -end diff --git a/db/migrate/20150425164647_remove_duplicate_tags.rb b/db/migrate/20150425164647_remove_duplicate_tags.rb deleted file mode 100644 index 5165eb65695..00000000000 --- a/db/migrate/20150425164647_remove_duplicate_tags.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable all -class RemoveDuplicateTags < ActiveRecord::Migration[4.2] - def up - select_all("SELECT name, COUNT(id) as cnt FROM tags GROUP BY name HAVING COUNT(id) > 1").each do |tag| - tag_name = quote_string(tag["name"]) - duplicate_ids = select_all("SELECT id FROM tags WHERE name = '#{tag_name}'").map{|tag| tag["id"]} - origin_tag_id = duplicate_ids.first - duplicate_ids.delete origin_tag_id - - execute("UPDATE taggings SET tag_id = #{origin_tag_id} WHERE tag_id IN(#{duplicate_ids.join(",")})") - execute("DELETE FROM tags WHERE id IN(#{duplicate_ids.join(",")})") - end - end - - def down - - end -end diff --git a/db/migrate/20150425164648_add_missing_unique_indices.acts_as_taggable_on_engine.rb b/db/migrate/20150425164648_add_missing_unique_indices.acts_as_taggable_on_engine.rb deleted file mode 100644 index d1951f640bb..00000000000 --- a/db/migrate/20150425164648_add_missing_unique_indices.acts_as_taggable_on_engine.rb +++ /dev/null @@ -1,28 +0,0 @@ -# rubocop:disable all -# This migration comes from acts_as_taggable_on_engine (originally 2) -class AddMissingUniqueIndices < ActiveRecord::Migration[4.2] - def self.up - add_index :tags, :name, unique: true - - # pre-GitLab v6.7.0 may not have these indices since there were no - # migrations for them - if index_exists?(:taggings, :tag_id) - remove_index :taggings, :tag_id - end - - if index_exists?(:taggings, [:taggable_id, :taggable_type, :context]) - remove_index :taggings, [:taggable_id, :taggable_type, :context] - end - add_index :taggings, - [:tag_id, :taggable_id, :taggable_type, :context, :tagger_id, :tagger_type], - unique: true, name: 'taggings_idx' - end - - def self.down - remove_index :tags, :name - - remove_index :taggings, name: 'taggings_idx' - add_index :taggings, :tag_id - add_index :taggings, [:taggable_id, :taggable_type, :context] - end -end diff --git a/db/migrate/20150425164649_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb b/db/migrate/20150425164649_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb deleted file mode 100644 index b9af394f09b..00000000000 --- a/db/migrate/20150425164649_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable all -# This migration comes from acts_as_taggable_on_engine (originally 3) -class AddTaggingsCounterCacheToTags < ActiveRecord::Migration[4.2] - def self.up - add_column :tags, :taggings_count, :integer, default: 0 - - ActsAsTaggableOn::Tag.reset_column_information - ActsAsTaggableOn::Tag.find_each do |tag| - ActsAsTaggableOn::Tag.reset_counters(tag.id, :taggings) - end - end - - def self.down - remove_column :tags, :taggings_count - end -end diff --git a/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb b/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb deleted file mode 100644 index f28737615d7..00000000000 --- a/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from acts_as_taggable_on_engine (originally 4) -class AddMissingTaggableIndex < ActiveRecord::Migration[4.2] - def self.up - add_index :taggings, [:taggable_id, :taggable_type, :context] - end - - def self.down - remove_index :taggings, [:taggable_id, :taggable_type, :context] - end -end diff --git a/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb b/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb deleted file mode 100644 index 4c144a8693f..00000000000 --- a/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from acts_as_taggable_on_engine (originally 5) -# This migration is added to circumvent issue #623 and have special characters -# work properly -class ChangeCollationForTagNames < ActiveRecord::Migration[4.2] - def up - if ActsAsTaggableOn::Utils.using_mysql? - execute("ALTER TABLE tags MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_bin;") - end - end -end diff --git a/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb b/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb deleted file mode 100644 index a3a86d26767..00000000000 --- a/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddDefaultSnippetVisibilityToAppSettings < ActiveRecord::Migration[4.2] - def up - add_column :application_settings, :default_snippet_visibility, :integer - visibility = Settings.gitlab.default_projects_features['visibility_level'] - execute("update application_settings set default_snippet_visibility = #{visibility}") - end - - def down - remove_column :application_settings, :default_snippet_visibility - end -end diff --git a/db/migrate/20150429002313_remove_abandoned_group_members_records.rb b/db/migrate/20150429002313_remove_abandoned_group_members_records.rb deleted file mode 100644 index 370b807dd50..00000000000 --- a/db/migrate/20150429002313_remove_abandoned_group_members_records.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveAbandonedGroupMembersRecords < ActiveRecord::Migration[4.2] - def up - execute("DELETE FROM members WHERE type = 'GroupMember' AND source_id NOT IN(\ - SELECT id FROM namespaces WHERE type='Group')") - end - - def down - end -end diff --git a/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb b/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb deleted file mode 100644 index df777263ecb..00000000000 --- a/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRestrictedSignupDomainsToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :restricted_signup_domains, :text - end -end diff --git a/db/migrate/20150509180749_convert_legacy_reference_notes.rb b/db/migrate/20150509180749_convert_legacy_reference_notes.rb deleted file mode 100644 index 84d4eb9e51f..00000000000 --- a/db/migrate/20150509180749_convert_legacy_reference_notes.rb +++ /dev/null @@ -1,17 +0,0 @@ -# Convert legacy Markdown-emphasized notes to the current, non-emphasized format -# -# _mentioned in 54f7727c850972f0401c1312a7c4a6a380de5666_ -# -# becomes -# -# mentioned in 54f7727c850972f0401c1312a7c4a6a380de5666 -class ConvertLegacyReferenceNotes < ActiveRecord::Migration[4.2] - def up - quoted_column_name = ActiveRecord::Base.connection.quote_column_name('system') - execute %Q{UPDATE notes SET note = trim(both '_' from note) WHERE #{quoted_column_name} = true AND note LIKE '\_%\_'} - end - - def down - # noop - end -end diff --git a/db/migrate/20150516060434_add_note_events_to_web_hooks.rb b/db/migrate/20150516060434_add_note_events_to_web_hooks.rb deleted file mode 100644 index ddf26240b8b..00000000000 --- a/db/migrate/20150516060434_add_note_events_to_web_hooks.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddNoteEventsToWebHooks < ActiveRecord::Migration[4.2] - def up - add_column :web_hooks, :note_events, :boolean, default: false, null: false - end - - def down - remove_column :web_hooks, :note_events, :boolean - end -end diff --git a/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb b/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb deleted file mode 100644 index 507e905acd6..00000000000 --- a/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddUserOauthApplicationsToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :user_oauth_applications, :bool, default: true - end -end diff --git a/db/migrate/20150529150354_add_after_sign_out_path_for_application_settings.rb b/db/migrate/20150529150354_add_after_sign_out_path_for_application_settings.rb deleted file mode 100644 index f43f20def5b..00000000000 --- a/db/migrate/20150529150354_add_after_sign_out_path_for_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddAfterSignOutPathForApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :after_sign_out_path, :string - end -end
\ No newline at end of file diff --git a/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb b/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb deleted file mode 100644 index 93959a9010f..00000000000 --- a/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddSessionExpireDelayForApplicationSettings < ActiveRecord::Migration[4.2] - def change - unless column_exists?(:application_settings, :session_expire_delay) - add_column :application_settings, :session_expire_delay, :integer, default: 10080, null: false - end - end -end diff --git a/db/migrate/20150610065936_add_dashboard_to_users.rb b/db/migrate/20150610065936_add_dashboard_to_users.rb deleted file mode 100644 index a0bf5f31f00..00000000000 --- a/db/migrate/20150610065936_add_dashboard_to_users.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddDashboardToUsers < ActiveRecord::Migration[4.2] - def up - add_column :users, :dashboard, :integer, default: 0 - end - - def down - remove_column :users, :dashboard - end -end diff --git a/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb b/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb deleted file mode 100644 index 4a085ff06f3..00000000000 --- a/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddDefaultOtpRequiredForLoginValue < ActiveRecord::Migration[4.2] - def up - execute %q{UPDATE users SET otp_required_for_login = FALSE WHERE otp_required_for_login IS NULL} - - change_column :users, :otp_required_for_login, :boolean, default: false, null: false - end - - def down - change_column :users, :otp_required_for_login, :boolean, null: true - end -end diff --git a/db/migrate/20150713160110_add_project_view_to_users.rb b/db/migrate/20150713160110_add_project_view_to_users.rb deleted file mode 100644 index fea63576187..00000000000 --- a/db/migrate/20150713160110_add_project_view_to_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddProjectViewToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :project_view, :integer, default: 0 - end -end diff --git a/db/migrate/20150717130904_add_commits_count_to_project.rb b/db/migrate/20150717130904_add_commits_count_to_project.rb deleted file mode 100644 index df6c88f2961..00000000000 --- a/db/migrate/20150717130904_add_commits_count_to_project.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddCommitsCountToProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :commit_count, :integer, default: 0 - end -end diff --git a/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb b/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb deleted file mode 100644 index fab126c3d04..00000000000 --- a/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddUpdatedByToIssuablesAndNotes < ActiveRecord::Migration[4.2] - def change - add_column :notes, :updated_by_id, :integer - add_column :issues, :updated_by_id, :integer - add_column :merge_requests, :updated_by_id, :integer - end -end diff --git a/db/migrate/20150806104937_create_abuse_reports.rb b/db/migrate/20150806104937_create_abuse_reports.rb deleted file mode 100644 index be4fe8d1cfd..00000000000 --- a/db/migrate/20150806104937_create_abuse_reports.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable all -class CreateAbuseReports < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :abuse_reports do |t| - t.integer :reporter_id - t.integer :user_id - t.text :message - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20150812080800_add_settings_import_sources.rb b/db/migrate/20150812080800_add_settings_import_sources.rb deleted file mode 100644 index 59db31c868a..00000000000 --- a/db/migrate/20150812080800_add_settings_import_sources.rb +++ /dev/null @@ -1,12 +0,0 @@ -# rubocop:disable all -require 'yaml' - -class AddSettingsImportSources < ActiveRecord::Migration[4.2] - def change - unless column_exists?(:application_settings, :import_sources) - add_column :application_settings, :import_sources, :text - import_sources = YAML::dump(Settings.gitlab['import_sources']) - execute("update application_settings set import_sources = '#{import_sources}'") - end - end -end diff --git a/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb b/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb deleted file mode 100644 index f0080ee0b46..00000000000 --- a/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -# rubocop:disable all -class RemoveOauthTokensFromUsers < ActiveRecord::Migration[4.2] - def change - remove_column :users, :github_access_token, :string - remove_column :users, :gitlab_access_token, :string - remove_column :users, :bitbucket_access_token, :string - remove_column :users, :bitbucket_access_token_secret, :string - end -end diff --git a/db/migrate/20150817163600_deduplicate_user_identities.rb b/db/migrate/20150817163600_deduplicate_user_identities.rb deleted file mode 100644 index 973a87e07ea..00000000000 --- a/db/migrate/20150817163600_deduplicate_user_identities.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable all -class DeduplicateUserIdentities < ActiveRecord::Migration[4.2] - def change - execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' - execute 'CREATE TABLE tt_migration_DeduplicateUserIdentities AS SELECT id,provider,user_id FROM identities;' - execute 'DELETE FROM identities WHERE id NOT IN ( SELECT MIN(id) FROM tt_migration_DeduplicateUserIdentities GROUP BY user_id, provider);' - execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' - end - - def down - # This is an irreversible migration; - # If someone is trying to rollback for other reasons, we should not throw an Exception. - # raise ActiveRecord::IrreversibleMigration - end -end diff --git a/db/migrate/20150818213832_add_sent_notifications.rb b/db/migrate/20150818213832_add_sent_notifications.rb deleted file mode 100644 index 45e95a843e1..00000000000 --- a/db/migrate/20150818213832_add_sent_notifications.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddSentNotifications < ActiveRecord::Migration[4.2] - def change - create_table :sent_notifications do |t| - t.references :project - t.references :noteable, polymorphic: true - t.references :recipient - t.string :commit_id - t.string :reply_key, null: false - end - - add_index :sent_notifications, :reply_key, unique: true - end -end diff --git a/db/migrate/20150824002011_add_enable_ssl_verification.rb b/db/migrate/20150824002011_add_enable_ssl_verification.rb deleted file mode 100644 index 2d877914f39..00000000000 --- a/db/migrate/20150824002011_add_enable_ssl_verification.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddEnableSslVerification < ActiveRecord::Migration[4.2] - def change - add_column :web_hooks, :enable_ssl_verification, :boolean, default: false - end -end diff --git a/db/migrate/20150826001931_add_ci_tables.rb b/db/migrate/20150826001931_add_ci_tables.rb deleted file mode 100644 index aa2af44a15b..00000000000 --- a/db/migrate/20150826001931_add_ci_tables.rb +++ /dev/null @@ -1,191 +0,0 @@ -# rubocop:disable all -class AddCiTables < ActiveRecord::Migration[4.2] - def change - create_table "ci_application_settings", force: true do |t| - t.boolean "all_broken_builds" - t.boolean "add_pusher" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "ci_builds", force: true do |t| - t.integer "project_id" - t.string "status" - t.datetime "finished_at" - t.text "trace" - t.datetime "created_at" - t.datetime "updated_at" - t.datetime "started_at" - t.integer "runner_id" - t.float "coverage" - t.integer "commit_id" - t.text "commands" - t.integer "job_id" - t.string "name" - t.boolean "deploy", default: false - t.text "options" - t.boolean "allow_failure", default: false, null: false - t.string "stage" - t.integer "trigger_request_id" - end - - add_index "ci_builds", ["commit_id"], name: "index_ci_builds_on_commit_id", using: :btree - add_index "ci_builds", ["project_id", "commit_id"], name: "index_ci_builds_on_project_id_and_commit_id", using: :btree - add_index "ci_builds", ["project_id"], name: "index_ci_builds_on_project_id", using: :btree - add_index "ci_builds", ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree - - create_table "ci_commits", force: true do |t| - t.integer "project_id" - t.string "ref" - t.string "sha" - t.string "before_sha" - t.text "push_data" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "tag", default: false - t.text "yaml_errors" - t.datetime "committed_at" - end - - add_index "ci_commits", ["project_id", "committed_at"], name: "index_ci_commits_on_project_id_and_committed_at", using: :btree - add_index "ci_commits", ["project_id", "sha"], name: "index_ci_commits_on_project_id_and_sha", using: :btree - add_index "ci_commits", ["project_id"], name: "index_ci_commits_on_project_id", using: :btree - add_index "ci_commits", ["sha"], name: "index_ci_commits_on_sha", using: :btree - - create_table "ci_events", force: true do |t| - t.integer "project_id" - t.integer "user_id" - t.integer "is_admin" - t.text "description" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "ci_events", ["created_at"], name: "index_ci_events_on_created_at", using: :btree - add_index "ci_events", ["is_admin"], name: "index_ci_events_on_is_admin", using: :btree - add_index "ci_events", ["project_id"], name: "index_ci_events_on_project_id", using: :btree - - create_table "ci_jobs", force: true do |t| - t.integer "project_id", null: false - t.text "commands" - t.boolean "active", default: true, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "name" - t.boolean "build_branches", default: true, null: false - t.boolean "build_tags", default: false, null: false - t.string "job_type", default: "parallel" - t.string "refs" - t.datetime "deleted_at" - end - - add_index "ci_jobs", ["deleted_at"], name: "index_ci_jobs_on_deleted_at", using: :btree - add_index "ci_jobs", ["project_id"], name: "index_ci_jobs_on_project_id", using: :btree - - create_table "ci_projects", force: true do |t| - t.string "name", null: false - t.integer "timeout", default: 3600, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "token" - t.string "default_ref" - t.string "path" - t.boolean "always_build", default: false, null: false - t.integer "polling_interval" - t.boolean "public", default: false, null: false - t.string "ssh_url_to_repo" - t.integer "gitlab_id" - t.boolean "allow_git_fetch", default: true, null: false - t.string "email_recipients", default: "", null: false - t.boolean "email_add_pusher", default: true, null: false - t.boolean "email_only_broken_builds", default: true, null: false - t.string "skip_refs" - t.string "coverage_regex" - t.boolean "shared_runners_enabled", default: false - t.text "generated_yaml_config" - end - - create_table "ci_runner_projects", force: true do |t| - t.integer "runner_id", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "ci_runner_projects", ["project_id"], name: "index_ci_runner_projects_on_project_id", using: :btree - add_index "ci_runner_projects", ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree - - create_table "ci_runners", force: true do |t| - t.string "token" - t.datetime "created_at" - t.datetime "updated_at" - t.string "description" - t.datetime "contacted_at" - t.boolean "active", default: true, null: false - t.boolean "is_shared", default: false - t.string "name" - t.string "version" - t.string "revision" - t.string "platform" - t.string "architecture" - end - - create_table "ci_services", force: true do |t| - t.string "type" - t.string "title" - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "active", default: false, null: false - t.text "properties" - end - - add_index "ci_services", ["project_id"], name: "index_ci_services_on_project_id", using: :btree - - create_table "ci_sessions", force: true do |t| - t.string "session_id", null: false - t.text "data" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "ci_sessions", ["session_id"], name: "index_ci_sessions_on_session_id", using: :btree - add_index "ci_sessions", ["updated_at"], name: "index_ci_sessions_on_updated_at", using: :btree - - create_table "ci_trigger_requests", force: true do |t| - t.integer "trigger_id", null: false - t.text "variables" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "commit_id" - end - - create_table "ci_triggers", force: true do |t| - t.string "token" - t.integer "project_id", null: false - t.datetime "deleted_at" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "ci_triggers", ["deleted_at"], name: "index_ci_triggers_on_deleted_at", using: :btree - - create_table "ci_variables", force: true do |t| - t.integer "project_id", null: false - t.string "key" - t.text "value" - t.text "encrypted_value" - t.string "encrypted_value_salt" - t.string "encrypted_value_iv" - end - - add_index "ci_variables", ["project_id"], name: "index_ci_variables_on_project_id", using: :btree - - create_table "ci_web_hooks", force: true do |t| - t.string "url", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - end -end diff --git a/db/migrate/20150827121444_add_fast_forward_option_to_project.rb b/db/migrate/20150827121444_add_fast_forward_option_to_project.rb deleted file mode 100644 index bf7db2fb12b..00000000000 --- a/db/migrate/20150827121444_add_fast_forward_option_to_project.rb +++ /dev/null @@ -1,23 +0,0 @@ -# rubocop:disable all -class AddFastForwardOptionToProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # We put condition here because of a mistake we made a couple of years ago - # see https://gitlab.com/gitlab-org/gitlab-ce/issues/39382#note_45716103 - unless column_exists?(:projects, :merge_requests_ff_only_enabled) - add_column_with_default(:projects, :merge_requests_ff_only_enabled, :boolean, default: false) - end - end - - def down - if column_exists?(:projects, :merge_requests_ff_only_enabled) - remove_column(:projects, :merge_requests_ff_only_enabled) - end - end -end diff --git a/db/migrate/20150902001023_add_template_to_label.rb b/db/migrate/20150902001023_add_template_to_label.rb deleted file mode 100644 index 10769f29baa..00000000000 --- a/db/migrate/20150902001023_add_template_to_label.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddTemplateToLabel < ActiveRecord::Migration[4.2] - def change - add_column :labels, :template, :boolean, default: false - end -end
\ No newline at end of file diff --git a/db/migrate/20150914215247_add_ci_tags.rb b/db/migrate/20150914215247_add_ci_tags.rb deleted file mode 100644 index 9afa4540540..00000000000 --- a/db/migrate/20150914215247_add_ci_tags.rb +++ /dev/null @@ -1,24 +0,0 @@ -# rubocop:disable all -class AddCiTags < ActiveRecord::Migration[4.2] - def change - create_table "ci_taggings", force: true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", limit: 128 - t.datetime "created_at" - end - - add_index "ci_taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "ci_taggings_idx", unique: true, using: :btree - add_index "ci_taggings", ["taggable_id", "taggable_type", "context"], name: "index_ci_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree - - create_table "ci_tags", force: true do |t| - t.string "name" - t.integer "taggings_count", default: 0 - end - - add_index "ci_tags", ["name"], name: "index_ci_tags_on_name", unique: true, using: :btree - end -end diff --git a/db/migrate/20150915001905_enable_ssl_verification_by_default.rb b/db/migrate/20150915001905_enable_ssl_verification_by_default.rb deleted file mode 100644 index ddd07179753..00000000000 --- a/db/migrate/20150915001905_enable_ssl_verification_by_default.rb +++ /dev/null @@ -1,5 +0,0 @@ -class EnableSslVerificationByDefault < ActiveRecord::Migration[4.2] - def change - change_column :web_hooks, :enable_ssl_verification, :boolean, default: true - end -end diff --git a/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb b/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb deleted file mode 100644 index 49081c9d749..00000000000 --- a/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb +++ /dev/null @@ -1,8 +0,0 @@ -class EnableSslVerificationForWebHooks < ActiveRecord::Migration[4.2] - def up - execute("UPDATE web_hooks SET enable_ssl_verification = true") - end - - def down - end -end diff --git a/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb b/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb deleted file mode 100644 index 52867632880..00000000000 --- a/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHelpPageTextToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :help_page_text, :text - end -end diff --git a/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb b/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb deleted file mode 100644 index bf78aacd9f4..00000000000 --- a/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddIndexForCommittedAtAndId < ActiveRecord::Migration[4.2] - def change - add_index :ci_commits, [:project_id, :committed_at, :id] - end -end diff --git a/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb b/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb deleted file mode 100644 index 153c1a798c3..00000000000 --- a/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddCiEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :ci_enabled, :boolean, null: false, default: true - end -end diff --git a/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb b/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb deleted file mode 100644 index 52651e16324..00000000000 --- a/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RemoveInvalidMilestonesFromMergeRequests < ActiveRecord::Migration[4.2] - def up - execute("UPDATE merge_requests SET milestone_id = NULL where milestone_id NOT IN (SELECT id FROM milestones)") - end -end diff --git a/db/migrate/20150920010715_add_consumed_timestep_to_users.rb b/db/migrate/20150920010715_add_consumed_timestep_to_users.rb deleted file mode 100644 index c69944b1e94..00000000000 --- a/db/migrate/20150920010715_add_consumed_timestep_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddConsumedTimestepToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :consumed_timestep, :integer - end -end diff --git a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb deleted file mode 100644 index 671476f0b07..00000000000 --- a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddLineCodeToSentNotification < ActiveRecord::Migration[4.2] - def change - add_column :sent_notifications, :line_code, :string - end -end diff --git a/db/migrate/20150924125150_add_project_id_to_ci_commit.rb b/db/migrate/20150924125150_add_project_id_to_ci_commit.rb deleted file mode 100644 index c9f16b0f3f9..00000000000 --- a/db/migrate/20150924125150_add_project_id_to_ci_commit.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddProjectIdToCiCommit < ActiveRecord::Migration[4.2] - def up - add_column :ci_commits, :gl_project_id, :integer - end -end diff --git a/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb b/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb deleted file mode 100644 index ff31e70874f..00000000000 --- a/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb +++ /dev/null @@ -1,6 +0,0 @@ -class MigrateProjectIdForCiCommits < ActiveRecord::Migration[4.2] - def up - subquery = 'SELECT gitlab_id FROM ci_projects WHERE ci_projects.id = ci_commits.project_id' - execute("UPDATE ci_commits SET gl_project_id=(#{subquery}) WHERE gl_project_id IS NULL") - end -end diff --git a/db/migrate/20150930001110_merge_request_error_field.rb b/db/migrate/20150930001110_merge_request_error_field.rb deleted file mode 100644 index 30f012b0a92..00000000000 --- a/db/migrate/20150930001110_merge_request_error_field.rb +++ /dev/null @@ -1,5 +0,0 @@ -class MergeRequestErrorField < ActiveRecord::Migration[4.2] - def up - add_column :merge_requests, :merge_error, :string - end -end diff --git a/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb b/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb deleted file mode 100644 index 181f9f059ac..00000000000 --- a/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddNullToNameForCiProjects < ActiveRecord::Migration[4.2] - def up - change_column_null :ci_projects, :name, true - end - - def down - change_column_null :ci_projects, :name, false - end -end diff --git a/db/migrate/20150930110012_add_group_share_lock.rb b/db/migrate/20150930110012_add_group_share_lock.rb deleted file mode 100644 index 62755765457..00000000000 --- a/db/migrate/20150930110012_add_group_share_lock.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddGroupShareLock < ActiveRecord::Migration[4.2] - def change - add_column :namespaces, :share_with_group_lock, :boolean, default: false - end -end diff --git a/db/migrate/20151002112914_add_stage_idx_to_builds.rb b/db/migrate/20151002112914_add_stage_idx_to_builds.rb deleted file mode 100644 index f73df9dc284..00000000000 --- a/db/migrate/20151002112914_add_stage_idx_to_builds.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStageIdxToBuilds < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :stage_idx, :integer - end -end diff --git a/db/migrate/20151002121400_add_index_for_builds.rb b/db/migrate/20151002121400_add_index_for_builds.rb deleted file mode 100644 index 5e6f80a1d3d..00000000000 --- a/db/migrate/20151002121400_add_index_for_builds.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddIndexForBuilds < ActiveRecord::Migration[4.2] - def up - add_index :ci_builds, [:commit_id, :stage_idx, :created_at] - end -end diff --git a/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb b/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb deleted file mode 100644 index ea41921b6ee..00000000000 --- a/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddRefAndTagToBuilds < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :tag, :boolean - add_column :ci_builds, :ref, :string - end -end diff --git a/db/migrate/20151002122943_migrate_ref_and_tag_to_build.rb b/db/migrate/20151002122943_migrate_ref_and_tag_to_build.rb deleted file mode 100644 index b4038e6fa83..00000000000 --- a/db/migrate/20151002122943_migrate_ref_and_tag_to_build.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class MigrateRefAndTagToBuild < ActiveRecord::Migration[4.2] - def change - execute('UPDATE ci_builds SET ref=(SELECT ref FROM ci_commits WHERE ci_commits.id = ci_builds.commit_id) WHERE ref IS NULL') - execute('UPDATE ci_builds SET tag=(SELECT tag FROM ci_commits WHERE ci_commits.id = ci_builds.commit_id) WHERE tag IS NULL') - end -end diff --git a/db/migrate/20151005075649_add_user_id_to_build.rb b/db/migrate/20151005075649_add_user_id_to_build.rb deleted file mode 100644 index 45372bf7cba..00000000000 --- a/db/migrate/20151005075649_add_user_id_to_build.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddUserIdToBuild < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :user_id, :integer - end -end diff --git a/db/migrate/20151005150751_add_layout_option_for_users.rb b/db/migrate/20151005150751_add_layout_option_for_users.rb deleted file mode 100644 index 66cba21320a..00000000000 --- a/db/migrate/20151005150751_add_layout_option_for_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddLayoutOptionForUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :layout, :integer, default: 0 - end -end
\ No newline at end of file diff --git a/db/migrate/20151005162154_remove_ci_enabled_from_application_settings.rb b/db/migrate/20151005162154_remove_ci_enabled_from_application_settings.rb deleted file mode 100644 index a8e6e54062a..00000000000 --- a/db/migrate/20151005162154_remove_ci_enabled_from_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class RemoveCiEnabledFromApplicationSettings < ActiveRecord::Migration[4.2] - def change - remove_column :application_settings, :ci_enabled, :boolean, null: false, default: true - end -end diff --git a/db/migrate/20151007120511_namespaces_projects_path_lower_indexes.rb b/db/migrate/20151007120511_namespaces_projects_path_lower_indexes.rb deleted file mode 100644 index d6c21bf8639..00000000000 --- a/db/migrate/20151007120511_namespaces_projects_path_lower_indexes.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable all -class NamespacesProjectsPathLowerIndexes < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - execute 'CREATE INDEX CONCURRENTLY index_on_namespaces_lower_path ON namespaces (LOWER(path));' - execute 'CREATE INDEX CONCURRENTLY index_on_projects_lower_path ON projects (LOWER(path));' - end - - def down - return unless Gitlab::Database.postgresql? - - remove_index :namespaces, name: :index_on_namespaces_lower_path - remove_index :projects, name: :index_on_projects_lower_path - end -end diff --git a/db/migrate/20151008110232_add_users_lower_username_email_indexes.rb b/db/migrate/20151008110232_add_users_lower_username_email_indexes.rb deleted file mode 100644 index 2ba1a6146e2..00000000000 --- a/db/migrate/20151008110232_add_users_lower_username_email_indexes.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable all -class AddUsersLowerUsernameEmailIndexes < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - execute 'CREATE INDEX CONCURRENTLY index_on_users_lower_username ON users (LOWER(username));' - execute 'CREATE INDEX CONCURRENTLY index_on_users_lower_email ON users (LOWER(email));' - end - - def down - return unless Gitlab::Database.postgresql? - - remove_index :users, :index_on_users_lower_username - remove_index :users, :index_on_users_lower_email - end -end diff --git a/db/migrate/20151008123042_add_type_and_description_to_builds.rb b/db/migrate/20151008123042_add_type_and_description_to_builds.rb deleted file mode 100644 index 309655cf195..00000000000 --- a/db/migrate/20151008123042_add_type_and_description_to_builds.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddTypeAndDescriptionToBuilds < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :type, :string - add_column :ci_builds, :target_url, :string - add_column :ci_builds, :description, :string - add_index :ci_builds, [:commit_id, :type, :ref] - add_index :ci_builds, [:commit_id, :type, :name, :ref] - end -end diff --git a/db/migrate/20151008130321_migrate_name_to_description_for_builds.rb b/db/migrate/20151008130321_migrate_name_to_description_for_builds.rb deleted file mode 100644 index f4445277a6f..00000000000 --- a/db/migrate/20151008130321_migrate_name_to_description_for_builds.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class MigrateNameToDescriptionForBuilds < ActiveRecord::Migration[4.2] - def change - execute("UPDATE ci_builds SET type='Ci::Build' WHERE type IS NULL") - end -end diff --git a/db/migrate/20151008143519_add_admin_notification_email_setting.rb b/db/migrate/20151008143519_add_admin_notification_email_setting.rb deleted file mode 100644 index 60e0986e5a8..00000000000 --- a/db/migrate/20151008143519_add_admin_notification_email_setting.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddAdminNotificationEmailSetting < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :admin_notification_email, :string - end -end diff --git a/db/migrate/20151012173029_set_jira_service_api_url.rb b/db/migrate/20151012173029_set_jira_service_api_url.rb deleted file mode 100644 index 91cc6bbc783..00000000000 --- a/db/migrate/20151012173029_set_jira_service_api_url.rb +++ /dev/null @@ -1,51 +0,0 @@ -# rubocop:disable all -class SetJiraServiceApiUrl < ActiveRecord::Migration[4.2] - # This migration can be performed online without errors, but some Jira API calls may be missed - # when doing so because api_url is not yet available. - - def build_api_url_from_project_url(project_url, api_version) - # this is the exact logic previously used to build the Jira API URL from project_url - server = URI(project_url) - default_ports = [80, 443].include?(server.port) - server_url = "#{server.scheme}://#{server.host}" - server_url.concat(":#{server.port}") unless default_ports - "#{server_url}/rest/api/#{api_version}" - end - - def get_api_version_from_api_url(api_url) - match = /\/rest\/api\/(?<api_version>\w+)$/.match(api_url) - match && match['api_version'] - end - - def change - reversible do |dir| - select_all("SELECT id, properties FROM services WHERE services.type IN ('JiraService')").each do |jira_service| - id = jira_service["id"] - properties = JSON.parse(jira_service["properties"]) - properties_was = properties.clone - - dir.up do - # remove api_version and set api_url - if properties['api_version'].present? && properties['project_url'].present? - begin - properties['api_url'] ||= build_api_url_from_project_url(properties['project_url'], properties['api_version']) - rescue - # looks like project_url was not a valid URL. Do nothing. - end - end - properties.delete('api_version') if properties.include?('api_version') - end - - dir.down do - # remove api_url and set api_version (default to '2') - properties['api_version'] ||= get_api_version_from_api_url(properties['api_url']) || '2' - properties.delete('api_url') if properties.include?('api_url') - end - - if properties != properties_was - execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}") - end - end - end - end -end diff --git a/db/migrate/20151013092124_add_artifacts_file_to_builds.rb b/db/migrate/20151013092124_add_artifacts_file_to_builds.rb deleted file mode 100644 index 3936386a2c0..00000000000 --- a/db/migrate/20151013092124_add_artifacts_file_to_builds.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddArtifactsFileToBuilds < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :artifacts_file, :text - end -end diff --git a/db/migrate/20151016131433_add_ci_projects_gl_project_id_index.rb b/db/migrate/20151016131433_add_ci_projects_gl_project_id_index.rb deleted file mode 100644 index a9290fef11a..00000000000 --- a/db/migrate/20151016131433_add_ci_projects_gl_project_id_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddCiProjectsGlProjectIdIndex < ActiveRecord::Migration[4.2] - def change - add_index :ci_commits, :gl_project_id - end -end diff --git a/db/migrate/20151016195451_add_ci_builds_and_projects_indexes.rb b/db/migrate/20151016195451_add_ci_builds_and_projects_indexes.rb deleted file mode 100644 index c8a79f25ae5..00000000000 --- a/db/migrate/20151016195451_add_ci_builds_and_projects_indexes.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddCiBuildsAndProjectsIndexes < ActiveRecord::Migration[4.2] - def change - add_index :ci_projects, :gitlab_id - add_index :ci_projects, :shared_runners_enabled - - add_index :ci_builds, :type - add_index :ci_builds, :status - end -end diff --git a/db/migrate/20151016195706_add_notes_line_code_index.rb b/db/migrate/20151016195706_add_notes_line_code_index.rb deleted file mode 100644 index 0a3ad103009..00000000000 --- a/db/migrate/20151016195706_add_notes_line_code_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddNotesLineCodeIndex < ActiveRecord::Migration[4.2] - def change - add_index :notes, :line_code - end -end diff --git a/db/migrate/20151019111551_fix_build_tags.rb b/db/migrate/20151019111551_fix_build_tags.rb deleted file mode 100644 index 3c64388314d..00000000000 --- a/db/migrate/20151019111551_fix_build_tags.rb +++ /dev/null @@ -1,9 +0,0 @@ -class FixBuildTags < ActiveRecord::Migration[4.2] - def up - execute("UPDATE taggings SET taggable_type='CommitStatus' WHERE taggable_type='Ci::Build'") - end - - def down - execute("UPDATE taggings SET taggable_type='Ci::Build' WHERE taggable_type='CommitStatus'") - end -end diff --git a/db/migrate/20151019111703_fail_build_without_names.rb b/db/migrate/20151019111703_fail_build_without_names.rb deleted file mode 100644 index 2dc9ffa32b9..00000000000 --- a/db/migrate/20151019111703_fail_build_without_names.rb +++ /dev/null @@ -1,8 +0,0 @@ -class FailBuildWithoutNames < ActiveRecord::Migration[4.2] - def up - execute("UPDATE ci_builds SET status='failed' WHERE name IS NULL AND status='pending'") - end - - def down - end -end diff --git a/db/migrate/20151020145526_add_services_template_index.rb b/db/migrate/20151020145526_add_services_template_index.rb deleted file mode 100644 index 24c373855e2..00000000000 --- a/db/migrate/20151020145526_add_services_template_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddServicesTemplateIndex < ActiveRecord::Migration[4.2] - def change - add_index :services, :template - end -end diff --git a/db/migrate/20151020173516_ci_limits_to_mysql.rb b/db/migrate/20151020173516_ci_limits_to_mysql.rb deleted file mode 100644 index 573922b851b..00000000000 --- a/db/migrate/20151020173516_ci_limits_to_mysql.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CiLimitsToMysql < ActiveRecord::Migration[4.2] - def change - return unless ActiveRecord::Base.configurations[Rails.env]['adapter'] =~ /^mysql/ - - # CI - change_column :ci_builds, :trace, :text, limit: 1073741823 - change_column :ci_commits, :push_data, :text, limit: 16777215 - end -end diff --git a/db/migrate/20151020173906_add_ci_builds_index_for_status.rb b/db/migrate/20151020173906_add_ci_builds_index_for_status.rb deleted file mode 100644 index 231fc4f2a17..00000000000 --- a/db/migrate/20151020173906_add_ci_builds_index_for_status.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddCiBuildsIndexForStatus < ActiveRecord::Migration[4.2] - def change - add_index :ci_builds, [:commit_id, :status, :type] - end -end diff --git a/db/migrate/20151023112551_fail_build_with_empty_name.rb b/db/migrate/20151023112551_fail_build_with_empty_name.rb deleted file mode 100644 index 28f531463bc..00000000000 --- a/db/migrate/20151023112551_fail_build_with_empty_name.rb +++ /dev/null @@ -1,8 +0,0 @@ -class FailBuildWithEmptyName < ActiveRecord::Migration[4.2] - def up - execute("UPDATE ci_builds SET status='failed' WHERE (name IS NULL OR name='') AND status='pending'") - end - - def down - end -end diff --git a/db/migrate/20151023144219_remove_satellites.rb b/db/migrate/20151023144219_remove_satellites.rb deleted file mode 100644 index 2d1310b0208..00000000000 --- a/db/migrate/20151023144219_remove_satellites.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'fileutils' - -class RemoveSatellites < ActiveRecord::Migration[4.2] - def up - satellites = Gitlab.config['satellites'] - return if satellites.nil? - - satellites_path = satellites['path'] - return if satellites_path.nil? - - FileUtils.rm_rf(satellites_path) - end - - def down - # Do nothing - end -end diff --git a/db/migrate/20151026182941_add_project_path_index.rb b/db/migrate/20151026182941_add_project_path_index.rb deleted file mode 100644 index bf0444450cd..00000000000 --- a/db/migrate/20151026182941_add_project_path_index.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddProjectPathIndex < ActiveRecord::Migration[4.2] - def up - add_index :projects, :path - end - - def down - remove_index :projects, :path - end -end diff --git a/db/migrate/20151028152939_add_merge_when_build_succeeds_to_merge_request.rb b/db/migrate/20151028152939_add_merge_when_build_succeeds_to_merge_request.rb deleted file mode 100644 index 5b11a430e30..00000000000 --- a/db/migrate/20151028152939_add_merge_when_build_succeeds_to_merge_request.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable all -class AddMergeWhenBuildSucceedsToMergeRequest < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :merge_params, :text - add_column :merge_requests, :merge_when_build_succeeds, :boolean, default: false, null: false - add_column :merge_requests, :merge_user_id, :integer - end -end diff --git a/db/migrate/20151103001141_add_public_to_group.rb b/db/migrate/20151103001141_add_public_to_group.rb deleted file mode 100644 index a5590bc1adc..00000000000 --- a/db/migrate/20151103001141_add_public_to_group.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPublicToGroup < ActiveRecord::Migration[4.2] - def change - add_column :namespaces, :public, :boolean, default: false - end -end diff --git a/db/migrate/20151103133339_add_shared_runners_setting.rb b/db/migrate/20151103133339_add_shared_runners_setting.rb deleted file mode 100644 index 6fc845d1396..00000000000 --- a/db/migrate/20151103133339_add_shared_runners_setting.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddSharedRunnersSetting < ActiveRecord::Migration[4.2] - def up - add_column :application_settings, :shared_runners_enabled, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20151103134857_create_lfs_objects.rb b/db/migrate/20151103134857_create_lfs_objects.rb deleted file mode 100644 index 2ba77e431a1..00000000000 --- a/db/migrate/20151103134857_create_lfs_objects.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable all -class CreateLfsObjects < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :lfs_objects do |t| - t.string :oid, null: false, unique: true - t.integer :size, null: false - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20151103134958_create_lfs_objects_projects.rb b/db/migrate/20151103134958_create_lfs_objects_projects.rb deleted file mode 100644 index 6f8488463b0..00000000000 --- a/db/migrate/20151103134958_create_lfs_objects_projects.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable all -class CreateLfsObjectsProjects < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :lfs_objects_projects do |t| - t.integer :lfs_object_id, null: false - t.integer :project_id, null: false - - t.timestamps null: true - end - - add_index :lfs_objects_projects, :project_id - end -end diff --git a/db/migrate/20151104105513_add_file_to_lfs_objects.rb b/db/migrate/20151104105513_add_file_to_lfs_objects.rb deleted file mode 100644 index 050b1e07503..00000000000 --- a/db/migrate/20151104105513_add_file_to_lfs_objects.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddFileToLfsObjects < ActiveRecord::Migration[4.2] - def change - add_column :lfs_objects, :file, :string - end -end diff --git a/db/migrate/20151105094515_create_releases.rb b/db/migrate/20151105094515_create_releases.rb deleted file mode 100644 index 4b180a59486..00000000000 --- a/db/migrate/20151105094515_create_releases.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class CreateReleases < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :releases do |t| - t.string :tag - t.text :description - t.integer :project_id - - t.timestamps null: true - end - - add_index :releases, :project_id - add_index :releases, [:project_id, :tag] - end -end diff --git a/db/migrate/20151106000015_add_is_award_to_notes.rb b/db/migrate/20151106000015_add_is_award_to_notes.rb deleted file mode 100644 index 1d866fb3213..00000000000 --- a/db/migrate/20151106000015_add_is_award_to_notes.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddIsAwardToNotes < ActiveRecord::Migration[4.2] - def change - add_column :notes, :is_award, :boolean, default: false, null: false - add_index :notes, :is_award - end -end diff --git a/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb b/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb deleted file mode 100644 index 9c14cfd4656..00000000000 --- a/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMaxArtifactsSizeToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :max_artifacts_size, :integer, default: 100, null: false - end -end diff --git a/db/migrate/20151109134526_add_issues_state_index.rb b/db/migrate/20151109134526_add_issues_state_index.rb deleted file mode 100644 index c77ca90a0d6..00000000000 --- a/db/migrate/20151109134526_add_issues_state_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddIssuesStateIndex < ActiveRecord::Migration[4.2] - def change - add_index :issues, :state - end -end diff --git a/db/migrate/20151109134916_add_projects_visibility_level_index.rb b/db/migrate/20151109134916_add_projects_visibility_level_index.rb deleted file mode 100644 index 1e945f0e56f..00000000000 --- a/db/migrate/20151109134916_add_projects_visibility_level_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddProjectsVisibilityLevelIndex < ActiveRecord::Migration[4.2] - def change - add_index :projects, :visibility_level - end -end diff --git a/db/migrate/20151110125604_add_import_error_to_project.rb b/db/migrate/20151110125604_add_import_error_to_project.rb deleted file mode 100644 index 48a15ad0737..00000000000 --- a/db/migrate/20151110125604_add_import_error_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImportErrorToProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :import_error, :text - end -end diff --git a/db/migrate/20151114113410_add_index_for_lfs_oid_and_size.rb b/db/migrate/20151114113410_add_index_for_lfs_oid_and_size.rb deleted file mode 100644 index f2788117cc2..00000000000 --- a/db/migrate/20151114113410_add_index_for_lfs_oid_and_size.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddIndexForLfsOidAndSize < ActiveRecord::Migration[4.2] - def change - add_index :lfs_objects, :oid - add_index :lfs_objects, [:oid, :size] - end -end diff --git a/db/migrate/20151116144118_add_unique_for_lfs_oid_index.rb b/db/migrate/20151116144118_add_unique_for_lfs_oid_index.rb deleted file mode 100644 index 3bfbae67119..00000000000 --- a/db/migrate/20151116144118_add_unique_for_lfs_oid_index.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable all -class AddUniqueForLfsOidIndex < ActiveRecord::Migration[4.2] - def change - remove_index :lfs_objects, :oid - remove_index :lfs_objects, [:oid, :size] - add_index :lfs_objects, :oid, unique: true - end -end diff --git a/db/migrate/20151118162244_add_projects_public_index.rb b/db/migrate/20151118162244_add_projects_public_index.rb deleted file mode 100644 index 3a525c69ad0..00000000000 --- a/db/migrate/20151118162244_add_projects_public_index.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddProjectsPublicIndex < ActiveRecord::Migration[4.2] - def change - add_index :namespaces, :public - end -end diff --git a/db/migrate/20151201203948_raise_hook_url_limit.rb b/db/migrate/20151201203948_raise_hook_url_limit.rb deleted file mode 100644 index c1a4974b8c9..00000000000 --- a/db/migrate/20151201203948_raise_hook_url_limit.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RaiseHookUrlLimit < ActiveRecord::Migration[4.2] - def change - change_column :web_hooks, :url, :string, limit: 2000 - end -end diff --git a/db/migrate/20151203162133_add_hide_project_limit_to_users.rb b/db/migrate/20151203162133_add_hide_project_limit_to_users.rb deleted file mode 100644 index 1b96a0dc550..00000000000 --- a/db/migrate/20151203162133_add_hide_project_limit_to_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddHideProjectLimitToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :hide_project_limit, :boolean, default: false - end -end diff --git a/db/migrate/20151203162134_add_build_events_to_services.rb b/db/migrate/20151203162134_add_build_events_to_services.rb deleted file mode 100644 index c49604f8b61..00000000000 --- a/db/migrate/20151203162134_add_build_events_to_services.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddBuildEventsToServices < ActiveRecord::Migration[4.2] - def change - add_column :services, :build_events, :boolean, default: false, null: false - add_column :web_hooks, :build_events, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20151209144329_migrate_ci_web_hooks.rb b/db/migrate/20151209144329_migrate_ci_web_hooks.rb deleted file mode 100644 index 7562735cb1e..00000000000 --- a/db/migrate/20151209144329_migrate_ci_web_hooks.rb +++ /dev/null @@ -1,16 +0,0 @@ -class MigrateCiWebHooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - execute( - 'INSERT INTO web_hooks (url, project_id, type, created_at, updated_at, push_events, issues_events, merge_requests_events, tag_push_events, note_events, build_events) ' \ - "SELECT ci_web_hooks.url, projects.id, 'ProjectHook', ci_web_hooks.created_at, ci_web_hooks.updated_at, " \ - "#{false_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{true_value} FROM ci_web_hooks " \ - 'JOIN ci_projects ON ci_web_hooks.project_id = ci_projects.id ' \ - 'JOIN projects ON ci_projects.gitlab_id = projects.id' - ) - end - - def down - end -end diff --git a/db/migrate/20151209145909_migrate_ci_emails.rb b/db/migrate/20151209145909_migrate_ci_emails.rb deleted file mode 100644 index a1f51c55a55..00000000000 --- a/db/migrate/20151209145909_migrate_ci_emails.rb +++ /dev/null @@ -1,45 +0,0 @@ -class MigrateCiEmails < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - # This inserts a new service: BuildsEmailService - # It "manually" constructs the properties (JSON-encoded) - # Migrating all ci_projects e-mail related columns - execute( - 'INSERT INTO services (project_id, type, created_at, updated_at, active, push_events, issues_events, merge_requests_events, tag_push_events, note_events, build_events, properties) ' \ - "SELECT projects.id, 'BuildsEmailService', ci_services.created_at, ci_services.updated_at, " \ - "#{true_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{true_value}, " \ - "CONCAT('{\"notify_only_broken_builds\":\"', #{convert_bool('ci_projects.email_only_broken_builds')}, " \ - "'\",\"add_pusher\":\"', #{convert_bool('ci_projects.email_add_pusher')}, " \ - "'\",\"recipients\":\"', #{escape_text('ci_projects.email_recipients')}, " \ - "'\"}') " \ - 'FROM ci_services ' \ - 'JOIN ci_projects ON ci_services.project_id = ci_projects.id ' \ - 'JOIN projects ON ci_projects.gitlab_id = projects.id ' \ - "WHERE ci_services.type = 'Ci::MailService' AND ci_services.active" - ) - end - - def down - end - - # This function escapes double-quotes and slash - def escape_text(name) - if Gitlab::Database.postgresql? - "REPLACE(REPLACE(#{name}, '\\', '\\\\'), '\"', '\\\"')" - else - "REPLACE(REPLACE(#{name}, '\\\\', '\\\\\\\\'), '\\\"', '\\\\\\\"')" - end - end - - # This function returns 0 or 1 for column - def convert_bool(name) - if Gitlab::Database.postgresql? - # PostgreSQL uses BOOLEAN type - "CASE WHEN #{name} IS TRUE THEN '1' ELSE '0' END" - else - # MySQL uses TINYINT - "#{name}" - end - end -end diff --git a/db/migrate/20151210030143_add_unlock_token_to_user.rb b/db/migrate/20151210030143_add_unlock_token_to_user.rb deleted file mode 100644 index 28b736adfb5..00000000000 --- a/db/migrate/20151210030143_add_unlock_token_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddUnlockTokenToUser < ActiveRecord::Migration[4.2] - def change - add_column :users, :unlock_token, :string - end -end diff --git a/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb b/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb deleted file mode 100644 index 5da33149b59..00000000000 --- a/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRunnersRegistrationTokenToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :runners_registration_token, :string - end -end diff --git a/db/migrate/20151210125232_migrate_ci_slack_service.rb b/db/migrate/20151210125232_migrate_ci_slack_service.rb deleted file mode 100644 index 72c90f92377..00000000000 --- a/db/migrate/20151210125232_migrate_ci_slack_service.rb +++ /dev/null @@ -1,33 +0,0 @@ -class MigrateCiSlackService < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - properties_query = 'SELECT properties FROM ci_services ' \ - 'JOIN ci_projects ON ci_services.project_id=ci_projects.id ' \ - "WHERE ci_projects.gitlab_id=services.project_id AND ci_services.type='Ci::SlackService' AND ci_services.active " \ - 'LIMIT 1' - - active_query = 'SELECT 1 FROM ci_services ' \ - 'JOIN ci_projects ON ci_services.project_id=ci_projects.id ' \ - "WHERE ci_projects.gitlab_id=services.project_id AND ci_services.type='Ci::SlackService' AND ci_services.active " \ - 'LIMIT 1' - - # We update the service since services are always generated for project, even if they are inactive - # Activate service and migrate properties if currently the service is not active - execute( - "UPDATE services SET properties=(#{properties_query}), active=#{true_value}, " \ - "push_events=#{false_value}, issues_events=#{false_value}, merge_requests_events=#{false_value}, " \ - "tag_push_events=#{false_value}, note_events=#{false_value}, build_events=#{true_value} " \ - "WHERE NOT services.active AND services.type='SlackService' AND (#{active_query}) IS NOT NULL" - ) - - # Tick only build_events if the service is already active - execute( - "UPDATE services SET build_events=#{true_value} " \ - "WHERE services.active AND services.type='SlackService' AND (#{active_query}) IS NOT NULL" - ) - end - - def down - end -end diff --git a/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb b/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb deleted file mode 100644 index 5ec0798c38f..00000000000 --- a/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb +++ /dev/null @@ -1,34 +0,0 @@ -class MigrateCiHipChatService < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - # From properties strip `hipchat_` key - properties_query = "SELECT REPLACE(properties, '\"hipchat_', '\"') FROM ci_services " \ - 'JOIN ci_projects ON ci_services.project_id=ci_projects.id ' \ - "WHERE ci_projects.gitlab_id=services.project_id AND ci_services.type='Ci::HipChatService' AND ci_services.active " \ - 'LIMIT 1' - - active_query = 'SELECT 1 FROM ci_services ' \ - 'JOIN ci_projects ON ci_services.project_id=ci_projects.id ' \ - "WHERE ci_projects.gitlab_id=services.project_id AND ci_services.type='Ci::HipChatService' AND ci_services.active " \ - 'LIMIT 1' - - # We update the service since services are always generated for project, even if they are inactive - # Activate service and migrate properties if currently the service is not active - execute( - "UPDATE services SET properties=(#{properties_query}), active=#{true_value}, " \ - "push_events=#{false_value}, issues_events=#{false_value}, merge_requests_events=#{false_value}, " \ - "tag_push_events=#{false_value}, note_events=#{false_value}, build_events=#{true_value} " \ - "WHERE NOT services.active AND services.type='HipchatService' AND (#{active_query}) IS NOT NULL" - ) - - # Tick only build_events if the service is already active - execute( - "UPDATE services SET build_events=#{true_value} " \ - "WHERE services.active AND services.type='HipchatService' AND (#{active_query}) IS NOT NULL" - ) - end - - def down - end -end diff --git a/db/migrate/20151210125928_add_ci_to_project.rb b/db/migrate/20151210125928_add_ci_to_project.rb deleted file mode 100644 index 182f1e17b9a..00000000000 --- a/db/migrate/20151210125928_add_ci_to_project.rb +++ /dev/null @@ -1,12 +0,0 @@ -# rubocop:disable all -class AddCiToProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :ci_id, :integer - add_column :projects, :builds_enabled, :boolean, default: true, null: false - add_column :projects, :shared_runners_enabled, :boolean, default: true, null: false - add_column :projects, :runners_token, :string - add_column :projects, :build_coverage_regex, :string - add_column :projects, :build_allow_git_fetch, :boolean, default: true, null: false - add_column :projects, :build_timeout, :integer, default: 3600, null: false - end -end diff --git a/db/migrate/20151210125929_add_project_id_to_ci.rb b/db/migrate/20151210125929_add_project_id_to_ci.rb deleted file mode 100644 index f5f2c353f4a..00000000000 --- a/db/migrate/20151210125929_add_project_id_to_ci.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddProjectIdToCi < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :gl_project_id, :integer - add_column :ci_runner_projects, :gl_project_id, :integer - add_column :ci_triggers, :gl_project_id, :integer - add_column :ci_variables, :gl_project_id, :integer - end -end diff --git a/db/migrate/20151210125930_migrate_ci_to_project.rb b/db/migrate/20151210125930_migrate_ci_to_project.rb deleted file mode 100644 index f7573ad1a8d..00000000000 --- a/db/migrate/20151210125930_migrate_ci_to_project.rb +++ /dev/null @@ -1,42 +0,0 @@ -class MigrateCiToProject < ActiveRecord::Migration[4.2] - def up - migrate_project_id_for_table('ci_runner_projects') - migrate_project_id_for_table('ci_triggers') - migrate_project_id_for_table('ci_variables') - migrate_project_id_for_builds - - migrate_project_column('id', 'ci_id') - migrate_project_column('shared_runners_enabled', 'shared_runners_enabled') - migrate_project_column('token', 'runners_token') - migrate_project_column('coverage_regex', 'build_coverage_regex') - migrate_project_column('allow_git_fetch', 'build_allow_git_fetch') - migrate_project_column('timeout', 'build_timeout') - migrate_ci_service - end - - def down - # We can't reverse the data - end - - def migrate_project_id_for_table(table) - subquery = "SELECT gitlab_id FROM ci_projects WHERE ci_projects.id = #{table}.project_id" - execute("UPDATE #{table} SET gl_project_id=(#{subquery}) WHERE gl_project_id IS NULL") - end - - def migrate_project_id_for_builds - subquery = 'SELECT gl_project_id FROM ci_commits WHERE ci_commits.id = ci_builds.commit_id' - execute("UPDATE ci_builds SET gl_project_id=(#{subquery}) WHERE gl_project_id IS NULL") - end - - def migrate_project_column(column, new_column = nil) - new_column ||= column - subquery = "SELECT ci_projects.#{column} FROM ci_projects WHERE projects.id = ci_projects.gitlab_id " \ - 'ORDER BY ci_projects.updated_at DESC LIMIT 1' - execute("UPDATE projects SET #{new_column}=(#{subquery}) WHERE (#{subquery}) IS NOT NULL") - end - - def migrate_ci_service - subquery = "SELECT active FROM services WHERE projects.id = services.project_id AND type='GitlabCiService' LIMIT 1" - execute("UPDATE projects SET builds_enabled=(#{subquery}) WHERE (#{subquery}) IS NOT NULL") - end -end diff --git a/db/migrate/20151210125931_add_index_to_ci_tables.rb b/db/migrate/20151210125931_add_index_to_ci_tables.rb deleted file mode 100644 index 2cbc5b50538..00000000000 --- a/db/migrate/20151210125931_add_index_to_ci_tables.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable all -class AddIndexToCiTables < ActiveRecord::Migration[4.2] - def change - add_index :ci_builds, :gl_project_id - add_index :ci_runner_projects, :gl_project_id - add_index :ci_triggers, :gl_project_id - add_index :ci_variables, :gl_project_id - add_index :projects, :runners_token - add_index :projects, :builds_enabled - add_index :projects, [:builds_enabled, :shared_runners_enabled] - add_index :projects, [:ci_id] - end -end diff --git a/db/migrate/20151210125932_drop_null_for_ci_tables.rb b/db/migrate/20151210125932_drop_null_for_ci_tables.rb deleted file mode 100644 index b48fef4b749..00000000000 --- a/db/migrate/20151210125932_drop_null_for_ci_tables.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class DropNullForCiTables < ActiveRecord::Migration[4.2] - def change - remove_index :ci_variables, :project_id - remove_index :ci_runner_projects, :project_id - change_column_null :ci_triggers, :project_id, true - change_column_null :ci_variables, :project_id, true - change_column_null :ci_runner_projects, :project_id, true - end -end diff --git a/db/migrate/20151215132013_add_pages_size_to_application_settings.rb b/db/migrate/20151215132013_add_pages_size_to_application_settings.rb deleted file mode 100644 index 7190d476dc7..00000000000 --- a/db/migrate/20151215132013_add_pages_size_to_application_settings.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AddPagesSizeToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default :application_settings, :max_pages_size, :integer, default: 100, allow_null: false - end - - def down - remove_column(:application_settings, :max_pages_size) - end -end diff --git a/db/migrate/20151218154042_add_tfa_to_application_settings.rb b/db/migrate/20151218154042_add_tfa_to_application_settings.rb deleted file mode 100644 index a981fe2720f..00000000000 --- a/db/migrate/20151218154042_add_tfa_to_application_settings.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddTfaToApplicationSettings < ActiveRecord::Migration[4.2] - def change - change_table :application_settings do |t| - t.boolean :require_two_factor_authentication, default: false - t.integer :two_factor_grace_period, default: 48 - end - end -end diff --git a/db/migrate/20151221234414_add_tfa_additional_fields.rb b/db/migrate/20151221234414_add_tfa_additional_fields.rb deleted file mode 100644 index fed734f77f4..00000000000 --- a/db/migrate/20151221234414_add_tfa_additional_fields.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddTfaAdditionalFields < ActiveRecord::Migration[4.2] - def change - change_table :users do |t| - t.datetime :otp_grace_period_started_at, null: true - end - end -end diff --git a/db/migrate/20151224123230_rename_emojis.rb b/db/migrate/20151224123230_rename_emojis.rb deleted file mode 100644 index f1e4b1fe181..00000000000 --- a/db/migrate/20151224123230_rename_emojis.rb +++ /dev/null @@ -1,15 +0,0 @@ -# Migration type: online without errors (works on previous version and new one) -class RenameEmojis < ActiveRecord::Migration[4.2] - def up - # Renames aliases to main names - execute("UPDATE notes SET note ='thumbsup' WHERE is_award = true AND note = '+1'") - execute("UPDATE notes SET note ='thumbsdown' WHERE is_award = true AND note = '-1'") - execute("UPDATE notes SET note ='poop' WHERE is_award = true AND note = 'shit'") - end - - def down - execute("UPDATE notes SET note ='+1' WHERE is_award = true AND note = 'thumbsup'") - execute("UPDATE notes SET note ='-1' WHERE is_award = true AND note = 'thumbsdown'") - execute("UPDATE notes SET note ='shit' WHERE is_award = true AND note = 'poop'") - end -end diff --git a/db/migrate/20151228111122_remove_public_from_namespace.rb b/db/migrate/20151228111122_remove_public_from_namespace.rb deleted file mode 100644 index ad922e3fc58..00000000000 --- a/db/migrate/20151228111122_remove_public_from_namespace.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -# Migration type: online -class RemovePublicFromNamespace < ActiveRecord::Migration[4.2] - def change - remove_column :namespaces, :public, :boolean - end -end diff --git a/db/migrate/20151228150906_influxdb_settings.rb b/db/migrate/20151228150906_influxdb_settings.rb deleted file mode 100644 index 8266e3c5044..00000000000 --- a/db/migrate/20151228150906_influxdb_settings.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable all -class InfluxdbSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :metrics_enabled, :boolean, default: false - - add_column :application_settings, :metrics_host, :string, - default: 'localhost' - - add_column :application_settings, :metrics_database, :string, - default: 'gitlab' - - add_column :application_settings, :metrics_username, :string - add_column :application_settings, :metrics_password, :string - add_column :application_settings, :metrics_pool_size, :integer, default: 16 - add_column :application_settings, :metrics_timeout, :integer, default: 10 - add_column :application_settings, :metrics_method_call_threshold, - :integer, default: 10 - end -end diff --git a/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb b/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb deleted file mode 100644 index 523f2cae092..00000000000 --- a/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRecaptchaToApplicationSettings < ActiveRecord::Migration[4.2] - def change - change_table :application_settings do |t| - t.boolean :recaptcha_enabled, default: false - t.string :recaptcha_site_key - t.string :recaptcha_private_key - end - end -end diff --git a/db/migrate/20151229102248_influxdb_udp_port_setting.rb b/db/migrate/20151229102248_influxdb_udp_port_setting.rb deleted file mode 100644 index da37e3bc148..00000000000 --- a/db/migrate/20151229102248_influxdb_udp_port_setting.rb +++ /dev/null @@ -1,5 +0,0 @@ -class InfluxdbUdpPortSetting < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :metrics_port, :integer, default: 8089 - end -end diff --git a/db/migrate/20151229112614_influxdb_remote_database_setting.rb b/db/migrate/20151229112614_influxdb_remote_database_setting.rb deleted file mode 100644 index 5fdf4c6d4cb..00000000000 --- a/db/migrate/20151229112614_influxdb_remote_database_setting.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class InfluxdbRemoteDatabaseSetting < ActiveRecord::Migration[4.2] - def change - remove_column :application_settings, :metrics_database - end -end diff --git a/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb b/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb deleted file mode 100644 index 61a3d6486f3..00000000000 --- a/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddArtifactsMetadataToCiBuild < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :artifacts_metadata, :text - end -end diff --git a/db/migrate/20151231152326_add_akismet_to_application_settings.rb b/db/migrate/20151231152326_add_akismet_to_application_settings.rb deleted file mode 100644 index ef51ea03a5b..00000000000 --- a/db/migrate/20151231152326_add_akismet_to_application_settings.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddAkismetToApplicationSettings < ActiveRecord::Migration[4.2] - def change - change_table :application_settings do |t| - t.boolean :akismet_enabled, default: false - t.string :akismet_api_key - end - end -end diff --git a/db/migrate/20151231202530_remove_alert_type_from_broadcast_messages.rb b/db/migrate/20151231202530_remove_alert_type_from_broadcast_messages.rb deleted file mode 100644 index 2d8b44840f0..00000000000 --- a/db/migrate/20151231202530_remove_alert_type_from_broadcast_messages.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class RemoveAlertTypeFromBroadcastMessages < ActiveRecord::Migration[4.2] - def change - remove_column :broadcast_messages, :alert_type, :integer - end -end diff --git a/db/migrate/20160106162223_add_index_milestones_title.rb b/db/migrate/20160106162223_add_index_milestones_title.rb deleted file mode 100644 index d42bddefe64..00000000000 --- a/db/migrate/20160106162223_add_index_milestones_title.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddIndexMilestonesTitle < ActiveRecord::Migration[4.2] - def change - add_index :milestones, :title - end -end diff --git a/db/migrate/20160106164438_remove_influxdb_credentials.rb b/db/migrate/20160106164438_remove_influxdb_credentials.rb deleted file mode 100644 index 569d5a0cf36..00000000000 --- a/db/migrate/20160106164438_remove_influxdb_credentials.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class RemoveInfluxdbCredentials < ActiveRecord::Migration[4.2] - def change - remove_column :application_settings, :metrics_username, :string - remove_column :application_settings, :metrics_password, :string - end -end diff --git a/db/migrate/20160109054846_create_spam_logs.rb b/db/migrate/20160109054846_create_spam_logs.rb deleted file mode 100644 index dc97d03f7ff..00000000000 --- a/db/migrate/20160109054846_create_spam_logs.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class CreateSpamLogs < ActiveRecord::Migration[4.2] - def change - create_table :spam_logs do |t| - t.integer :user_id - t.string :source_ip - t.string :user_agent - t.boolean :via_api - t.integer :project_id - t.string :noteable_type - t.string :title - t.text :description - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160113111034_add_metrics_sample_interval.rb b/db/migrate/20160113111034_add_metrics_sample_interval.rb deleted file mode 100644 index 9c3377571aa..00000000000 --- a/db/migrate/20160113111034_add_metrics_sample_interval.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddMetricsSampleInterval < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :metrics_sample_interval, :integer, - default: 15 - end -end diff --git a/db/migrate/20160118155830_add_sentry_to_application_settings.rb b/db/migrate/20160118155830_add_sentry_to_application_settings.rb deleted file mode 100644 index 20f3925b964..00000000000 --- a/db/migrate/20160118155830_add_sentry_to_application_settings.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddSentryToApplicationSettings < ActiveRecord::Migration[4.2] - def change - change_table :application_settings do |t| - t.boolean :sentry_enabled, default: false - t.string :sentry_dsn - end - end -end diff --git a/db/migrate/20160118232755_add_ip_blocking_settings_to_application_settings.rb b/db/migrate/20160118232755_add_ip_blocking_settings_to_application_settings.rb deleted file mode 100644 index 809a6cceef5..00000000000 --- a/db/migrate/20160118232755_add_ip_blocking_settings_to_application_settings.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddIpBlockingSettingsToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :ip_blocking_enabled, :boolean, default: false - add_column :application_settings, :dnsbl_servers_list, :text - end -end diff --git a/db/migrate/20160119111158_add_services_category.rb b/db/migrate/20160119111158_add_services_category.rb deleted file mode 100644 index 979a48584a9..00000000000 --- a/db/migrate/20160119111158_add_services_category.rb +++ /dev/null @@ -1,40 +0,0 @@ -# rubocop:disable all -class AddServicesCategory < ActiveRecord::Migration[4.2] - def up - add_column :services, :category, :string, default: 'common', null: false - - category = quote_column_name('category') - type = quote_column_name('type') - - execute <<-EOF -UPDATE services -SET #{category} = 'issue_tracker' -WHERE #{type} IN ( - 'CustomIssueTrackerService', - 'GitlabIssueTrackerService', - 'IssueTrackerService', - 'JiraService', - 'RedmineService' -); -EOF - - execute <<-EOF -UPDATE services -SET #{category} = 'ci' -WHERE #{type} IN ( - 'BambooService', - 'BuildkiteService', - 'CiService', - 'DroneCiService', - 'GitlabCiService', - 'TeamcityService' -); - EOF - - add_index :services, :category - end - - def down - remove_column :services, :category - end -end diff --git a/db/migrate/20160119112418_add_services_default.rb b/db/migrate/20160119112418_add_services_default.rb deleted file mode 100644 index 41ba5d98afe..00000000000 --- a/db/migrate/20160119112418_add_services_default.rb +++ /dev/null @@ -1,21 +0,0 @@ -# rubocop:disable all -class AddServicesDefault < ActiveRecord::Migration[4.2] - def up - add_column :services, :default, :boolean, default: false - - default = quote_column_name('default') - type = quote_column_name('type') - - execute <<-EOF -UPDATE services -SET #{default} = true -WHERE #{type} = 'GitlabIssueTrackerService' -EOF - - add_index :services, :default - end - - def down - remove_column :services, :default - end -end diff --git a/db/migrate/20160119145451_add_ldap_email_to_users.rb b/db/migrate/20160119145451_add_ldap_email_to_users.rb deleted file mode 100644 index bf8c27900b8..00000000000 --- a/db/migrate/20160119145451_add_ldap_email_to_users.rb +++ /dev/null @@ -1,31 +0,0 @@ -# rubocop:disable all -class AddLdapEmailToUsers < ActiveRecord::Migration[4.2] - def up - add_column :users, :ldap_email, :boolean, default: false, null: false - - if Gitlab::Database.mysql? - execute %{ - UPDATE users, identities - SET users.ldap_email = TRUE - WHERE identities.user_id = users.id - AND users.email LIKE 'temp-email-for-oauth%' - AND identities.provider LIKE 'ldap%' - AND identities.extern_uid IS NOT NULL - } - else - execute %{ - UPDATE users - SET ldap_email = TRUE - FROM identities - WHERE identities.user_id = users.id - AND users.email LIKE 'temp-email-for-oauth%' - AND identities.provider LIKE 'ldap%' - AND identities.extern_uid IS NOT NULL - } - end - end - - def down - remove_column :users, :ldap_email - end -end diff --git a/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb b/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb deleted file mode 100644 index 9c0a91758f5..00000000000 --- a/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddBaseCommitShaToMergeRequestDiffs < ActiveRecord::Migration[4.2] - def change - add_column :merge_request_diffs, :base_commit_sha, :string - end -end diff --git a/db/migrate/20160121030729_add_email_author_in_body_to_application_settings.rb b/db/migrate/20160121030729_add_email_author_in_body_to_application_settings.rb deleted file mode 100644 index 0cb1fbe8641..00000000000 --- a/db/migrate/20160121030729_add_email_author_in_body_to_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddEmailAuthorInBodyToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :email_author_in_body, :boolean, default: false - end -end diff --git a/db/migrate/20160122185421_add_pending_delete_to_project.rb b/db/migrate/20160122185421_add_pending_delete_to_project.rb deleted file mode 100644 index 8db0adc9221..00000000000 --- a/db/migrate/20160122185421_add_pending_delete_to_project.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddPendingDeleteToProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :pending_delete, :boolean, default: false - end -end diff --git a/db/migrate/20160128212447_remove_ip_blocking_settings_from_application_settings.rb b/db/migrate/20160128212447_remove_ip_blocking_settings_from_application_settings.rb deleted file mode 100644 index e76f0249ae5..00000000000 --- a/db/migrate/20160128212447_remove_ip_blocking_settings_from_application_settings.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class RemoveIpBlockingSettingsFromApplicationSettings < ActiveRecord::Migration[4.2] - def change - remove_column :application_settings, :ip_blocking_enabled, :boolean, default: false - remove_column :application_settings, :dnsbl_servers_list, :text - end -end diff --git a/db/migrate/20160128233227_change_lfs_objects_size_column.rb b/db/migrate/20160128233227_change_lfs_objects_size_column.rb deleted file mode 100644 index 65aaf2d9a0b..00000000000 --- a/db/migrate/20160128233227_change_lfs_objects_size_column.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ChangeLfsObjectsSizeColumn < ActiveRecord::Migration[4.2] - def change - change_column :lfs_objects, :size, :integer, limit: 8 - end -end diff --git a/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb b/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb deleted file mode 100644 index 6254017615b..00000000000 --- a/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb +++ /dev/null @@ -1,80 +0,0 @@ -class RemoveDotAtomPathEndingOfProjects < ActiveRecord::Migration[4.2] - include Gitlab::ShellAdapter - - class ProjectPath - attr_reader :old_path, :id, :namespace_path - - def initialize(old_path, id, namespace_path, namespace_id) - @old_path = old_path - @id = id - @namespace_path = namespace_path - @namespace_id = namespace_id - end - - def clean_path - @_clean_path ||= PathCleaner.clean(@old_path, @namespace_id) - end - end - - class PathCleaner - def initialize(path, namespace_id) - @namespace_id = namespace_id - @path = path - end - - def self.clean(*args) - new(*args).clean - end - - def clean - path = cleaned_path - count = 0 - while path_exists?(path) - path = "#{cleaned_path}#{count}" - count += 1 - end - path - end - - private - - def cleaned_path - @_cleaned_path ||= @path.gsub(/\.atom\z/, '-atom') - end - - def path_exists?(path) - Project.find_by_path_and_namespace_id(path, @namespace_id) - end - end - - def projects_with_dot_atom - select_all("SELECT p.id, p.path, n.path as namespace_path, n.id as namespace_id FROM projects p inner join namespaces n on n.id = p.namespace_id WHERE p.path LIKE '%.atom'") - end - - def up - projects_with_dot_atom.each do |project| - project_path = ProjectPath.new(project['path'], project['id'], project['namespace_path'], project['namespace_id']) - clean_path(project_path) if rename_project_repo(project_path) - end - end - - private - - def clean_path(project_path) - execute "UPDATE projects SET path = #{sanitize(project_path.clean_path)} WHERE id = #{project_path.id}" - end - - def rename_project_repo(project_path) - old_path_with_namespace = File.join(project_path.namespace_path, project_path.old_path) - new_path_with_namespace = File.join(project_path.namespace_path, project_path.clean_path) - - gitlab_shell.mv_repository("#{old_path_with_namespace}.wiki", "#{new_path_with_namespace}.wiki") - gitlab_shell.mv_repository(old_path_with_namespace, new_path_with_namespace) - rescue - false - end - - def sanitize(value) - ActiveRecord::Base.connection.quote(value) - end -end diff --git a/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb b/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb deleted file mode 100644 index 8b84705ce7d..00000000000 --- a/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMergeCommitShaToMergeRequests < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :merge_commit_sha, :string - end -end diff --git a/db/migrate/20160202091601_add_erasable_to_ci_build.rb b/db/migrate/20160202091601_add_erasable_to_ci_build.rb deleted file mode 100644 index 214028bd8d3..00000000000 --- a/db/migrate/20160202091601_add_erasable_to_ci_build.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddErasableToCiBuild < ActiveRecord::Migration[4.2] - def change - add_reference :ci_builds, :erased_by, references: :users, index: true - add_column :ci_builds, :erased_at, :datetime - end -end diff --git a/db/migrate/20160202164642_add_allow_guest_to_access_builds_project.rb b/db/migrate/20160202164642_add_allow_guest_to_access_builds_project.rb deleted file mode 100644 index 542f9437911..00000000000 --- a/db/migrate/20160202164642_add_allow_guest_to_access_builds_project.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddAllowGuestToAccessBuildsProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :public_builds, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb b/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb deleted file mode 100644 index c1f1faf0279..00000000000 --- a/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRealSizeToMergeRequestDiffs < ActiveRecord::Migration[4.2] - def change - add_column :merge_request_diffs, :real_size, :string - end -end diff --git a/db/migrate/20160209130428_add_index_to_snippet.rb b/db/migrate/20160209130428_add_index_to_snippet.rb deleted file mode 100644 index 480ac193d63..00000000000 --- a/db/migrate/20160209130428_add_index_to_snippet.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddIndexToSnippet < ActiveRecord::Migration[4.2] - def change - add_index :snippets, :updated_at - end -end diff --git a/db/migrate/20160210105555_create_pages_domain.rb b/db/migrate/20160210105555_create_pages_domain.rb deleted file mode 100644 index a46906d64ca..00000000000 --- a/db/migrate/20160210105555_create_pages_domain.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreatePagesDomain < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :pages_domains do |t| - t.integer :project_id - t.text :certificate - t.text :encrypted_key - t.string :encrypted_key_iv - t.string :encrypted_key_salt - t.string :domain - end - - add_index :pages_domains, :domain, unique: true - end -end diff --git a/db/migrate/20160212123307_create_tasks.rb b/db/migrate/20160212123307_create_tasks.rb deleted file mode 100644 index 33acc8af91f..00000000000 --- a/db/migrate/20160212123307_create_tasks.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class CreateTasks < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :tasks do |t| - t.references :user, null: false, index: true - t.references :project, null: false, index: true - t.references :target, polymorphic: true, null: false, index: true - t.integer :author_id, index: true - t.integer :action, null: false - t.string :state, null: false, index: true - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20160217100506_add_description_to_label.rb b/db/migrate/20160217100506_add_description_to_label.rb deleted file mode 100644 index 116de8ddfa9..00000000000 --- a/db/migrate/20160217100506_add_description_to_label.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDescriptionToLabel < ActiveRecord::Migration[4.2] - def change - add_column :labels, :description, :string - end -end diff --git a/db/migrate/20160217174422_add_note_to_tasks.rb b/db/migrate/20160217174422_add_note_to_tasks.rb deleted file mode 100644 index c2a42ce5dd8..00000000000 --- a/db/migrate/20160217174422_add_note_to_tasks.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNoteToTasks < ActiveRecord::Migration[4.2] - def change - add_reference :tasks, :note, index: true - end -end diff --git a/db/migrate/20160220123949_rename_tasks_to_todos.rb b/db/migrate/20160220123949_rename_tasks_to_todos.rb deleted file mode 100644 index 0cc110a0a1a..00000000000 --- a/db/migrate/20160220123949_rename_tasks_to_todos.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RenameTasksToTodos < ActiveRecord::Migration[4.2] - def change - rename_table :tasks, :todos - end -end diff --git a/db/migrate/20160222153918_create_appearances_ce.rb b/db/migrate/20160222153918_create_appearances_ce.rb deleted file mode 100644 index 37bbe62ad3d..00000000000 --- a/db/migrate/20160222153918_create_appearances_ce.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable all -class CreateAppearancesCe < ActiveRecord::Migration[4.2] - def change - unless table_exists?(:appearances) - create_table :appearances do |t| - t.string :title - t.text :description - t.string :header_logo - t.string :logo - - t.timestamps null: false - end - end - end -end diff --git a/db/migrate/20160223192159_add_confidential_to_issues.rb b/db/migrate/20160223192159_add_confidential_to_issues.rb deleted file mode 100644 index ca029f12337..00000000000 --- a/db/migrate/20160223192159_add_confidential_to_issues.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddConfidentialToIssues < ActiveRecord::Migration[4.2] - def change - add_column :issues, :confidential, :boolean, default: false - add_index :issues, :confidential - end -end diff --git a/db/migrate/20160225090018_add_delete_at_to_issues.rb b/db/migrate/20160225090018_add_delete_at_to_issues.rb deleted file mode 100644 index 3ae74f491f6..00000000000 --- a/db/migrate/20160225090018_add_delete_at_to_issues.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddDeleteAtToIssues < ActiveRecord::Migration[4.2] - def change - add_column :issues, :deleted_at, :datetime - add_index :issues, :deleted_at - end -end diff --git a/db/migrate/20160225101956_add_delete_at_to_merge_requests.rb b/db/migrate/20160225101956_add_delete_at_to_merge_requests.rb deleted file mode 100644 index ce8657ba88c..00000000000 --- a/db/migrate/20160225101956_add_delete_at_to_merge_requests.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddDeleteAtToMergeRequests < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :deleted_at, :datetime - add_index :merge_requests, :deleted_at - end -end diff --git a/db/migrate/20160226114608_add_trigram_indexes_for_searching.rb b/db/migrate/20160226114608_add_trigram_indexes_for_searching.rb deleted file mode 100644 index af8b08c095a..00000000000 --- a/db/migrate/20160226114608_add_trigram_indexes_for_searching.rb +++ /dev/null @@ -1,65 +0,0 @@ -# rubocop:disable all -class AddTrigramIndexesForSearching < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - create_trigrams_extension - - unless trigrams_enabled? - raise 'You must enable the pg_trgm extension. You can do so by running ' \ - '"CREATE EXTENSION pg_trgm;" as a PostgreSQL super user, this must be ' \ - 'done for every GitLab database. For more information see ' \ - 'http://www.postgresql.org/docs/current/static/sql-createextension.html' - end - - # trigram indexes are case-insensitive so we can just index the column - # instead of indexing lower(column) - to_index.each do |table, columns| - columns.each do |column| - execute "CREATE INDEX CONCURRENTLY index_#{table}_on_#{column}_trigram ON #{table} USING gin(#{column} gin_trgm_ops);" - end - end - end - - def down - return unless Gitlab::Database.postgresql? - - to_index.each do |table, columns| - columns.each do |column| - remove_index table, name: "index_#{table}_on_#{column}_trigram" - end - end - end - - def trigrams_enabled? - res = execute("SELECT true AS enabled FROM pg_available_extensions WHERE name = 'pg_trgm' AND installed_version IS NOT NULL;") - row = res.first - - row && row['enabled'] == true - end - - def create_trigrams_extension - # This may not work if the user doesn't have permission. We attempt in - # case we do have permission, particularly for test/dev environments. - begin - enable_extension 'pg_trgm' - rescue - end - end - - def to_index - { - ci_runners: [:token, :description], - issues: [:title, :description], - merge_requests: [:title, :description], - milestones: [:title, :description], - namespaces: [:name, :path], - notes: [:note], - projects: [:name, :path, :description], - snippets: [:title, :file_name], - users: [:username, :name, :email] - } - end -end diff --git a/db/migrate/20160227120001_add_event_field_for_web_hook.rb b/db/migrate/20160227120001_add_event_field_for_web_hook.rb deleted file mode 100644 index 22bbd73114f..00000000000 --- a/db/migrate/20160227120001_add_event_field_for_web_hook.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddEventFieldForWebHook < ActiveRecord::Migration[4.2] - def change - add_column :web_hooks, :wiki_page_events, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20160227120047_add_event_to_services.rb b/db/migrate/20160227120047_add_event_to_services.rb deleted file mode 100644 index a3b94734ec2..00000000000 --- a/db/migrate/20160227120047_add_event_to_services.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddEventToServices < ActiveRecord::Migration[4.2] - def change - add_column :services, :wiki_page_events, :boolean, default: true - end -end diff --git a/db/migrate/20160229193553_add_main_language_to_repository.rb b/db/migrate/20160229193553_add_main_language_to_repository.rb deleted file mode 100644 index 15f9a382802..00000000000 --- a/db/migrate/20160229193553_add_main_language_to_repository.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMainLanguageToRepository < ActiveRecord::Migration[4.2] - def change - add_column :projects, :main_language, :string - end -end diff --git a/db/migrate/20160301124843_add_visibility_level_to_groups.rb b/db/migrate/20160301124843_add_visibility_level_to_groups.rb deleted file mode 100644 index ed4bca4f1ba..00000000000 --- a/db/migrate/20160301124843_add_visibility_level_to_groups.rb +++ /dev/null @@ -1,30 +0,0 @@ -# rubocop:disable all -class AddVisibilityLevelToGroups < ActiveRecord::Migration[4.2] - def up - add_column :namespaces, :visibility_level, :integer, null: false, default: Gitlab::VisibilityLevel::PUBLIC - add_index :namespaces, :visibility_level - - # Unfortunately, this is needed on top of the `default`, since we don't want the configuration specific - # `allowed_visibility_level` to end up in schema.rb - if allowed_visibility_level < Gitlab::VisibilityLevel::PUBLIC - execute("UPDATE namespaces SET visibility_level = #{allowed_visibility_level}") - end - end - - def down - remove_column :namespaces, :visibility_level - end - - private - - def allowed_visibility_level - application_settings = select_one("SELECT restricted_visibility_levels FROM application_settings ORDER BY id DESC LIMIT 1") - if application_settings - restricted_visibility_levels = YAML.safe_load(application_settings["restricted_visibility_levels"]) rescue nil - end - restricted_visibility_levels ||= [] - - allowed_levels = Gitlab::VisibilityLevel.values - restricted_visibility_levels - allowed_levels.max - end -end diff --git a/db/migrate/20160301174731_add_fingerprint_index.rb b/db/migrate/20160301174731_add_fingerprint_index.rb deleted file mode 100644 index b13373a0468..00000000000 --- a/db/migrate/20160301174731_add_fingerprint_index.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class AddFingerprintIndex < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - DOWNTIME = false - - # https://gitlab.com/gitlab-org/gitlab-ee/issues/764 - def change - args = [:keys, :fingerprint] - - if Gitlab::Database.postgresql? - args << { algorithm: :concurrently } - end - - add_index(*args) unless index_exists?(:keys, :fingerprint) - end -end diff --git a/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb b/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb deleted file mode 100644 index b0ea05bd6e1..00000000000 --- a/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddImportCredentialsToProjectImportData < ActiveRecord::Migration[4.2] - def change - add_column :project_import_data, :encrypted_credentials, :text - add_column :project_import_data, :encrypted_credentials_iv, :string - add_column :project_import_data, :encrypted_credentials_salt, :string - end -end diff --git a/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb b/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb deleted file mode 100644 index 8a319554c28..00000000000 --- a/db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb +++ /dev/null @@ -1,138 +0,0 @@ -# rubocop:disable all -# Loops through old importer projects that kept a token/password in the import URL -# and encrypts the credentials into a separate field in project#import_data -# #down method not supported -class RemoveWrongImportUrlFromProjects < ActiveRecord::Migration[4.2] - - class ProjectImportDataFake - extend AttrEncrypted - attr_accessor :credentials - attr_encrypted :credentials, - key: Settings.attr_encrypted_db_key_base, - marshal: true, - encode: true, - :mode => :per_attribute_iv_and_salt, - insecure_mode: true, - algorithm: 'aes-256-cbc' - end - - def up - say("Encrypting and migrating project import credentials...") - - # This should cover GitHub, GitLab, Bitbucket user:password, token@domain, and other similar URLs. - in_transaction(message: "Projects including GitHub and GitLab projects with an unsecured URL.") { process_projects_with_wrong_url } - - in_transaction(message: "Migrating Bitbucket credentials...") { process_project(import_type: 'bitbucket', credentials_keys: ['bb_session']) } - - in_transaction(message: "Migrating FogBugz credentials...") { process_project(import_type: 'fogbugz', credentials_keys: ['fb_session']) } - - end - - def process_projects_with_wrong_url - projects_with_wrong_import_url.each do |project| - begin - import_url = Gitlab::UrlSanitizer.new(project["import_url"]) - - update_import_url(import_url, project) - update_import_data(import_url, project) - rescue Addressable::URI::InvalidURIError - nullify_import_url(project) - end - end - end - - def process_project(import_type:, credentials_keys: []) - unencrypted_import_data(import_type: import_type).each do |data| - replace_data_credentials(data, credentials_keys) - end - end - - def replace_data_credentials(data, credentials_keys) - data_hash = JSON.load(data['data']) if data['data'] - unless data_hash.blank? - encrypted_data_hash = encrypt_data(data_hash, credentials_keys) - unencrypted_data = data_hash.empty? ? ' NULL ' : quote(data_hash.to_json) - update_with_encrypted_data(encrypted_data_hash, data['id'], unencrypted_data) - end - end - - def encrypt_data(data_hash, credentials_keys) - new_data_hash = {} - credentials_keys.each do |key| - new_data_hash[key.to_sym] = data_hash.delete(key) if data_hash[key] - end - new_data_hash.deep_symbolize_keys - end - - def in_transaction(message:) - say_with_time(message) do - ActiveRecord::Base.transaction do - yield - end - end - end - - def update_import_data(import_url, project) - fake_import_data = ProjectImportDataFake.new - fake_import_data.credentials = import_url.credentials - import_data_id = project['import_data_id'] - if import_data_id - execute(update_import_data_sql(import_data_id, fake_import_data)) - else - execute(insert_import_data_sql(project['id'], fake_import_data)) - end - end - - def update_with_encrypted_data(data_hash, import_data_id, unencrypted_data = ' NULL ') - fake_import_data = ProjectImportDataFake.new - fake_import_data.credentials = data_hash - execute(update_import_data_sql(import_data_id, fake_import_data, unencrypted_data)) - end - - def update_import_url(import_url, project) - execute("UPDATE projects SET import_url = #{quote(import_url.sanitized_url)} WHERE id = #{project['id']}") - end - - def nullify_import_url(project) - execute("UPDATE projects SET import_url = NULL WHERE id = #{project['id']}") - end - - def insert_import_data_sql(project_id, fake_import_data) - %( - INSERT INTO project_import_data - (encrypted_credentials, - project_id, - encrypted_credentials_iv, - encrypted_credentials_salt) - VALUES ( #{quote(fake_import_data.encrypted_credentials)}, - '#{project_id}', - #{quote(fake_import_data.encrypted_credentials_iv)}, - #{quote(fake_import_data.encrypted_credentials_salt)}) - ).squish - end - - def update_import_data_sql(id, fake_import_data, data = 'NULL') - %( - UPDATE project_import_data - SET encrypted_credentials = #{quote(fake_import_data.encrypted_credentials)}, - encrypted_credentials_iv = #{quote(fake_import_data.encrypted_credentials_iv)}, - encrypted_credentials_salt = #{quote(fake_import_data.encrypted_credentials_salt)}, - data = #{data} - WHERE id = '#{id}' - ).squish - end - - #GitHub projects with token, and any user:password@ based URL - def projects_with_wrong_import_url - select_all("SELECT p.id, p.import_url, i.id as import_data_id FROM projects p LEFT JOIN project_import_data i on p.id = i.project_id WHERE p.import_url <> '' AND p.import_url LIKE '%//%@%'") - end - - # All imports with data for import_type - def unencrypted_import_data(import_type: ) - select_all("SELECT i.id, p.import_url, i.data FROM projects p INNER JOIN project_import_data i ON p.id = i.project_id WHERE p.import_url <> '' AND p.import_type = '#{import_type}' ") - end - - def quote(value) - ActiveRecord::Base.connection.quote(value) - end -end diff --git a/db/migrate/20160305220806_remove_expires_at_from_snippets.rb b/db/migrate/20160305220806_remove_expires_at_from_snippets.rb deleted file mode 100644 index 6835f534926..00000000000 --- a/db/migrate/20160305220806_remove_expires_at_from_snippets.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class RemoveExpiresAtFromSnippets < ActiveRecord::Migration[4.2] - def change - remove_column :snippets, :expires_at, :datetime - end -end diff --git a/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb b/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb deleted file mode 100644 index 26b65ef7037..00000000000 --- a/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb +++ /dev/null @@ -1,9 +0,0 @@ -class DisallowBlankLineCodeOnNote < ActiveRecord::Migration[4.2] - def up - execute("UPDATE notes SET line_code = NULL WHERE line_code = ''") - end - - def down - # noop - end -end diff --git a/db/migrate/20160308212903_add_default_group_visibility_to_application_settings.rb b/db/migrate/20160308212903_add_default_group_visibility_to_application_settings.rb deleted file mode 100644 index 16053408fe0..00000000000 --- a/db/migrate/20160308212903_add_default_group_visibility_to_application_settings.rb +++ /dev/null @@ -1,32 +0,0 @@ -# rubocop:disable all -# Create visibility level field on DB -# Sets default_visibility_level to value on settings if not restricted -# If value is restricted takes higher visibility level allowed - -class AddDefaultGroupVisibilityToApplicationSettings < ActiveRecord::Migration[4.2] - def up - add_column :application_settings, :default_group_visibility, :integer - # Unfortunately, this can't be a `default`, since we don't want the configuration specific - # `allowed_visibility_level` to end up in schema.rb - - visibility_level = allowed_visibility_level || Gitlab::VisibilityLevel::PRIVATE - execute("UPDATE application_settings SET default_group_visibility = #{visibility_level}") - end - - def down - remove_column :application_settings, :default_group_visibility - end - - private - - def allowed_visibility_level - application_settings = select_one("SELECT restricted_visibility_levels FROM application_settings ORDER BY id DESC LIMIT 1") - if application_settings - restricted_visibility_levels = YAML.safe_load(application_settings["restricted_visibility_levels"]) rescue nil - end - restricted_visibility_levels ||= [] - - allowed_levels = Gitlab::VisibilityLevel.values - restricted_visibility_levels - allowed_levels.max - end -end diff --git a/db/migrate/20160309140734_fix_todos.rb b/db/migrate/20160309140734_fix_todos.rb deleted file mode 100644 index 917055f5036..00000000000 --- a/db/migrate/20160309140734_fix_todos.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class FixTodos < ActiveRecord::Migration[4.2] - def up - execute <<-SQL - DELETE FROM todos - WHERE todos.target_type IN ('Commit', 'ProjectSnippet') - OR NOT EXISTS ( - SELECT * - FROM projects - WHERE projects.id = todos.project_id - ) - SQL - end - - def down - end -end diff --git a/db/migrate/20160310124959_add_due_date_to_issues.rb b/db/migrate/20160310124959_add_due_date_to_issues.rb deleted file mode 100644 index 8da38ea60b1..00000000000 --- a/db/migrate/20160310124959_add_due_date_to_issues.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddDueDateToIssues < ActiveRecord::Migration[4.2] - def change - add_column :issues, :due_date, :date - add_index :issues, :due_date - end -end diff --git a/db/migrate/20160310185910_add_external_flag_to_users.rb b/db/migrate/20160310185910_add_external_flag_to_users.rb deleted file mode 100644 index 768bbe4cd42..00000000000 --- a/db/migrate/20160310185910_add_external_flag_to_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddExternalFlagToUsers < ActiveRecord::Migration[4.2] - def change - add_column :users, :external, :boolean, default: false - end -end diff --git a/db/migrate/20160314094147_add_priority_to_label.rb b/db/migrate/20160314094147_add_priority_to_label.rb deleted file mode 100644 index 8e2aaf50109..00000000000 --- a/db/migrate/20160314094147_add_priority_to_label.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddPriorityToLabel < ActiveRecord::Migration[4.2] - def change - add_column :labels, :priority, :integer - add_index :labels, :priority - end -end diff --git a/db/migrate/20160314114439_add_requested_at_to_members.rb b/db/migrate/20160314114439_add_requested_at_to_members.rb deleted file mode 100644 index e7e03f96ef8..00000000000 --- a/db/migrate/20160314114439_add_requested_at_to_members.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddRequestedAtToMembers < ActiveRecord::Migration[4.2] - def change - add_column :members, :requested_at, :datetime - end -end diff --git a/db/migrate/20160314143402_projects_add_pushes_since_gc.rb b/db/migrate/20160314143402_projects_add_pushes_since_gc.rb deleted file mode 100644 index e64093d39cf..00000000000 --- a/db/migrate/20160314143402_projects_add_pushes_since_gc.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class ProjectsAddPushesSinceGc < ActiveRecord::Migration[4.2] - def change - add_column :projects, :pushes_since_gc, :integer, default: 0 - end -end diff --git a/db/migrate/20160315135439_project_add_repository_check.rb b/db/migrate/20160315135439_project_add_repository_check.rb deleted file mode 100644 index c03d8bb041c..00000000000 --- a/db/migrate/20160315135439_project_add_repository_check.rb +++ /dev/null @@ -1,9 +0,0 @@ -# rubocop:disable all -class ProjectAddRepositoryCheck < ActiveRecord::Migration[4.2] - def change - add_column :projects, :last_repository_check_failed, :boolean - add_index :projects, :last_repository_check_failed - - add_column :projects, :last_repository_check_at, :datetime - end -end diff --git a/db/migrate/20160316123110_ci_runners_token_index.rb b/db/migrate/20160316123110_ci_runners_token_index.rb deleted file mode 100644 index 026846e6464..00000000000 --- a/db/migrate/20160316123110_ci_runners_token_index.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable all -class CiRunnersTokenIndex < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def change - args = [:ci_runners, :token] - - if Gitlab::Database.postgresql? - args << { algorithm: :concurrently } - end - - add_index(*args) - end -end diff --git a/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb b/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb deleted file mode 100644 index 488c3d4945c..00000000000 --- a/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ChangeTargetIdToNullOnTodos < ActiveRecord::Migration[4.2] - def change - change_column_null :todos, :target_id, true - end -end diff --git a/db/migrate/20160316204731_add_commit_id_to_todos.rb b/db/migrate/20160316204731_add_commit_id_to_todos.rb deleted file mode 100644 index d1c004b2ced..00000000000 --- a/db/migrate/20160316204731_add_commit_id_to_todos.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddCommitIdToTodos < ActiveRecord::Migration[4.2] - def change - add_column :todos, :commit_id, :string - add_index :todos, :commit_id - end -end diff --git a/db/migrate/20160317092222_add_moved_to_to_issue.rb b/db/migrate/20160317092222_add_moved_to_to_issue.rb deleted file mode 100644 index 8d81d84fd20..00000000000 --- a/db/migrate/20160317092222_add_moved_to_to_issue.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMovedToToIssue < ActiveRecord::Migration[4.2] - def change - add_reference :issues, :moved_to, references: :issues # rubocop:disable Migration/AddReference - end -end diff --git a/db/migrate/20160320204112_index_namespaces_on_visibility_level.rb b/db/migrate/20160320204112_index_namespaces_on_visibility_level.rb deleted file mode 100644 index 9692def430c..00000000000 --- a/db/migrate/20160320204112_index_namespaces_on_visibility_level.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable all -class IndexNamespacesOnVisibilityLevel < ActiveRecord::Migration[4.2] - def change - unless index_exists?(:namespaces, :visibility_level) - add_index :namespaces, :visibility_level - end - end -end diff --git a/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb b/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb deleted file mode 100644 index a25d15a81ef..00000000000 --- a/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb +++ /dev/null @@ -1,17 +0,0 @@ -class RemoveTodosForDeletedIssues < ActiveRecord::Migration[4.2] - def up - execute <<-SQL - DELETE FROM todos - WHERE todos.target_type = 'Issue' - AND NOT EXISTS ( - SELECT * - FROM issues - WHERE issues.id = todos.target_id - AND issues.deleted_at IS NULL - ) - SQL - end - - def down - end -end diff --git a/db/migrate/20160328112808_create_notification_settings.rb b/db/migrate/20160328112808_create_notification_settings.rb deleted file mode 100644 index db19d2e370c..00000000000 --- a/db/migrate/20160328112808_create_notification_settings.rb +++ /dev/null @@ -1,12 +0,0 @@ -# rubocop:disable all -class CreateNotificationSettings < ActiveRecord::Migration[4.2] - def change - create_table :notification_settings do |t| - t.references :user, null: false - t.references :source, polymorphic: true, null: false - t.integer :level, default: 0, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160328115649_migrate_new_notification_setting.rb b/db/migrate/20160328115649_migrate_new_notification_setting.rb deleted file mode 100644 index 5ba09e75145..00000000000 --- a/db/migrate/20160328115649_migrate_new_notification_setting.rb +++ /dev/null @@ -1,17 +0,0 @@ -# This migration will create one row of NotificationSetting for each Member row -# It can take long time on big instances. -# -# This migration can be done online but with following effects: -# - during migration some users will receive notifications based on their global settings (project/group settings will be ignored) -# - its possible to get duplicate records for notification settings since we don't create uniq index yet -# -class MigrateNewNotificationSetting < ActiveRecord::Migration[4.2] - def up - timestamp = Time.now.strftime('%F %T') - execute "INSERT INTO notification_settings ( user_id, source_id, source_type, level, created_at, updated_at ) SELECT user_id, source_id, source_type, notification_level, '#{timestamp}', '#{timestamp}' FROM members WHERE user_id IS NOT NULL" - end - - def down - execute "DELETE FROM notification_settings" - end -end diff --git a/db/migrate/20160328121138_add_notification_setting_index.rb b/db/migrate/20160328121138_add_notification_setting_index.rb deleted file mode 100644 index ed82b172296..00000000000 --- a/db/migrate/20160328121138_add_notification_setting_index.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddNotificationSettingIndex < ActiveRecord::Migration[4.2] - def change - add_index :notification_settings, :user_id - add_index :notification_settings, [:source_id, :source_type] - end -end diff --git a/db/migrate/20160329144452_add_index_on_pending_delete_projects.rb b/db/migrate/20160329144452_add_index_on_pending_delete_projects.rb deleted file mode 100644 index 15c44f74451..00000000000 --- a/db/migrate/20160329144452_add_index_on_pending_delete_projects.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable all -class AddIndexOnPendingDeleteProjects < ActiveRecord::Migration[4.2] - def change - add_index :projects, :pending_delete - end -end - diff --git a/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb b/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb deleted file mode 100644 index 634a696377c..00000000000 --- a/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb +++ /dev/null @@ -1,17 +0,0 @@ -class RemoveTodosForDeletedMergeRequests < ActiveRecord::Migration[4.2] - def up - execute <<-SQL - DELETE FROM todos - WHERE todos.target_type = 'MergeRequest' - AND NOT EXISTS ( - SELECT * - FROM merge_requests - WHERE merge_requests.id = todos.target_id - AND merge_requests.deleted_at IS NULL - ) - SQL - end - - def down - end -end diff --git a/db/migrate/20160331223143_remove_twitter_sharing_enabled_from_application_settings.rb b/db/migrate/20160331223143_remove_twitter_sharing_enabled_from_application_settings.rb deleted file mode 100644 index 6e5a748d096..00000000000 --- a/db/migrate/20160331223143_remove_twitter_sharing_enabled_from_application_settings.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class RemoveTwitterSharingEnabledFromApplicationSettings < ActiveRecord::Migration[4.2] - def change - remove_column :application_settings, :twitter_sharing_enabled, :boolean - end -end diff --git a/db/migrate/20160407120251_add_images_enabled_for_project.rb b/db/migrate/20160407120251_add_images_enabled_for_project.rb deleted file mode 100644 index 2c42d89ccdf..00000000000 --- a/db/migrate/20160407120251_add_images_enabled_for_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImagesEnabledForProject < ActiveRecord::Migration[4.2] - def change - add_column :projects, :container_registry_enabled, :boolean - end -end diff --git a/db/migrate/20160412140240_add_repository_checks_enabled_setting.rb b/db/migrate/20160412140240_add_repository_checks_enabled_setting.rb deleted file mode 100644 index a59563b835e..00000000000 --- a/db/migrate/20160412140240_add_repository_checks_enabled_setting.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class AddRepositoryChecksEnabledSetting < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :repository_checks_enabled, :boolean, default: true - end -end diff --git a/db/migrate/20160412173416_add_fields_to_ci_commit.rb b/db/migrate/20160412173416_add_fields_to_ci_commit.rb deleted file mode 100644 index 4b3d4e8bd30..00000000000 --- a/db/migrate/20160412173416_add_fields_to_ci_commit.rb +++ /dev/null @@ -1,9 +0,0 @@ -# rubocop:disable all -class AddFieldsToCiCommit < ActiveRecord::Migration[4.2] - def change - add_column :ci_commits, :status, :string - add_column :ci_commits, :started_at, :timestamp - add_column :ci_commits, :finished_at, :timestamp - add_column :ci_commits, :duration, :integer - end -end diff --git a/db/migrate/20160412173417_update_ci_commit.rb b/db/migrate/20160412173417_update_ci_commit.rb deleted file mode 100644 index 91dd4582f7a..00000000000 --- a/db/migrate/20160412173417_update_ci_commit.rb +++ /dev/null @@ -1,36 +0,0 @@ -# rubocop:disable all -class UpdateCiCommit < ActiveRecord::Migration[4.2] - # This migration can be run online, but needs to be executed for the second time after restarting Unicorn workers - # Otherwise Offline migration should be used. - def change - execute("UPDATE ci_commits SET status=#{status}, ref=#{ref}, tag=#{tag} WHERE status IS NULL") - end - - private - - def status - builds = '(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id)' - success = "(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id AND status='success')" - ignored = "(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id AND (status='failed' OR status='canceled') AND allow_failure)" - pending = "(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id AND status='pending')" - running = "(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id AND status='running')" - canceled = "(SELECT COUNT(*) FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id AND status='canceled')" - - "(CASE - WHEN #{builds}=0 THEN 'skipped' - WHEN #{builds}=#{success}+#{ignored} THEN 'success' - WHEN #{builds}=#{pending} THEN 'pending' - WHEN #{builds}=#{canceled} THEN 'canceled' - WHEN #{running}+#{pending}>0 THEN 'running' - ELSE 'failed' - END)" - end - - def ref - '(SELECT ref FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id ORDER BY id DESC LIMIT 1)' - end - - def tag - '(SELECT tag FROM ci_builds WHERE ci_builds.commit_id=ci_commits.id ORDER BY id DESC LIMIT 1)' - end -end diff --git a/db/migrate/20160412173418_add_ci_commit_indexes.rb b/db/migrate/20160412173418_add_ci_commit_indexes.rb deleted file mode 100644 index 709e6b84d57..00000000000 --- a/db/migrate/20160412173418_add_ci_commit_indexes.rb +++ /dev/null @@ -1,20 +0,0 @@ -# rubocop:disable all -class AddCiCommitIndexes < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def change - add_index :ci_commits, [:gl_project_id, :sha], index_options - add_index :ci_commits, [:gl_project_id, :status], index_options - add_index :ci_commits, [:status], index_options - end - - private - - def index_options - if Gitlab::Database.postgresql? - { algorithm: :concurrently } - else - { } - end - end -end diff --git a/db/migrate/20160413115152_add_token_to_web_hooks.rb b/db/migrate/20160413115152_add_token_to_web_hooks.rb deleted file mode 100644 index 43fe46dfe5d..00000000000 --- a/db/migrate/20160413115152_add_token_to_web_hooks.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTokenToWebHooks < ActiveRecord::Migration[4.2] - def change - add_column :web_hooks, :token, :string - end -end diff --git a/db/migrate/20160415062917_create_personal_access_tokens.rb b/db/migrate/20160415062917_create_personal_access_tokens.rb deleted file mode 100644 index 43599db799e..00000000000 --- a/db/migrate/20160415062917_create_personal_access_tokens.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreatePersonalAccessTokens < ActiveRecord::Migration[4.2] - def change - create_table :personal_access_tokens do |t| - t.references :user, index: true, foreign_key: true, null: false - t.string :token, index: { unique: true }, null: false - t.string :name, null: false - t.boolean :revoked, default: false - t.datetime :expires_at - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb b/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb deleted file mode 100644 index e96c0591a07..00000000000 --- a/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddSharedRunnersTextToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :shared_runners_text, :text - end -end diff --git a/db/migrate/20160416180807_add_award_emoji.rb b/db/migrate/20160416180807_add_award_emoji.rb deleted file mode 100644 index 99c984fd116..00000000000 --- a/db/migrate/20160416180807_add_award_emoji.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable all -class AddAwardEmoji < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :award_emoji do |t| - t.string :name - t.references :user - t.references :awardable, polymorphic: true - - t.timestamps null: true - end - - add_index :award_emoji, :user_id - add_index :award_emoji, [:awardable_type, :awardable_id] - end -end diff --git a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb b/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb deleted file mode 100644 index af2820986f0..00000000000 --- a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb +++ /dev/null @@ -1,36 +0,0 @@ -class ConvertAwardNoteToEmojiAward < ActiveRecord::Migration[4.2] - disable_ddl_transaction! - - def up - if Gitlab::Database.postgresql? - migrate_postgresql - else - migrate_mysql - end - end - - def down - add_column :notes, :is_award, :boolean - - # This migration does NOT move the awards on notes, if the table is dropped in another migration, these notes will be lost. - execute "INSERT INTO notes (noteable_type, noteable_id, author_id, note, created_at, updated_at, is_award) (SELECT awardable_type, awardable_id, user_id, name, created_at, updated_at, TRUE FROM award_emoji)" - end - - def migrate_postgresql - connection.transaction do - execute 'LOCK notes IN EXCLUSIVE MODE' - execute "INSERT INTO award_emoji (awardable_type, awardable_id, user_id, name, created_at, updated_at) (SELECT noteable_type, noteable_id, author_id, note, created_at, updated_at FROM notes WHERE is_award = true)" - execute "DELETE FROM notes WHERE is_award = true" - remove_column :notes, :is_award, :boolean - end - end - - def migrate_mysql - execute 'LOCK TABLES notes WRITE, award_emoji WRITE;' - execute 'INSERT INTO award_emoji (awardable_type, awardable_id, user_id, name, created_at, updated_at) (SELECT noteable_type, noteable_id, author_id, note, created_at, updated_at FROM notes WHERE is_award = true);' - execute "DELETE FROM notes WHERE is_award = true" - remove_column :notes, :is_award, :boolean - ensure - execute 'UNLOCK TABLES' - end -end diff --git a/db/migrate/20160419120017_add_metrics_packet_size.rb b/db/migrate/20160419120017_add_metrics_packet_size.rb deleted file mode 100644 index 16c3ebfe22b..00000000000 --- a/db/migrate/20160419120017_add_metrics_packet_size.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMetricsPacketSize < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :metrics_packet_size, :integer, default: 1 - end -end diff --git a/db/migrate/20160419122101_add_only_allow_merge_if_build_succeeds_to_projects.rb b/db/migrate/20160419122101_add_only_allow_merge_if_build_succeeds_to_projects.rb deleted file mode 100644 index cf842a684a6..00000000000 --- a/db/migrate/20160419122101_add_only_allow_merge_if_build_succeeds_to_projects.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddOnlyAllowMergeIfBuildSucceedsToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default(:projects, - :only_allow_merge_if_build_succeeds, - :boolean, - default: false) - end - - def down - remove_column(:projects, :only_allow_merge_if_build_succeeds) - end -end diff --git a/db/migrate/20160421130527_disable_repository_checks.rb b/db/migrate/20160421130527_disable_repository_checks.rb deleted file mode 100644 index 8b3ce73c5e8..00000000000 --- a/db/migrate/20160421130527_disable_repository_checks.rb +++ /dev/null @@ -1,12 +0,0 @@ -# rubocop:disable all -class DisableRepositoryChecks < ActiveRecord::Migration[4.2] - def up - change_column_default :application_settings, :repository_checks_enabled, false - execute 'UPDATE application_settings SET repository_checks_enabled = false' - end - - def down - change_column_default :application_settings, :repository_checks_enabled, true - execute 'UPDATE application_settings SET repository_checks_enabled = true' - end -end diff --git a/db/migrate/20160425045124_create_u2f_registrations.rb b/db/migrate/20160425045124_create_u2f_registrations.rb deleted file mode 100644 index 9b48fc822b6..00000000000 --- a/db/migrate/20160425045124_create_u2f_registrations.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable all -class CreateU2fRegistrations < ActiveRecord::Migration[4.2] - def change - create_table :u2f_registrations do |t| - t.text :certificate - t.string :key_handle, index: true - t.string :public_key - t.integer :counter - t.references :user, index: true, foreign_key: true - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb b/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb deleted file mode 100644 index 9a0d1a2d316..00000000000 --- a/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDisabledOauthSignInSourcesToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :disabled_oauth_sign_in_sources, :text - end -end diff --git a/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb b/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb deleted file mode 100644 index 03ec29b9951..00000000000 --- a/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddRunUntaggedToCiRunner < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default(:ci_runners, :run_untagged, :boolean, - default: true, allow_null: false) - end - - def down - remove_column(:ci_runners, :run_untagged) - end -end diff --git a/db/migrate/20160508194200_remove_wall_enabled_from_projects.rb b/db/migrate/20160508194200_remove_wall_enabled_from_projects.rb deleted file mode 100644 index 4edbeb09f74..00000000000 --- a/db/migrate/20160508194200_remove_wall_enabled_from_projects.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class RemoveWallEnabledFromProjects < ActiveRecord::Migration[4.2] - def change - remove_column :projects, :wall_enabled, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20160508202603_add_head_commit_id_to_merge_request_diffs.rb b/db/migrate/20160508202603_add_head_commit_id_to_merge_request_diffs.rb deleted file mode 100644 index ee7c9326bfe..00000000000 --- a/db/migrate/20160508202603_add_head_commit_id_to_merge_request_diffs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHeadCommitIdToMergeRequestDiffs < ActiveRecord::Migration[4.2] - def change - add_column :merge_request_diffs, :head_commit_sha, :string - end -end diff --git a/db/migrate/20160508215820_add_type_to_notes.rb b/db/migrate/20160508215820_add_type_to_notes.rb deleted file mode 100644 index 343743a589c..00000000000 --- a/db/migrate/20160508215820_add_type_to_notes.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTypeToNotes < ActiveRecord::Migration[4.2] - def change - add_column :notes, :type, :string - end -end diff --git a/db/migrate/20160508215920_add_positions_to_diff_notes.rb b/db/migrate/20160508215920_add_positions_to_diff_notes.rb deleted file mode 100644 index e0ee03d0fb5..00000000000 --- a/db/migrate/20160508215920_add_positions_to_diff_notes.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddPositionsToDiffNotes < ActiveRecord::Migration[4.2] - def change - add_column :notes, :position, :text - add_column :notes, :original_position, :text - end -end diff --git a/db/migrate/20160508221410_set_type_on_legacy_diff_notes.rb b/db/migrate/20160508221410_set_type_on_legacy_diff_notes.rb deleted file mode 100644 index 567754d4f4e..00000000000 --- a/db/migrate/20160508221410_set_type_on_legacy_diff_notes.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable all -class SetTypeOnLegacyDiffNotes < ActiveRecord::Migration[4.2] - def change - execute "UPDATE notes SET type = 'LegacyDiffNote' WHERE line_code IS NOT NULL" - end -end diff --git a/db/migrate/20160509091049_add_locked_to_ci_runner.rb b/db/migrate/20160509091049_add_locked_to_ci_runner.rb deleted file mode 100644 index e19db5a4504..00000000000 --- a/db/migrate/20160509091049_add_locked_to_ci_runner.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddLockedToCiRunner < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default(:ci_runners, :locked, :boolean, - default: false, allow_null: false) - end - - def down - remove_column(:ci_runners, :locked) - end -end diff --git a/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb b/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb deleted file mode 100644 index 54d615f7e21..00000000000 --- a/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHealthCheckAccessTokenToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :health_check_access_token, :string - end -end diff --git a/db/migrate/20160516174813_add_send_user_confirmation_email_to_application_settings.rb b/db/migrate/20160516174813_add_send_user_confirmation_email_to_application_settings.rb deleted file mode 100644 index 9e203b97a43..00000000000 --- a/db/migrate/20160516174813_add_send_user_confirmation_email_to_application_settings.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable all -class AddSendUserConfirmationEmailToApplicationSettings < ActiveRecord::Migration[4.2] - def up - add_column :application_settings, :send_user_confirmation_email, :boolean, default: false - - #Sets confirmation email to true by default on existing installations. - execute "UPDATE application_settings SET send_user_confirmation_email=true" - end - - def down - remove_column :application_settings, :send_user_confirmation_email - end -end diff --git a/db/migrate/20160516224534_add_start_commit_id_to_merge_request_diffs.rb b/db/migrate/20160516224534_add_start_commit_id_to_merge_request_diffs.rb deleted file mode 100644 index a84bfd64bda..00000000000 --- a/db/migrate/20160516224534_add_start_commit_id_to_merge_request_diffs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStartCommitIdToMergeRequestDiffs < ActiveRecord::Migration[4.2] - def change - add_column :merge_request_diffs, :start_commit_sha, :string - end -end diff --git a/db/migrate/20160518200441_add_artifacts_expire_date_to_ci_builds.rb b/db/migrate/20160518200441_add_artifacts_expire_date_to_ci_builds.rb deleted file mode 100644 index 143b84a1662..00000000000 --- a/db/migrate/20160518200441_add_artifacts_expire_date_to_ci_builds.rb +++ /dev/null @@ -1,6 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddArtifactsExpireDateToCiBuilds < ActiveRecord::Migration[4.2] - def change - add_column :ci_builds, :artifacts_expire_at, :timestamp - end -end diff --git a/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb b/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb deleted file mode 100644 index ba0e1654379..00000000000 --- a/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddDevelopersCanMergeToProtectedBranches < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :protected_branches, :developers_can_merge, :boolean, default: false, allow_null: false - end - - def down - remove_column :protected_branches, :developers_can_merge - end -end diff --git a/db/migrate/20160522215720_add_note_type_and_position_to_sent_notification.rb b/db/migrate/20160522215720_add_note_type_and_position_to_sent_notification.rb deleted file mode 100644 index f569fc7c73f..00000000000 --- a/db/migrate/20160522215720_add_note_type_and_position_to_sent_notification.rb +++ /dev/null @@ -1,22 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddNoteTypeAndPositionToSentNotification < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :sent_notifications, :note_type, :string - add_column :sent_notifications, :position, :text - end -end diff --git a/db/migrate/20160525205328_remove_main_language_from_projects.rb b/db/migrate/20160525205328_remove_main_language_from_projects.rb deleted file mode 100644 index 81d0fb5b080..00000000000 --- a/db/migrate/20160525205328_remove_main_language_from_projects.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable all -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveMainLanguageFromProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - remove_column :projects, :main_language - end -end diff --git a/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb b/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb deleted file mode 100644 index c530c09859d..00000000000 --- a/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb +++ /dev/null @@ -1,13 +0,0 @@ -class RemoveNotificationSettingsForDeletedProjects < ActiveRecord::Migration[4.2] - def up - execute <<-SQL - DELETE FROM notification_settings - WHERE notification_settings.source_type = 'Project' - AND NOT EXISTS ( - SELECT * - FROM projects - WHERE projects.id = notification_settings.source_id - ) - SQL - end -end diff --git a/db/migrate/20160528043124_add_users_state_index.rb b/db/migrate/20160528043124_add_users_state_index.rb deleted file mode 100644 index 3437b35a0c0..00000000000 --- a/db/migrate/20160528043124_add_users_state_index.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddUsersStateIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - def change - add_concurrent_index :users, :state - end -end diff --git a/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb b/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb deleted file mode 100644 index 7b20146e21c..00000000000 --- a/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This is ONLINE migration - -class AddContainerRegistryTokenExpireDelayToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :application_settings, :container_registry_token_expire_delay, :integer, default: 5 - end -end diff --git a/db/migrate/20160603075128_add_has_external_issue_tracker_to_projects.rb b/db/migrate/20160603075128_add_has_external_issue_tracker_to_projects.rb deleted file mode 100644 index a7d2d7f9952..00000000000 --- a/db/migrate/20160603075128_add_has_external_issue_tracker_to_projects.rb +++ /dev/null @@ -1,10 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddHasExternalIssueTrackerToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column(:projects, :has_external_issue_tracker, :boolean) - end -end diff --git a/db/migrate/20160603180330_remove_duplicated_notification_settings.rb b/db/migrate/20160603180330_remove_duplicated_notification_settings.rb deleted file mode 100644 index 0d8c4bf011c..00000000000 --- a/db/migrate/20160603180330_remove_duplicated_notification_settings.rb +++ /dev/null @@ -1,32 +0,0 @@ -class RemoveDuplicatedNotificationSettings < ActiveRecord::Migration[4.2] - def up - duplicates = exec_query(%Q{ - SELECT user_id, source_type, source_id - FROM notification_settings - GROUP BY user_id, source_type, source_id - HAVING COUNT(*) > 1 - }) - - duplicates.each do |row| - uid = row['user_id'] - stype = connection.quote(row['source_type']) - sid = row['source_id'] - - execute(%Q{ - DELETE FROM notification_settings - WHERE user_id = #{uid} - AND source_type = #{stype} - AND source_id = #{sid} - AND id != ( - SELECT id FROM ( - SELECT min(id) AS id - FROM notification_settings - WHERE user_id = #{uid} - AND source_type = #{stype} - AND source_id = #{sid} - ) min_ids - ) - }) - end - end -end diff --git a/db/migrate/20160603182247_add_index_to_notification_settings.rb b/db/migrate/20160603182247_add_index_to_notification_settings.rb deleted file mode 100644 index cea178d555c..00000000000 --- a/db/migrate/20160603182247_add_index_to_notification_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable all -class AddIndexToNotificationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - def change - add_concurrent_index :notification_settings, [:user_id, :source_id, :source_type], { unique: true, name: "index_notifications_on_user_id_and_source_id_and_source_type" } - end -end diff --git a/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb b/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb deleted file mode 100644 index 3b3f68529a5..00000000000 --- a/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddAfterSignUpTextToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :after_sign_up_text, :text - end -end diff --git a/db/migrate/20160608195742_add_repository_storage_to_projects.rb b/db/migrate/20160608195742_add_repository_storage_to_projects.rb deleted file mode 100644 index 2b20c9fbd5f..00000000000 --- a/db/migrate/20160608195742_add_repository_storage_to_projects.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddRepositoryStorageToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default(:projects, :repository_storage, :string, default: 'default') - end - - def down - remove_column(:projects, :repository_storage) - end -end diff --git a/db/migrate/20160608211215_add_user_default_external_to_application_settings.rb b/db/migrate/20160608211215_add_user_default_external_to_application_settings.rb deleted file mode 100644 index 9b5cfc67d5a..00000000000 --- a/db/migrate/20160608211215_add_user_default_external_to_application_settings.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddUserDefaultExternalToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default(:application_settings, :user_default_external, :boolean, - default: false, allow_null: false) - end - - def down - remove_column(:application_settings, :user_default_external) - end -end diff --git a/db/migrate/20160610140403_remove_notification_setting_not_null_constraints.rb b/db/migrate/20160610140403_remove_notification_setting_not_null_constraints.rb deleted file mode 100644 index d5301672dc5..00000000000 --- a/db/migrate/20160610140403_remove_notification_setting_not_null_constraints.rb +++ /dev/null @@ -1,11 +0,0 @@ -class RemoveNotificationSettingNotNullConstraints < ActiveRecord::Migration[4.2] - def up - change_column :notification_settings, :source_type, :string, null: true - change_column :notification_settings, :source_id, :integer, null: true - end - - def down - change_column :notification_settings, :source_type, :string, null: false - change_column :notification_settings, :source_id, :integer, null: false - end -end diff --git a/db/migrate/20160610194713_remove_deprecated_issues_tracker_columns_from_projects.rb b/db/migrate/20160610194713_remove_deprecated_issues_tracker_columns_from_projects.rb deleted file mode 100644 index 1ac65997403..00000000000 --- a/db/migrate/20160610194713_remove_deprecated_issues_tracker_columns_from_projects.rb +++ /dev/null @@ -1,7 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -class RemoveDeprecatedIssuesTrackerColumnsFromProjects < ActiveRecord::Migration[4.2] - def change - remove_column :projects, :issues_tracker, :string, default: 'gitlab', null: false - remove_column :projects, :issues_tracker_id, :string - end -end diff --git a/db/migrate/20160610201627_migrate_users_notification_level.rb b/db/migrate/20160610201627_migrate_users_notification_level.rb deleted file mode 100644 index 553b7f074f2..00000000000 --- a/db/migrate/20160610201627_migrate_users_notification_level.rb +++ /dev/null @@ -1,25 +0,0 @@ -class MigrateUsersNotificationLevel < ActiveRecord::Migration[4.2] - DOWNTIME = false - - # Migrates only users who changed their default notification level :participating - # creating a new record on notification settings table - - DOWNTIME = false - - def up - execute(%Q{ - INSERT INTO notification_settings - (user_id, level, created_at, updated_at) - (SELECT id, notification_level, created_at, updated_at FROM users WHERE notification_level != 1) - }) - end - - # Migrates from notification settings back to user notification_level - # If no value is found the default level of 1 will be used - def down - execute(%Q{ - UPDATE users u SET - notification_level = COALESCE((SELECT level FROM notification_settings WHERE user_id = u.id AND source_type IS NULL), 1) - }) - end -end diff --git a/db/migrate/20160610204157_add_deployments.rb b/db/migrate/20160610204157_add_deployments.rb deleted file mode 100644 index 91b619e7d3d..00000000000 --- a/db/migrate/20160610204157_add_deployments.rb +++ /dev/null @@ -1,26 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -class AddDeployments < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - create_table :deployments, force: true do |t| - t.integer :iid, null: false - t.integer :project_id, null: false - t.integer :environment_id, null: false - t.string :ref, null: false - t.boolean :tag, null: false - t.string :sha, null: false - t.integer :user_id - t.integer :deployable_id - t.string :deployable_type - t.datetime :created_at - t.datetime :updated_at - end - - add_index :deployments, :project_id - add_index :deployments, [:project_id, :iid], unique: true - add_index :deployments, [:project_id, :environment_id] - add_index :deployments, [:project_id, :environment_id, :iid] - end -end diff --git a/db/migrate/20160610204158_add_environments.rb b/db/migrate/20160610204158_add_environments.rb deleted file mode 100644 index 55fb8b1227b..00000000000 --- a/db/migrate/20160610204158_add_environments.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -class AddEnvironments < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - create_table :environments, force: true do |t| - t.integer :project_id, null: false - t.string :name, null: false - t.datetime :created_at - t.datetime :updated_at - end - - add_index :environments, [:project_id, :name] - end -end diff --git a/db/migrate/20160610211845_add_environment_to_builds.rb b/db/migrate/20160610211845_add_environment_to_builds.rb deleted file mode 100644 index 16d5465cafa..00000000000 --- a/db/migrate/20160610211845_add_environment_to_builds.rb +++ /dev/null @@ -1,10 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddEnvironmentToBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :ci_builds, :environment, :string - end -end diff --git a/db/migrate/20160610301627_remove_notification_level_from_users.rb b/db/migrate/20160610301627_remove_notification_level_from_users.rb deleted file mode 100644 index 93f70c476d2..00000000000 --- a/db/migrate/20160610301627_remove_notification_level_from_users.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -class RemoveNotificationLevelFromUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - remove_column :users, :notification_level, :integer - end -end diff --git a/db/migrate/20160614182521_add_repository_storage_to_application_settings.rb b/db/migrate/20160614182521_add_repository_storage_to_application_settings.rb deleted file mode 100644 index a1bc0e5cd86..00000000000 --- a/db/migrate/20160614182521_add_repository_storage_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRepositoryStorageToApplicationSettings < ActiveRecord::Migration[4.2] - def change - add_column :application_settings, :repository_storage, :string, default: 'default' - end -end diff --git a/db/migrate/20160615142710_add_index_on_requested_at_to_members.rb b/db/migrate/20160615142710_add_index_on_requested_at_to_members.rb deleted file mode 100644 index 1b1dab141f8..00000000000 --- a/db/migrate/20160615142710_add_index_on_requested_at_to_members.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexOnRequestedAtToMembers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :members, :requested_at - end - - def down - remove_index :members, :requested_at if index_exists? :members, :requested_at - end -end diff --git a/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb b/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb deleted file mode 100644 index deb4b86a2fd..00000000000 --- a/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddEnabledGitAccessProtocolsToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :application_settings, :enabled_git_access_protocol, :string - end -end diff --git a/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb b/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb deleted file mode 100644 index 11d15e7c15f..00000000000 --- a/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class SetMissingStageOnCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - def up - update_column_in_batches(:ci_builds, :stage, :test) do |table, query| - query.where(table[:stage].eq(nil)) - end - end -end diff --git a/db/migrate/20160616084004_change_project_of_environment.rb b/db/migrate/20160616084004_change_project_of_environment.rb deleted file mode 100644 index 23914a0325a..00000000000 --- a/db/migrate/20160616084004_change_project_of_environment.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ChangeProjectOfEnvironment < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - change_column_null :environments, :project_id, true - end -end diff --git a/db/migrate/20160616102642_remove_duplicated_keys.rb b/db/migrate/20160616102642_remove_duplicated_keys.rb deleted file mode 100644 index 0b896108292..00000000000 --- a/db/migrate/20160616102642_remove_duplicated_keys.rb +++ /dev/null @@ -1,18 +0,0 @@ -class RemoveDuplicatedKeys < ActiveRecord::Migration[4.2] - def up - select_all("SELECT fingerprint FROM #{quote_table_name(:keys)} GROUP BY fingerprint HAVING COUNT(*) > 1").each do |row| - fingerprint = connection.quote(row['fingerprint']) - execute(%Q{ - DELETE FROM #{quote_table_name(:keys)} - WHERE fingerprint = #{fingerprint} - AND id != ( - SELECT id FROM ( - SELECT max(id) AS id - FROM #{quote_table_name(:keys)} - WHERE fingerprint = #{fingerprint} - ) max_ids - ) - }) - end - end -end diff --git a/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb b/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb deleted file mode 100644 index afccc40cc67..00000000000 --- a/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable RemoveIndex -class RemoveKeysFingerprintIndexIfExists < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - # https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/250 - # That MR was added on gitlab-ee so we need to check if the index - # already exists because we want to do is create an unique index instead. - - def up - if index_exists?(:keys, :fingerprint) - remove_index :keys, :fingerprint - end - end - - def down - unless index_exists?(:keys, :fingerprint) - add_concurrent_index :keys, :fingerprint - end - end -end diff --git a/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb b/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb deleted file mode 100644 index d619acad3d0..00000000000 --- a/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable RemoveIndex -class AddUniqueIndexToKeysFingerprint < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - def up - add_concurrent_index :keys, :fingerprint, unique: true - end - - def down - remove_index :keys, :fingerprint - end -end diff --git a/db/migrate/20160617301627_add_events_to_notification_settings.rb b/db/migrate/20160617301627_add_events_to_notification_settings.rb deleted file mode 100644 index 109817e3d8a..00000000000 --- a/db/migrate/20160617301627_add_events_to_notification_settings.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddEventsToNotificationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :notification_settings, :events, :text - end -end diff --git a/db/migrate/20160620115026_add_index_on_runners_locked.rb b/db/migrate/20160620115026_add_index_on_runners_locked.rb deleted file mode 100644 index c619dc07a91..00000000000 --- a/db/migrate/20160620115026_add_index_on_runners_locked.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexOnRunnersLocked < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_runners, :locked - end - - def down - remove_index :ci_runners, :locked if index_exists? :ci_runners, :locked - end -end diff --git a/db/migrate/20160621123729_add_rebase_commit_sha_to_merge_requests.rb b/db/migrate/20160621123729_add_rebase_commit_sha_to_merge_requests.rb deleted file mode 100644 index 2d3ab4e2583..00000000000 --- a/db/migrate/20160621123729_add_rebase_commit_sha_to_merge_requests.rb +++ /dev/null @@ -1,22 +0,0 @@ -# This migration is a duplicate of 20171230123729_add_rebase_commit_sha_to_merge_requests_ce.rb -# -# We backported this feature from EE using the same migration, but with a new -# timestamp, which caused an error when the backport was then to be merged back -# into EE. -# -# See discussion at https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/3932 -class AddRebaseCommitShaToMergeRequests < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - unless column_exists?(:merge_requests, :rebase_commit_sha) - add_column :merge_requests, :rebase_commit_sha, :string - end - end - - def down - if column_exists?(:merge_requests, :rebase_commit_sha) - remove_column :merge_requests, :rebase_commit_sha - end - end -end diff --git a/db/migrate/20160628085157_add_artifacts_size_to_ci_builds.rb b/db/migrate/20160628085157_add_artifacts_size_to_ci_builds.rb deleted file mode 100644 index 60bd4c36eb6..00000000000 --- a/db/migrate/20160628085157_add_artifacts_size_to_ci_builds.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddArtifactsSizeToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column(:ci_builds, :artifacts_size, :integer) - end -end diff --git a/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb b/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb deleted file mode 100644 index 13e1280b71a..00000000000 --- a/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb +++ /dev/null @@ -1,8 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddColumnInProgressMergeCommitShaToMergeRequests < ActiveRecord::Migration[4.2] - def change - add_column :merge_requests, :in_progress_merge_commit_sha, :string - end -end diff --git a/db/migrate/20160703180340_add_index_on_award_emoji_user_and_name.rb b/db/migrate/20160703180340_add_index_on_award_emoji_user_and_name.rb deleted file mode 100644 index 8a576b99de0..00000000000 --- a/db/migrate/20160703180340_add_index_on_award_emoji_user_and_name.rb +++ /dev/null @@ -1,11 +0,0 @@ -# rubocop:disable all -# Migration type: online without errors - -class AddIndexOnAwardEmojiUserAndName < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def change - add_concurrent_index(:award_emoji, [:user_id, :name]) - end -end diff --git a/db/migrate/20160705054938_add_protected_branches_push_access.rb b/db/migrate/20160705054938_add_protected_branches_push_access.rb deleted file mode 100644 index 314d90efa90..00000000000 --- a/db/migrate/20160705054938_add_protected_branches_push_access.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/Timestamps -class AddProtectedBranchesPushAccess < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :protected_branch_push_access_levels do |t| - t.references :protected_branch, index: { name: "index_protected_branch_push_access" }, foreign_key: true, null: false - - # Gitlab::Access::MAINTAINER == 40 - t.integer :access_level, default: 40, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160705054952_add_protected_branches_merge_access.rb b/db/migrate/20160705054952_add_protected_branches_merge_access.rb deleted file mode 100644 index 672e0e291db..00000000000 --- a/db/migrate/20160705054952_add_protected_branches_merge_access.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/Timestamps -class AddProtectedBranchesMergeAccess < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :protected_branch_merge_access_levels do |t| - t.references :protected_branch, index: { name: "index_protected_branch_merge_access" }, foreign_key: true, null: false - - # Gitlab::Access::MAINTAINER == 40 - t.integer :access_level, default: 40, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160705055254_move_from_developers_can_merge_to_protected_branches_merge_access.rb b/db/migrate/20160705055254_move_from_developers_can_merge_to_protected_branches_merge_access.rb deleted file mode 100644 index 1bd462cab06..00000000000 --- a/db/migrate/20160705055254_move_from_developers_can_merge_to_protected_branches_merge_access.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MoveFromDevelopersCanMergeToProtectedBranchesMergeAccess < ActiveRecord::Migration[4.2] - DOWNTIME = true - DOWNTIME_REASON = <<-HEREDOC - We're creating a `merge_access_level` for each `protected_branch`. If a user creates a `protected_branch` while this - is running, we might be left with a `protected_branch` _without_ an associated `merge_access_level`. The `protected_branches` - table must not change while this is running, so downtime is required. - - https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5081#note_13247410 - HEREDOC - - def up - execute <<-HEREDOC - INSERT into protected_branch_merge_access_levels (protected_branch_id, access_level, created_at, updated_at) - SELECT id, (CASE WHEN developers_can_merge THEN 30 ELSE 40 END), now(), now() - FROM protected_branches - HEREDOC - end - - def down - execute <<-HEREDOC - UPDATE protected_branches SET developers_can_merge = TRUE - WHERE id IN (SELECT protected_branch_id FROM protected_branch_merge_access_levels - WHERE access_level = 30); - HEREDOC - end -end diff --git a/db/migrate/20160705055308_move_from_developers_can_push_to_protected_branches_push_access.rb b/db/migrate/20160705055308_move_from_developers_can_push_to_protected_branches_push_access.rb deleted file mode 100644 index d480dac777a..00000000000 --- a/db/migrate/20160705055308_move_from_developers_can_push_to_protected_branches_push_access.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MoveFromDevelopersCanPushToProtectedBranchesPushAccess < ActiveRecord::Migration[4.2] - DOWNTIME = true - DOWNTIME_REASON = <<-HEREDOC - We're creating a `push_access_level` for each `protected_branch`. If a user creates a `protected_branch` while this - is running, we might be left with a `protected_branch` _without_ an associated `push_access_level`. The `protected_branches` - table must not change while this is running, so downtime is required. - - https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5081#note_13247410 - HEREDOC - - def up - execute <<-HEREDOC - INSERT into protected_branch_push_access_levels (protected_branch_id, access_level, created_at, updated_at) - SELECT id, (CASE WHEN developers_can_push THEN 30 ELSE 40 END), now(), now() - FROM protected_branches - HEREDOC - end - - def down - execute <<-HEREDOC - UPDATE protected_branches SET developers_can_push = TRUE - WHERE id IN (SELECT protected_branch_id FROM protected_branch_push_access_levels - WHERE access_level = 30); - HEREDOC - end -end diff --git a/db/migrate/20160705055809_remove_developers_can_push_from_protected_branches.rb b/db/migrate/20160705055809_remove_developers_can_push_from_protected_branches.rb deleted file mode 100644 index e5c9da072cf..00000000000 --- a/db/migrate/20160705055809_remove_developers_can_push_from_protected_branches.rb +++ /dev/null @@ -1,20 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDevelopersCanPushFromProtectedBranches < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # This is only required for `#down` - disable_ddl_transaction! - - DOWNTIME = false - - def up - remove_column :protected_branches, :developers_can_push, :boolean - end - - def down - add_column_with_default(:protected_branches, :developers_can_push, :boolean, default: false, allow_null: false) - end -end diff --git a/db/migrate/20160705055813_remove_developers_can_merge_from_protected_branches.rb b/db/migrate/20160705055813_remove_developers_can_merge_from_protected_branches.rb deleted file mode 100644 index 2a623b55839..00000000000 --- a/db/migrate/20160705055813_remove_developers_can_merge_from_protected_branches.rb +++ /dev/null @@ -1,20 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDevelopersCanMergeFromProtectedBranches < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # This is only required for `#down` - disable_ddl_transaction! - - DOWNTIME = false - - def up - remove_column :protected_branches, :developers_can_merge, :boolean - end - - def down - add_column_with_default(:protected_branches, :developers_can_merge, :boolean, default: false, allow_null: false) - end -end diff --git a/db/migrate/20160705163108_remove_requesters_that_are_owners.rb b/db/migrate/20160705163108_remove_requesters_that_are_owners.rb deleted file mode 100644 index 449c67e1b6a..00000000000 --- a/db/migrate/20160705163108_remove_requesters_that_are_owners.rb +++ /dev/null @@ -1,40 +0,0 @@ -class RemoveRequestersThatAreOwners < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def up - # Delete requesters that are owner of their projects and actually requested - # access to it - execute <<-SQL - DELETE FROM members - WHERE members.source_type = 'Project' - AND members.type = 'ProjectMember' - AND members.requested_at IS NOT NULL - AND members.user_id = ( - SELECT namespaces.owner_id - FROM namespaces - JOIN projects ON namespaces.id = projects.namespace_id - WHERE namespaces.type IS NULL - AND projects.id = members.source_id - AND namespaces.owner_id = members.user_id); - SQL - - # Delete requesters that are owner of their project's group and actually requested - # access to it - execute <<-SQL - DELETE FROM members - WHERE members.source_type = 'Project' - AND members.type = 'ProjectMember' - AND members.requested_at IS NOT NULL - AND members.user_id = ( - SELECT namespaces.owner_id - FROM namespaces - JOIN projects ON namespaces.id = projects.namespace_id - WHERE namespaces.type = 'Group' - AND projects.id = members.source_id - AND namespaces.owner_id = members.user_id); - SQL - end - - def down - end -end diff --git a/db/migrate/20160707104333_add_lock_to_issuables.rb b/db/migrate/20160707104333_add_lock_to_issuables.rb deleted file mode 100644 index fdc3abf46cc..00000000000 --- a/db/migrate/20160707104333_add_lock_to_issuables.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLockToIssuables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - add_column :issues, :lock_version, :integer - add_column :merge_requests, :lock_version, :integer - end - - def down - remove_column :issues, :lock_version - remove_column :merge_requests, :lock_version - end -end diff --git a/db/migrate/20160712171823_remove_award_emojis_with_no_user.rb b/db/migrate/20160712171823_remove_award_emojis_with_no_user.rb deleted file mode 100644 index 0b553182a81..00000000000 --- a/db/migrate/20160712171823_remove_award_emojis_with_no_user.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveAwardEmojisWithNoUser < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - AwardEmoji.joins('LEFT JOIN users ON users.id = user_id').where('users.id IS NULL').destroy_all # rubocop: disable DestroyAll - end -end diff --git a/db/migrate/20160713200638_add_repository_read_only_to_projects.rb b/db/migrate/20160713200638_add_repository_read_only_to_projects.rb deleted file mode 100644 index ba61bc8cbb0..00000000000 --- a/db/migrate/20160713200638_add_repository_read_only_to_projects.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRepositoryReadOnlyToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :projects, :repository_read_only, :boolean - end -end diff --git a/db/migrate/20160713205315_add_domain_blacklist_to_application_settings.rb b/db/migrate/20160713205315_add_domain_blacklist_to_application_settings.rb deleted file mode 100644 index 4b9ac12253e..00000000000 --- a/db/migrate/20160713205315_add_domain_blacklist_to_application_settings.rb +++ /dev/null @@ -1,23 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/SaferBooleanColumn -class AddDomainBlacklistToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :application_settings, :domain_blacklist_enabled, :boolean, default: false - add_column :application_settings, :domain_blacklist, :text - end -end diff --git a/db/migrate/20160713222618_add_usage_ping_to_application_settings.rb b/db/migrate/20160713222618_add_usage_ping_to_application_settings.rb deleted file mode 100644 index 7ef02316338..00000000000 --- a/db/migrate/20160713222618_add_usage_ping_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddUsagePingToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :usage_ping_enabled, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20160715132507_add_user_id_to_pipeline.rb b/db/migrate/20160715132507_add_user_id_to_pipeline.rb deleted file mode 100644 index b1e22b1c2bb..00000000000 --- a/db/migrate/20160715132507_add_user_id_to_pipeline.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddUserIdToPipeline < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :ci_commits, :user_id, :integer - end -end diff --git a/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb b/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb deleted file mode 100644 index 8e7ac86a8b7..00000000000 --- a/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexForPipelineUserId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_commits, :user_id - end - - def down - remove_index :ci_commits, :user_id if index_exists? :ci_commits, :user_id - end -end diff --git a/db/migrate/20160715154212_add_request_access_enabled_to_projects.rb b/db/migrate/20160715154212_add_request_access_enabled_to_projects.rb deleted file mode 100644 index 96260f5fd55..00000000000 --- a/db/migrate/20160715154212_add_request_access_enabled_to_projects.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddRequestAccessEnabledToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default :projects, :request_access_enabled, :boolean, default: true - end - - def down - remove_column :projects, :request_access_enabled - end -end diff --git a/db/migrate/20160715204316_add_request_access_enabled_to_groups.rb b/db/migrate/20160715204316_add_request_access_enabled_to_groups.rb deleted file mode 100644 index 14065434523..00000000000 --- a/db/migrate/20160715204316_add_request_access_enabled_to_groups.rb +++ /dev/null @@ -1,13 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddRequestAccessEnabledToGroups < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - add_column_with_default :namespaces, :request_access_enabled, :boolean, default: true - end - - def down - remove_column :namespaces, :request_access_enabled - end -end diff --git a/db/migrate/20160715230841_rename_application_settings_restricted_signup_domains.rb b/db/migrate/20160715230841_rename_application_settings_restricted_signup_domains.rb deleted file mode 100644 index 6a2674fb604..00000000000 --- a/db/migrate/20160715230841_rename_application_settings_restricted_signup_domains.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameApplicationSettingsRestrictedSignupDomains < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - rename_column :application_settings, :restricted_signup_domains, :domain_whitelist - end -end diff --git a/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb b/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb deleted file mode 100644 index d403b0a3cc9..00000000000 --- a/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddWhenAndYamlVariablesToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :ci_builds, :when, :string - add_column :ci_builds, :yaml_variables, :text - end -end diff --git a/db/migrate/20160716115711_add_queued_at_to_ci_builds.rb b/db/migrate/20160716115711_add_queued_at_to_ci_builds.rb deleted file mode 100644 index 2bb9a30e3a3..00000000000 --- a/db/migrate/20160716115711_add_queued_at_to_ci_builds.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddQueuedAtToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_builds, :queued_at, :timestamp - end -end diff --git a/db/migrate/20160718153603_add_has_external_wiki_to_projects.rb b/db/migrate/20160718153603_add_has_external_wiki_to_projects.rb deleted file mode 100644 index e3e4afaf512..00000000000 --- a/db/migrate/20160718153603_add_has_external_wiki_to_projects.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddHasExternalWikiToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - def change - add_column :projects, :has_external_wiki, :boolean - end -end diff --git a/db/migrate/20160721081015_drop_and_readd_has_external_wiki_in_projects.rb b/db/migrate/20160721081015_drop_and_readd_has_external_wiki_in_projects.rb deleted file mode 100644 index d31bbb22392..00000000000 --- a/db/migrate/20160721081015_drop_and_readd_has_external_wiki_in_projects.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class DropAndReaddHasExternalWikiInProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:projects, :has_external_wiki, nil) do |table, query| - query.where(table[:has_external_wiki].not_eq(nil)) - end - end - - def down - end -end diff --git a/db/migrate/20160722221922_nullify_blank_type_on_notes.rb b/db/migrate/20160722221922_nullify_blank_type_on_notes.rb deleted file mode 100644 index 83ca5c1e6ec..00000000000 --- a/db/migrate/20160722221922_nullify_blank_type_on_notes.rb +++ /dev/null @@ -1,9 +0,0 @@ -class NullifyBlankTypeOnNotes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - execute "UPDATE notes SET type = NULL WHERE type = ''" - end -end diff --git a/db/migrate/20160724205507_add_resolved_to_notes.rb b/db/migrate/20160724205507_add_resolved_to_notes.rb deleted file mode 100644 index fc56d3b1452..00000000000 --- a/db/migrate/20160724205507_add_resolved_to_notes.rb +++ /dev/null @@ -1,11 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddResolvedToNotes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :notes, :resolved_at, :datetime - add_column :notes, :resolved_by_id, :integer - end -end diff --git a/db/migrate/20160725083350_add_external_url_to_enviroments.rb b/db/migrate/20160725083350_add_external_url_to_enviroments.rb deleted file mode 100644 index e060c6a8499..00000000000 --- a/db/migrate/20160725083350_add_external_url_to_enviroments.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddExternalUrlToEnviroments < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:environments, :external_url, :string) - end -end diff --git a/db/migrate/20160725104020_merge_request_diff_remove_uniq.rb b/db/migrate/20160725104020_merge_request_diff_remove_uniq.rb deleted file mode 100644 index d8b4696a246..00000000000 --- a/db/migrate/20160725104020_merge_request_diff_remove_uniq.rb +++ /dev/null @@ -1,36 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class MergeRequestDiffRemoveUniq < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - constraint_name = 'merge_request_diffs_merge_request_id_key' - - transaction do - if index_exists?(:merge_request_diffs, :merge_request_id) - remove_index(:merge_request_diffs, :merge_request_id) - end - - # In some bizarre cases PostgreSQL might have a separate unique constraint - # that we'll need to drop. - if constraint_exists?(constraint_name) && Gitlab::Database.postgresql? - execute("ALTER TABLE merge_request_diffs DROP CONSTRAINT IF EXISTS #{constraint_name};") - end - end - end - - def down - unless index_exists?(:merge_request_diffs, :merge_request_id) - add_concurrent_index(:merge_request_diffs, :merge_request_id, unique: true) - end - end - - def constraint_exists?(name) - indexes(:merge_request_diffs).map(&:name).include?(name) - end -end diff --git a/db/migrate/20160725104452_merge_request_diff_add_index.rb b/db/migrate/20160725104452_merge_request_diff_add_index.rb deleted file mode 100644 index d3369b3f961..00000000000 --- a/db/migrate/20160725104452_merge_request_diff_add_index.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable RemoveIndex -class MergeRequestDiffAddIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - add_concurrent_index :merge_request_diffs, :merge_request_id - end - - def down - if index_exists?(:merge_request_diffs, :merge_request_id) - remove_index :merge_request_diffs, :merge_request_id - end - end -end diff --git a/db/migrate/20160727163552_create_user_agent_details.rb b/db/migrate/20160727163552_create_user_agent_details.rb deleted file mode 100644 index 6ef54deca90..00000000000 --- a/db/migrate/20160727163552_create_user_agent_details.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateUserAgentDetails < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - create_table :user_agent_details do |t| - t.string :user_agent, null: false - t.string :ip_address, null: false - t.integer :subject_id, null: false - t.string :subject_type, null: false - t.boolean :submitted, default: false, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160727191041_create_boards.rb b/db/migrate/20160727191041_create_boards.rb deleted file mode 100644 index 60ed5508b10..00000000000 --- a/db/migrate/20160727191041_create_boards.rb +++ /dev/null @@ -1,14 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateBoards < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :boards do |t| - t.references :project, index: true, foreign_key: true, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160727193336_create_lists.rb b/db/migrate/20160727193336_create_lists.rb deleted file mode 100644 index 4591c9a120f..00000000000 --- a/db/migrate/20160727193336_create_lists.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateLists < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :lists do |t| - t.references :board, index: true, foreign_key: true, null: false - t.references :label, index: true, foreign_key: true - t.integer :list_type, null: false, default: 1 - t.integer :position - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160728081025_add_pipeline_events_to_web_hooks.rb b/db/migrate/20160728081025_add_pipeline_events_to_web_hooks.rb deleted file mode 100644 index fc3e9f03c74..00000000000 --- a/db/migrate/20160728081025_add_pipeline_events_to_web_hooks.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddPipelineEventsToWebHooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:web_hooks, :pipeline_events, :boolean, - default: false, allow_null: false) - end - - def down - remove_column(:web_hooks, :pipeline_events) - end -end diff --git a/db/migrate/20160728103734_add_pipeline_events_to_services.rb b/db/migrate/20160728103734_add_pipeline_events_to_services.rb deleted file mode 100644 index 421859ff5fd..00000000000 --- a/db/migrate/20160728103734_add_pipeline_events_to_services.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddPipelineEventsToServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:services, :pipeline_events, :boolean, - default: false, allow_null: false) - end - - def down - remove_column(:services, :pipeline_events) - end -end diff --git a/db/migrate/20160729173930_remove_project_id_from_spam_logs.rb b/db/migrate/20160729173930_remove_project_id_from_spam_logs.rb deleted file mode 100644 index 02e417e376f..00000000000 --- a/db/migrate/20160729173930_remove_project_id_from_spam_logs.rb +++ /dev/null @@ -1,30 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveProjectIdFromSpamLogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Removing a column that contains data that is not used anywhere.' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - remove_column :spam_logs, :project_id, :integer - end -end diff --git a/db/migrate/20160801163421_add_expires_at_to_member.rb b/db/migrate/20160801163421_add_expires_at_to_member.rb deleted file mode 100644 index 13ca1d04658..00000000000 --- a/db/migrate/20160801163421_add_expires_at_to_member.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddExpiresAtToMember < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :members, :expires_at, :date - end -end diff --git a/db/migrate/20160801163709_add_submitted_as_ham_to_spam_logs.rb b/db/migrate/20160801163709_add_submitted_as_ham_to_spam_logs.rb deleted file mode 100644 index fde9dee980e..00000000000 --- a/db/migrate/20160801163709_add_submitted_as_ham_to_spam_logs.rb +++ /dev/null @@ -1,24 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddSubmittedAsHamToSpamLogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - disable_ddl_transaction! - - def up - add_column_with_default :spam_logs, :submitted_as_ham, :boolean, default: false - end - - def down - remove_column :spam_logs, :submitted_as_ham - end -end diff --git a/db/migrate/20160802010328_remove_builds_enable_index_on_projects.rb b/db/migrate/20160802010328_remove_builds_enable_index_on_projects.rb deleted file mode 100644 index 4ad740e0812..00000000000 --- a/db/migrate/20160802010328_remove_builds_enable_index_on_projects.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable RemoveIndex -class RemoveBuildsEnableIndexOnProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_index :projects, column: :builds_enabled if index_exists?(:projects, :builds_enabled) - end -end diff --git a/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb b/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb deleted file mode 100644 index f866fe15ec1..00000000000 --- a/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddUniqueIndexToListsLabelId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :lists, [:board_id, :label_id], unique: true - end - - def down - remove_index :lists, column: [:board_id, :label_id] if index_exists?(:lists, [:board_id, :label_id], unique: true) - end -end diff --git a/db/migrate/20160804142904_add_ci_config_file_to_project.rb b/db/migrate/20160804142904_add_ci_config_file_to_project.rb deleted file mode 100644 index abd94e63db3..00000000000 --- a/db/migrate/20160804142904_add_ci_config_file_to_project.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddCiConfigFileToProject < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :projects, :ci_config_path, :string - end - - def down - remove_column :projects, :ci_config_path - end -end diff --git a/db/migrate/20160804150737_add_timestamps_to_members_again.rb b/db/migrate/20160804150737_add_timestamps_to_members_again.rb deleted file mode 100644 index 4e71197b8e7..00000000000 --- a/db/migrate/20160804150737_add_timestamps_to_members_again.rb +++ /dev/null @@ -1,21 +0,0 @@ -# rubocop:disable all -# 20141121133009_add_timestamps_to_members.rb was meant to ensure that all -# rows in the members table had created_at and updated_at set, following an -# error in a previous migration. This failed to set all rows in at least one -# case: https://gitlab.com/gitlab-org/gitlab-ce/issues/20568 -# -# Why this happened is lost in the mists of time, so repeat the SQL query -# without speculation, just in case more than one person was affected. -class AddTimestampsToMembersAgain < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute "UPDATE members SET created_at = NOW() WHERE created_at IS NULL" - execute "UPDATE members SET updated_at = NOW() WHERE updated_at IS NULL" - end - - def down - # no change - end - -end diff --git a/db/migrate/20160805041956_add_deleted_at_to_namespaces.rb b/db/migrate/20160805041956_add_deleted_at_to_namespaces.rb deleted file mode 100644 index a0dfa3259ec..00000000000 --- a/db/migrate/20160805041956_add_deleted_at_to_namespaces.rb +++ /dev/null @@ -1,21 +0,0 @@ -# rubocop:disable Migration/Datetime -# rubocop:disable RemoveIndex -class AddDeletedAtToNamespaces < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :namespaces, :deleted_at, :datetime - - add_concurrent_index :namespaces, :deleted_at - end - - def down - remove_index :namespaces, :deleted_at if index_exists? :namespaces, :deleted_at - - remove_column :namespaces, :deleted_at - end -end diff --git a/db/migrate/20160808085531_add_token_to_build.rb b/db/migrate/20160808085531_add_token_to_build.rb deleted file mode 100644 index a1d8945a538..00000000000 --- a/db/migrate/20160808085531_add_token_to_build.rb +++ /dev/null @@ -1,10 +0,0 @@ -class AddTokenToBuild < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :ci_builds, :token, :string - end -end diff --git a/db/migrate/20160808085602_add_index_for_build_token.rb b/db/migrate/20160808085602_add_index_for_build_token.rb deleted file mode 100644 index 22d50e4165a..00000000000 --- a/db/migrate/20160808085602_add_index_for_build_token.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexForBuildToken < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, :token, unique: true - end - - def down - remove_index :ci_builds, :token, unique: true if index_exists? :ci_builds, :token, unique: true - end -end diff --git a/db/migrate/20160810102349_remove_ci_runner_trigram_indexes.rb b/db/migrate/20160810102349_remove_ci_runner_trigram_indexes.rb deleted file mode 100644 index 738b93912b6..00000000000 --- a/db/migrate/20160810102349_remove_ci_runner_trigram_indexes.rb +++ /dev/null @@ -1,27 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveCiRunnerTrigramIndexes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # Disabled for the "down" method so the indexes can be re-created concurrently. - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - transaction do - execute 'DROP INDEX IF EXISTS index_ci_runners_on_token_trigram;' - execute 'DROP INDEX IF EXISTS index_ci_runners_on_description_trigram;' - end - end - - def down - return unless Gitlab::Database.postgresql? - - execute 'CREATE INDEX CONCURRENTLY index_ci_runners_on_token_trigram ON ci_runners USING gin(token gin_trgm_ops);' - execute 'CREATE INDEX CONCURRENTLY index_ci_runners_on_description_trigram ON ci_runners USING gin(description gin_trgm_ops);' - end -end diff --git a/db/migrate/20160810142633_remove_redundant_indexes.rb b/db/migrate/20160810142633_remove_redundant_indexes.rb deleted file mode 100644 index 91f82cf9afa..00000000000 --- a/db/migrate/20160810142633_remove_redundant_indexes.rb +++ /dev/null @@ -1,113 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class RemoveRedundantIndexes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - indexes = [ - [:ci_taggings, 'ci_taggings_idx'], - [:audit_events, 'index_audit_events_on_author_id'], - [:audit_events, 'index_audit_events_on_type'], - [:ci_builds, 'index_ci_builds_on_erased_by_id'], - [:ci_builds, 'index_ci_builds_on_project_id_and_commit_id'], - [:ci_builds, 'index_ci_builds_on_type'], - [:ci_commits, 'index_ci_commits_on_project_id'], - [:ci_commits, 'index_ci_commits_on_project_id_and_committed_at'], - [:ci_commits, 'index_ci_commits_on_project_id_and_committed_at_and_id'], - [:ci_commits, 'index_ci_commits_on_project_id_and_sha'], - [:ci_commits, 'index_ci_commits_on_sha'], - [:ci_events, 'index_ci_events_on_created_at'], - [:ci_events, 'index_ci_events_on_is_admin'], - [:ci_events, 'index_ci_events_on_project_id'], - [:ci_jobs, 'index_ci_jobs_on_deleted_at'], - [:ci_jobs, 'index_ci_jobs_on_project_id'], - [:ci_projects, 'index_ci_projects_on_gitlab_id'], - [:ci_projects, 'index_ci_projects_on_shared_runners_enabled'], - [:ci_services, 'index_ci_services_on_project_id'], - [:ci_sessions, 'index_ci_sessions_on_session_id'], - [:ci_sessions, 'index_ci_sessions_on_updated_at'], - [:ci_tags, 'index_ci_tags_on_name'], - [:ci_triggers, 'index_ci_triggers_on_deleted_at'], - [:identities, 'index_identities_on_created_at_and_id'], - [:issues, 'index_issues_on_title'], - [:keys, 'index_keys_on_created_at_and_id'], - [:members, 'index_members_on_created_at_and_id'], - [:members, 'index_members_on_type'], - [:milestones, 'index_milestones_on_created_at_and_id'], - [:namespaces, 'index_namespaces_on_visibility_level'], - [:projects, 'index_projects_on_builds_enabled_and_shared_runners_enabled'], - [:services, 'index_services_on_category'], - [:services, 'index_services_on_created_at_and_id'], - [:services, 'index_services_on_default'], - [:snippets, 'index_snippets_on_created_at'], - [:snippets, 'index_snippets_on_created_at_and_id'], - [:todos, 'index_todos_on_state'], - [:web_hooks, 'index_web_hooks_on_created_at_and_id'], - - # These indexes _may_ be used but they can be replaced by other existing - # indexes. - - # There's already a composite index on (project_id, iid) which means that - # a separate index for _just_ project_id is not needed. - [:issues, 'index_issues_on_project_id'], - - # These are all composite indexes for the columns (created_at, id). In all - # these cases there's already a standalone index for "created_at" which - # can be used instead. - # - # Because the "id" column of these composite indexes is never needed (due - # to "id" already being indexed as its a primary key) these composite - # indexes are useless. - [:issues, 'index_issues_on_created_at_and_id'], - [:merge_requests, 'index_merge_requests_on_created_at_and_id'], - [:namespaces, 'index_namespaces_on_created_at_and_id'], - [:notes, 'index_notes_on_created_at_and_id'], - [:projects, 'index_projects_on_created_at_and_id'], - [:users, 'index_users_on_created_at_and_id'] - ] - - transaction do - indexes.each do |(table, index)| - remove_index(table, name: index) if index_exists_by_name?(table, index) - end - end - - add_concurrent_index(:users, :created_at) - add_concurrent_index(:projects, :created_at) - add_concurrent_index(:namespaces, :created_at) - end - - def down - # We're only restoring the composite indexes that could be replaced with - # individual ones, just in case somebody would ever want to revert. - transaction do - remove_index(:users, :created_at) - remove_index(:projects, :created_at) - remove_index(:namespaces, :created_at) - end - - [:issues, :merge_requests, :namespaces, :notes, :projects, :users].each do |table| - add_concurrent_index(table, [:created_at, :id], - name: "index_#{table}_on_created_at_and_id") - end - end - - # Rails' index_exists? doesn't work when you only give it a table and index - # name. As such we have to use some extra code to check if an index exists for - # a given name. - def index_exists_by_name?(table, index) - indexes_for_table[table].include?(index) - end - - def indexes_for_table - @indexes_for_table ||= Hash.new do |hash, table_name| - hash[table_name] = indexes(table_name).map(&:name) - end - end -end diff --git a/db/migrate/20160811172945_add_can_push_to_keys.rb b/db/migrate/20160811172945_add_can_push_to_keys.rb deleted file mode 100644 index 2e78ab0249e..00000000000 --- a/db/migrate/20160811172945_add_can_push_to_keys.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AddCanPushToKeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:keys, :can_push, :boolean, default: false, allow_null: false) - end - - def down - remove_column(:keys, :can_push) - end -end diff --git a/db/migrate/20160816161312_add_column_name_to_u2f_registrations.rb b/db/migrate/20160816161312_add_column_name_to_u2f_registrations.rb deleted file mode 100644 index 76b60787323..00000000000 --- a/db/migrate/20160816161312_add_column_name_to_u2f_registrations.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddColumnNameToU2fRegistrations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :u2f_registrations, :name, :string - end -end diff --git a/db/migrate/20160817133006_add_koding_to_application_settings.rb b/db/migrate/20160817133006_add_koding_to_application_settings.rb deleted file mode 100644 index 04f9d7be29b..00000000000 --- a/db/migrate/20160817133006_add_koding_to_application_settings.rb +++ /dev/null @@ -1,11 +0,0 @@ -# rubocop:disable Migration/SaferBooleanColumn -class AddKodingToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :koding_enabled, :boolean - add_column :application_settings, :koding_url, :string - end -end diff --git a/db/migrate/20160817154936_add_discussion_ids_to_notes.rb b/db/migrate/20160817154936_add_discussion_ids_to_notes.rb deleted file mode 100644 index e735eeadac5..00000000000 --- a/db/migrate/20160817154936_add_discussion_ids_to_notes.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddDiscussionIdsToNotes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :notes, :discussion_id, :string - add_column :notes, :original_discussion_id, :string - end -end diff --git a/db/migrate/20160818205718_add_expires_at_to_project_group_links.rb b/db/migrate/20160818205718_add_expires_at_to_project_group_links.rb deleted file mode 100644 index 06f621c6c2e..00000000000 --- a/db/migrate/20160818205718_add_expires_at_to_project_group_links.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddExpiresAtToProjectGroupLinks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :project_group_links, :expires_at, :date - end -end diff --git a/db/migrate/20160819221631_add_index_to_note_discussion_id.rb b/db/migrate/20160819221631_add_index_to_note_discussion_id.rb deleted file mode 100644 index 1dbc0474fd2..00000000000 --- a/db/migrate/20160819221631_add_index_to_note_discussion_id.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexToNoteDiscussionId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :notes, :discussion_id - end - - def down - remove_index :notes, :discussion_id if index_exists? :notes, :discussion_id - end -end diff --git a/db/migrate/20160819221833_reset_diff_note_discussion_id_because_it_was_calculated_wrongly.rb b/db/migrate/20160819221833_reset_diff_note_discussion_id_because_it_was_calculated_wrongly.rb deleted file mode 100644 index 61f593a52c5..00000000000 --- a/db/migrate/20160819221833_reset_diff_note_discussion_id_because_it_was_calculated_wrongly.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ResetDiffNoteDiscussionIdBecauseItWasCalculatedWrongly < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - execute "UPDATE notes SET discussion_id = NULL WHERE discussion_id IS NOT NULL AND type = 'DiffNote'" - end -end diff --git a/db/migrate/20160819232256_add_incoming_email_token_to_users.rb b/db/migrate/20160819232256_add_incoming_email_token_to_users.rb deleted file mode 100644 index 0a7190f632d..00000000000 --- a/db/migrate/20160819232256_add_incoming_email_token_to_users.rb +++ /dev/null @@ -1,24 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIncomingEmailTokenToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :users, :incoming_email_token, :string - - add_concurrent_index :users, :incoming_email_token - end - - def down - remove_index :users, :incoming_email_token if index_exists? :users, :incoming_email_token - - remove_column :users, :incoming_email_token - end -end diff --git a/db/migrate/20160823081327_change_merge_error_to_text.rb b/db/migrate/20160823081327_change_merge_error_to_text.rb deleted file mode 100644 index 23b4f35a776..00000000000 --- a/db/migrate/20160823081327_change_merge_error_to_text.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ChangeMergeErrorToText < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration requires downtime because it alters a column from varchar(255) to text.' - - def change - change_column :merge_requests, :merge_error, :text, limit: 65535 - end -end diff --git a/db/migrate/20160823083941_add_column_scopes_to_personal_access_tokens.rb b/db/migrate/20160823083941_add_column_scopes_to_personal_access_tokens.rb deleted file mode 100644 index 4c320123088..00000000000 --- a/db/migrate/20160823083941_add_column_scopes_to_personal_access_tokens.rb +++ /dev/null @@ -1,19 +0,0 @@ -# The default needs to be `[]`, but all existing access tokens need to have `scopes` set to `['api']`. -# It's easier to achieve this by adding the column with the `['api']` default, and then changing the default to -# `[]`. - -class AddColumnScopesToPersonalAccessTokens < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :personal_access_tokens, :scopes, :string, default: ['api'].to_yaml - end - - def down - remove_column :personal_access_tokens, :scopes - end -end diff --git a/db/migrate/20160823213309_add_lfs_enabled_to_projects.rb b/db/migrate/20160823213309_add_lfs_enabled_to_projects.rb deleted file mode 100644 index 87e6e8b6945..00000000000 --- a/db/migrate/20160823213309_add_lfs_enabled_to_projects.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLfsEnabledToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :projects, :lfs_enabled, :boolean - end -end diff --git a/db/migrate/20160824103857_drop_unused_ci_tables.rb b/db/migrate/20160824103857_drop_unused_ci_tables.rb deleted file mode 100644 index 8a207683848..00000000000 --- a/db/migrate/20160824103857_drop_unused_ci_tables.rb +++ /dev/null @@ -1,11 +0,0 @@ -class DropUnusedCiTables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - drop_table(:ci_services) - drop_table(:ci_web_hooks) - end -end diff --git a/db/migrate/20160824124900_add_table_issue_metrics.rb b/db/migrate/20160824124900_add_table_issue_metrics.rb deleted file mode 100644 index 4f34f377e22..00000000000 --- a/db/migrate/20160824124900_add_table_issue_metrics.rb +++ /dev/null @@ -1,37 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -# rubocop:disable Migration/Timestamps -class AddTableIssueMetrics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Adding foreign key' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - create_table :issue_metrics do |t| - t.references :issue, index: { name: "index_issue_metrics" }, foreign_key: { on_delete: :cascade }, null: false - - t.datetime 'first_mentioned_in_commit_at' - t.datetime 'first_associated_with_milestone_at' - t.datetime 'first_added_to_board_at' - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160825052008_add_table_merge_request_metrics.rb b/db/migrate/20160825052008_add_table_merge_request_metrics.rb deleted file mode 100644 index 150f698869d..00000000000 --- a/db/migrate/20160825052008_add_table_merge_request_metrics.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -# rubocop:disable Migration/Timestamps -class AddTableMergeRequestMetrics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Adding foreign key' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - create_table :merge_request_metrics do |t| - t.references :merge_request, index: { name: "index_merge_request_metrics" }, foreign_key: { on_delete: :cascade }, null: false - - t.datetime 'latest_build_started_at' - t.datetime 'latest_build_finished_at' - t.datetime 'first_deployed_to_production_at', index: true - t.datetime 'merged_at' - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160827011312_ensure_lock_version_has_no_default.rb b/db/migrate/20160827011312_ensure_lock_version_has_no_default.rb deleted file mode 100644 index 18c0f0be3eb..00000000000 --- a/db/migrate/20160827011312_ensure_lock_version_has_no_default.rb +++ /dev/null @@ -1,16 +0,0 @@ -class EnsureLockVersionHasNoDefault < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - change_column_default :issues, :lock_version, nil - change_column_default :merge_requests, :lock_version, nil - - execute('UPDATE issues SET lock_version = 1 WHERE lock_version = 0') - execute('UPDATE merge_requests SET lock_version = 1 WHERE lock_version = 0') - end - - def down - end -end diff --git a/db/migrate/20160829114652_add_markdown_cache_columns.rb b/db/migrate/20160829114652_add_markdown_cache_columns.rb deleted file mode 100644 index b1c5e38c3c4..00000000000 --- a/db/migrate/20160829114652_add_markdown_cache_columns.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddMarkdownCacheColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - COLUMNS = { - abuse_reports: [:message], - appearances: [:description], - application_settings: [ - :sign_in_text, - :help_page_text, - :shared_runners_text, - :after_sign_up_text - ], - broadcast_messages: [:message], - issues: [:title, :description], - labels: [:description], - merge_requests: [:title, :description], - milestones: [:title, :description], - namespaces: [:description], - notes: [:note], - projects: [:description], - releases: [:description], - snippets: [:title, :content] - }.freeze - - def change - COLUMNS.each do |table, columns| - columns.each do |column| - add_column table, "#{column}_html", :text - end - end - end -end diff --git a/db/migrate/20160830203109_add_confidential_issues_events_to_web_hooks.rb b/db/migrate/20160830203109_add_confidential_issues_events_to_web_hooks.rb deleted file mode 100644 index 771a6b84648..00000000000 --- a/db/migrate/20160830203109_add_confidential_issues_events_to_web_hooks.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddConfidentialIssuesEventsToWebHooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :web_hooks, :confidential_issues_events, :boolean, default: false, allow_null: false - end - - def down - remove_column :web_hooks, :confidential_issues_events - end -end diff --git a/db/migrate/20160830211132_add_confidential_issues_events_to_services.rb b/db/migrate/20160830211132_add_confidential_issues_events_to_services.rb deleted file mode 100644 index a1807264341..00000000000 --- a/db/migrate/20160830211132_add_confidential_issues_events_to_services.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddConfidentialIssuesEventsToServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :services, :confidential_issues_events, :boolean, default: true, allow_null: false - end - - def down - remove_column :services, :confidential_issues_events - end -end diff --git a/db/migrate/20160830232601_change_lock_version_not_null.rb b/db/migrate/20160830232601_change_lock_version_not_null.rb deleted file mode 100644 index 1e34b57e53f..00000000000 --- a/db/migrate/20160830232601_change_lock_version_not_null.rb +++ /dev/null @@ -1,13 +0,0 @@ -class ChangeLockVersionNotNull < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - change_column_null :issues, :lock_version, true - change_column_null :merge_requests, :lock_version, true - end - - def down - end -end diff --git a/db/migrate/20160831214002_create_project_features.rb b/db/migrate/20160831214002_create_project_features.rb deleted file mode 100644 index e1e61c3a4a2..00000000000 --- a/db/migrate/20160831214002_create_project_features.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateProjectFeatures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :project_features do |t| - t.belongs_to :project, index: true - t.integer :merge_requests_access_level - t.integer :issues_access_level - t.integer :wiki_access_level - t.integer :snippets_access_level - t.integer :builds_access_level - - t.timestamps null: true - end - end -end diff --git a/db/migrate/20160831214543_migrate_project_features.rb b/db/migrate/20160831214543_migrate_project_features.rb deleted file mode 100644 index ba7ffd7c9f2..00000000000 --- a/db/migrate/20160831214543_migrate_project_features.rb +++ /dev/null @@ -1,44 +0,0 @@ -class MigrateProjectFeatures < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = - <<-EOT.freeze - Migrating issues_enabled, merge_requests_enabled, wiki_enabled, builds_enabled, snippets_enabled fields from projects to - a new table called project_features. - EOT - - def up - sql = - %Q{ - INSERT INTO project_features(project_id, issues_access_level, merge_requests_access_level, wiki_access_level, - builds_access_level, snippets_access_level, created_at, updated_at) - SELECT - id AS project_id, - CASE WHEN issues_enabled IS true THEN 20 ELSE 0 END AS issues_access_level, - CASE WHEN merge_requests_enabled IS true THEN 20 ELSE 0 END AS merge_requests_access_level, - CASE WHEN wiki_enabled IS true THEN 20 ELSE 0 END AS wiki_access_level, - CASE WHEN builds_enabled IS true THEN 20 ELSE 0 END AS builds_access_level, - CASE WHEN snippets_enabled IS true THEN 20 ELSE 0 END AS snippets_access_level, - created_at, - updated_at - FROM projects - } - - execute(sql) - end - - def down - sql = %Q{ - UPDATE projects - SET - issues_enabled = COALESCE((SELECT CASE WHEN issues_access_level = 20 THEN true ELSE false END AS issues_enabled FROM project_features WHERE project_features.project_id = projects.id), true), - merge_requests_enabled = COALESCE((SELECT CASE WHEN merge_requests_access_level = 20 THEN true ELSE false END AS merge_requests_enabled FROM project_features WHERE project_features.project_id = projects.id),true), - wiki_enabled = COALESCE((SELECT CASE WHEN wiki_access_level = 20 THEN true ELSE false END AS wiki_enabled FROM project_features WHERE project_features.project_id = projects.id), true), - builds_enabled = COALESCE((SELECT CASE WHEN builds_access_level = 20 THEN true ELSE false END AS builds_enabled FROM project_features WHERE project_features.project_id = projects.id), true), - snippets_enabled = COALESCE((SELECT CASE WHEN snippets_access_level = 20 THEN true ELSE false END AS snippets_enabled FROM project_features WHERE project_features.project_id = projects.id),true) - } - - execute(sql) - end -end diff --git a/db/migrate/20160831223750_remove_features_enabled_from_projects.rb b/db/migrate/20160831223750_remove_features_enabled_from_projects.rb deleted file mode 100644 index 6d39d42882b..00000000000 --- a/db/migrate/20160831223750_remove_features_enabled_from_projects.rb +++ /dev/null @@ -1,31 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/UpdateLargeTable -class RemoveFeaturesEnabledFromProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - DOWNTIME_REASON = "Removing fields from database requires downtine." - - def up - remove_column :projects, :issues_enabled - remove_column :projects, :merge_requests_enabled - remove_column :projects, :builds_enabled - remove_column :projects, :wiki_enabled - remove_column :projects, :snippets_enabled - end - - # Ugly SQL but the only way i found to make it work on both Postgres and Mysql - # It will be slow but it is ok since it is a revert method - def down - add_column_with_default(:projects, :issues_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:projects, :merge_requests_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:projects, :builds_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:projects, :wiki_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:projects, :snippets_enabled, :boolean, default: true, allow_null: false) - end -end diff --git a/db/migrate/20160901141443_set_confidential_issues_events_on_webhooks.rb b/db/migrate/20160901141443_set_confidential_issues_events_on_webhooks.rb deleted file mode 100644 index 2921bb566c9..00000000000 --- a/db/migrate/20160901141443_set_confidential_issues_events_on_webhooks.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable Migration/UpdateColumnInBatches -class SetConfidentialIssuesEventsOnWebhooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:web_hooks, :confidential_issues_events, true) do |table, query| - query.where(table[:issues_events].eq(true)) - end - end - - def down - # noop - end -end diff --git a/db/migrate/20160901213340_add_lfs_enabled_to_namespaces.rb b/db/migrate/20160901213340_add_lfs_enabled_to_namespaces.rb deleted file mode 100644 index 1be5f3f6ab0..00000000000 --- a/db/migrate/20160901213340_add_lfs_enabled_to_namespaces.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLfsEnabledToNamespaces < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :namespaces, :lfs_enabled, :boolean - end -end diff --git a/db/migrate/20160902122721_drop_gitorious_field_from_application_settings.rb b/db/migrate/20160902122721_drop_gitorious_field_from_application_settings.rb deleted file mode 100644 index 6c2dc58876e..00000000000 --- a/db/migrate/20160902122721_drop_gitorious_field_from_application_settings.rb +++ /dev/null @@ -1,39 +0,0 @@ -class DropGitoriousFieldFromApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # After the deploy the caches will be cold anyway - DOWNTIME = false - - def up - require 'yaml' - - import_sources = connection.execute('SELECT import_sources FROM application_settings;') - return unless import_sources.first # support empty databases - - yaml = if Gitlab::Database.postgresql? - import_sources.values[0][0] - else - import_sources.first[0] - end - - yaml = YAML.safe_load(yaml) - yaml.delete 'gitorious' - - # No need for a WHERE clause as there is only one - connection.execute("UPDATE application_settings SET import_sources = #{update_yaml(yaml)}") - end - - def down - # noop, gitorious still yields a 404 anyway - end - - private - - def connection - ActiveRecord::Base.connection - end - - def update_yaml(yaml) - connection.quote(YAML.dump(yaml)) - end -end diff --git a/db/migrate/20160907131111_add_environment_type_to_environments.rb b/db/migrate/20160907131111_add_environment_type_to_environments.rb deleted file mode 100644 index 34463178fca..00000000000 --- a/db/migrate/20160907131111_add_environment_type_to_environments.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddEnvironmentTypeToEnvironments < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :environments, :environment_type, :string - end -end diff --git a/db/migrate/20160913162434_remove_projects_pushes_since_gc.rb b/db/migrate/20160913162434_remove_projects_pushes_since_gc.rb deleted file mode 100644 index 51650c68170..00000000000 --- a/db/migrate/20160913162434_remove_projects_pushes_since_gc.rb +++ /dev/null @@ -1,21 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/UpdateLargeTable -class RemoveProjectsPushesSinceGc < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration removes an existing column' - - disable_ddl_transaction! - - def up - remove_column :projects, :pushes_since_gc - end - - def down - add_column_with_default :projects, :pushes_since_gc, :integer, default: 0 - end -end diff --git a/db/migrate/20160913212128_change_artifacts_size_column.rb b/db/migrate/20160913212128_change_artifacts_size_column.rb deleted file mode 100644 index f2c2aaff9a8..00000000000 --- a/db/migrate/20160913212128_change_artifacts_size_column.rb +++ /dev/null @@ -1,15 +0,0 @@ -class ChangeArtifactsSizeColumn < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - - DOWNTIME_REASON = 'Changing an integer column size requires a full table rewrite.' - - def up - change_column :ci_builds, :artifacts_size, :integer, limit: 8 - end - - def down - # do nothing - end -end diff --git a/db/migrate/20160914131004_only_allow_merge_if_all_discussions_are_resolved.rb b/db/migrate/20160914131004_only_allow_merge_if_all_discussions_are_resolved.rb deleted file mode 100644 index 81511f9861b..00000000000 --- a/db/migrate/20160914131004_only_allow_merge_if_all_discussions_are_resolved.rb +++ /dev/null @@ -1,14 +0,0 @@ -class OnlyAllowMergeIfAllDiscussionsAreResolved < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - disable_ddl_transaction! - - def up - add_column :projects, :only_allow_merge_if_all_discussions_are_resolved, :boolean - end - - def down - remove_column(:projects, :only_allow_merge_if_all_discussions_are_resolved) - end -end diff --git a/db/migrate/20160915042921_create_merge_requests_closing_issues.rb b/db/migrate/20160915042921_create_merge_requests_closing_issues.rb deleted file mode 100644 index 3efe8c8901b..00000000000 --- a/db/migrate/20160915042921_create_merge_requests_closing_issues.rb +++ /dev/null @@ -1,35 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/Timestamps -class CreateMergeRequestsClosingIssues < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Adding foreign keys' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - create_table :merge_requests_closing_issues do |t| - t.references :merge_request, foreign_key: { on_delete: :cascade }, index: true, null: false - t.references :issue, foreign_key: { on_delete: :cascade }, index: true, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20160919144305_add_type_to_labels.rb b/db/migrate/20160919144305_add_type_to_labels.rb deleted file mode 100644 index f897646d264..00000000000 --- a/db/migrate/20160919144305_add_type_to_labels.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/UpdateColumnInBatches -class AddTypeToLabels < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Labels will not work as expected until this migration is complete.' - - disable_ddl_transaction! - - def change - add_column :labels, :type, :string - - update_column_in_batches(:labels, :type, 'ProjectLabel') do |table, query| - query.where(table[:project_id].not_eq(nil)) - end - end -end diff --git a/db/migrate/20160919145149_add_group_id_to_labels.rb b/db/migrate/20160919145149_add_group_id_to_labels.rb deleted file mode 100644 index df11a2fc4c8..00000000000 --- a/db/migrate/20160919145149_add_group_id_to_labels.rb +++ /dev/null @@ -1,20 +0,0 @@ -# rubocop:disable RemoveIndex -class AddGroupIdToLabels < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :labels, :group_id, :integer - add_foreign_key :labels, :namespaces, column: :group_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey - add_concurrent_index :labels, :group_id - end - - def down - remove_foreign_key :labels, column: :group_id - remove_index :labels, :group_id if index_exists? :labels, :group_id - remove_column :labels, :group_id - end -end diff --git a/db/migrate/20160920160832_add_index_to_labels_title.rb b/db/migrate/20160920160832_add_index_to_labels_title.rb deleted file mode 100644 index e6c87836d4e..00000000000 --- a/db/migrate/20160920160832_add_index_to_labels_title.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToLabelsTitle < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :labels, :title - end - - def down - remove_index :labels, :title if index_exists? :labels, :title - end -end diff --git a/db/migrate/20160926145521_add_organization_to_user.rb b/db/migrate/20160926145521_add_organization_to_user.rb deleted file mode 100644 index 2d8d907591d..00000000000 --- a/db/migrate/20160926145521_add_organization_to_user.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddOrganizationToUser < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :users, :organization, :string - end -end diff --git a/db/migrate/20161006104309_add_state_to_environment.rb b/db/migrate/20161006104309_add_state_to_environment.rb deleted file mode 100644 index c51dada9bca..00000000000 --- a/db/migrate/20161006104309_add_state_to_environment.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddStateToEnvironment < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:environments, :state, :string, default: :available) - end - - def down - remove_column(:environments, :state) - end -end diff --git a/db/migrate/20161007073613_create_user_activities.rb b/db/migrate/20161007073613_create_user_activities.rb deleted file mode 100644 index dc972bf4664..00000000000 --- a/db/migrate/20161007073613_create_user_activities.rb +++ /dev/null @@ -1,28 +0,0 @@ - -class CreateUserActivities < ActiveRecord::Migration[4.2] - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Adding foreign key'.freeze - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - create_table :user_activities do |t| - t.belongs_to :user, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.datetime :last_activity_at, null: false - end - end -end diff --git a/db/migrate/20161007133303_precalculate_trending_projects.rb b/db/migrate/20161007133303_precalculate_trending_projects.rb deleted file mode 100644 index c7a678c9d8f..00000000000 --- a/db/migrate/20161007133303_precalculate_trending_projects.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PrecalculateTrendingProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - create_table :trending_projects do |t| - t.references :project, index: true, foreign_key: { on_delete: :cascade }, null: false - end - - timestamp = connection.quote(1.month.ago) - - # We're hardcoding the visibility level (public) here so that if it ever - # changes this query doesn't suddenly use the new value (which may break - # later migrations). - visibility = 20 - - execute <<-EOF.strip_heredoc - INSERT INTO trending_projects (project_id) - SELECT project_id - FROM notes - INNER JOIN projects ON projects.id = notes.project_id - WHERE notes.created_at >= #{timestamp} - AND notes.system IS FALSE - AND projects.visibility_level = #{visibility} - GROUP BY project_id - ORDER BY count(*) DESC - LIMIT 100; - EOF - end - - def down - drop_table :trending_projects - end -end diff --git a/db/migrate/20161010142410_create_project_authorizations.rb b/db/migrate/20161010142410_create_project_authorizations.rb deleted file mode 100644 index b340a4ece19..00000000000 --- a/db/migrate/20161010142410_create_project_authorizations.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateProjectAuthorizations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :project_authorizations do |t| - t.references :user, foreign_key: { on_delete: :cascade } - t.references :project, foreign_key: { on_delete: :cascade } - t.integer :access_level - - t.index [:user_id, :project_id, :access_level], unique: true, name: 'index_project_authorizations_on_user_id_project_id_access_level' - end - end -end diff --git a/db/migrate/20161012180455_add_repository_access_level_to_project_feature.rb b/db/migrate/20161012180455_add_repository_access_level_to_project_feature.rb deleted file mode 100644 index 3024ea81ed8..00000000000 --- a/db/migrate/20161012180455_add_repository_access_level_to_project_feature.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AddRepositoryAccessLevelToProjectFeature < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:project_features, :repository_access_level, :integer, default: ProjectFeature::ENABLED) - end - - def down - remove_column :project_features, :repository_access_level - end -end diff --git a/db/migrate/20161014173530_create_label_priorities.rb b/db/migrate/20161014173530_create_label_priorities.rb deleted file mode 100644 index c7d60caa7d1..00000000000 --- a/db/migrate/20161014173530_create_label_priorities.rb +++ /dev/null @@ -1,26 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateLabelPriorities < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration adds foreign keys' - - disable_ddl_transaction! - - def up - create_table :label_priorities do |t| - t.references :project, foreign_key: { on_delete: :cascade }, null: false - t.references :label, foreign_key: { on_delete: :cascade }, null: false - t.integer :priority, null: false - - t.timestamps null: false - end - - add_concurrent_index :label_priorities, [:project_id, :label_id], unique: true - add_concurrent_index :label_priorities, :priority - end - - def down - drop_table :label_priorities - end -end diff --git a/db/migrate/20161017091941_add_authorized_projects_populated_to_users.rb b/db/migrate/20161017091941_add_authorized_projects_populated_to_users.rb deleted file mode 100644 index 11f4fa1a1f7..00000000000 --- a/db/migrate/20161017091941_add_authorized_projects_populated_to_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddAuthorizedProjectsPopulatedToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :users, :authorized_projects_populated, :boolean - end -end diff --git a/db/migrate/20161017095000_add_properties_to_deployment.rb b/db/migrate/20161017095000_add_properties_to_deployment.rb deleted file mode 100644 index 31bd4cd24ad..00000000000 --- a/db/migrate/20161017095000_add_properties_to_deployment.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddPropertiesToDeployment < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :deployments, :on_stop, :string - end -end diff --git a/db/migrate/20161017125927_add_unique_index_to_labels.rb b/db/migrate/20161017125927_add_unique_index_to_labels.rb deleted file mode 100644 index b5326789f52..00000000000 --- a/db/migrate/20161017125927_add_unique_index_to_labels.rb +++ /dev/null @@ -1,33 +0,0 @@ -# rubocop:disable RemoveIndex -class AddUniqueIndexToLabels < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration removes duplicated labels.' - - disable_ddl_transaction! - - def up - select_all('SELECT title, project_id, COUNT(id) as cnt FROM labels GROUP BY project_id, title HAVING COUNT(id) > 1').each do |label| - label_title = quote_string(label['title']) - duplicated_ids = select_all("SELECT id FROM labels WHERE project_id = #{label['project_id']} AND title = '#{label_title}' ORDER BY id ASC").map { |label| label['id'] } - label_id = duplicated_ids.first - duplicated_ids.delete(label_id) - - execute("UPDATE label_links SET label_id = #{label_id} WHERE label_id IN(#{duplicated_ids.join(",")})") - execute("DELETE FROM labels WHERE id IN(#{duplicated_ids.join(",")})") - end - - remove_index :labels, column: :project_id if index_exists?(:labels, :project_id) - remove_index :labels, column: :title if index_exists?(:labels, :title) - - add_concurrent_index :labels, [:group_id, :project_id, :title], unique: true - end - - def down - remove_index :labels, column: [:group_id, :project_id, :title] if index_exists?(:labels, [:group_id, :project_id, :title], unique: true) - - add_concurrent_index :labels, :project_id - add_concurrent_index :labels, :title - end -end diff --git a/db/migrate/20161018024215_migrate_labels_priority.rb b/db/migrate/20161018024215_migrate_labels_priority.rb deleted file mode 100644 index 3e2540c134c..00000000000 --- a/db/migrate/20161018024215_migrate_labels_priority.rb +++ /dev/null @@ -1,36 +0,0 @@ -class MigrateLabelsPriority < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Prioritized labels will not work as expected until this migration is complete.' - - disable_ddl_transaction! - - def up - execute <<-EOF.strip_heredoc - INSERT INTO label_priorities (project_id, label_id, priority, created_at, updated_at) - SELECT labels.project_id, labels.id, labels.priority, NOW(), NOW() - FROM labels - WHERE labels.project_id IS NOT NULL - AND labels.priority IS NOT NULL; - EOF - end - - def down - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE labels - INNER JOIN label_priorities ON labels.id = label_priorities.label_id AND labels.project_id = label_priorities.project_id - SET labels.priority = label_priorities.priority; - EOF - else - execute <<-EOF.strip_heredoc - UPDATE labels - SET priority = label_priorities.priority - FROM label_priorities - WHERE labels.id = label_priorities.label_id - AND labels.project_id = label_priorities.project_id; - EOF - end - end -end diff --git a/db/migrate/20161018024550_remove_priority_from_labels.rb b/db/migrate/20161018024550_remove_priority_from_labels.rb deleted file mode 100644 index e164d959bdf..00000000000 --- a/db/migrate/20161018024550_remove_priority_from_labels.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -class RemovePriorityFromLabels < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration removes an existing column' - - disable_ddl_transaction! - - def up - remove_column :labels, :priority, :integer, index: true - end - - def down - add_column :labels, :priority, :integer - add_concurrent_index :labels, :priority - end -end diff --git a/db/migrate/20161018124658_make_project_owners_masters.rb b/db/migrate/20161018124658_make_project_owners_masters.rb deleted file mode 100644 index 132c17388dc..00000000000 --- a/db/migrate/20161018124658_make_project_owners_masters.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable Migration/UpdateColumnInBatches -class MakeProjectOwnersMasters < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:members, :access_level, 40) do |table, query| - query.where(table[:access_level].eq(50).and(table[:source_type].eq('Project'))) - end - end - - def down - # do nothing - end -end diff --git a/db/migrate/20161019190736_migrate_sidekiq_queues_from_default.rb b/db/migrate/20161019190736_migrate_sidekiq_queues_from_default.rb deleted file mode 100644 index fc6d9784638..00000000000 --- a/db/migrate/20161019190736_migrate_sidekiq_queues_from_default.rb +++ /dev/null @@ -1,109 +0,0 @@ -require 'json' - -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateSidekiqQueuesFromDefault < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - - DOWNTIME_REASON = <<-EOF - Moving Sidekiq jobs from queues requires Sidekiq to be stopped. Not stopping - Sidekiq will result in the loss of jobs that are scheduled after this - migration completes. - EOF - - disable_ddl_transaction! - - # Jobs for which the queue names have been changed (e.g. multiple workers - # using the same non-default queue). - # - # The keys are the old queue names, the values the jobs to move and their new - # queue names. - RENAMED_QUEUES = { - gitlab_shell: { - 'GitGarbageCollectorWorker' => :git_garbage_collector, - 'ProjectExportWorker' => :project_export, - 'RepositoryForkWorker' => :repository_fork, - 'RepositoryImportWorker' => :repository_import - }, - project_web_hook: { - 'ProjectServiceWorker' => :project_service - }, - incoming_email: { - 'EmailReceiverWorker' => :email_receiver - }, - mailers: { - 'EmailsOnPushWorker' => :emails_on_push - }, - default: { - 'AdminEmailWorker' => :cronjob, - 'BuildCoverageWorker' => :build, - 'BuildEmailWorker' => :build, - 'BuildFinishedWorker' => :build, - 'BuildHooksWorker' => :build, - 'BuildSuccessWorker' => :build, - 'ClearDatabaseCacheWorker' => :clear_database_cache, - 'DeleteUserWorker' => :delete_user, - 'ExpireBuildArtifactsWorker' => :cronjob, - 'ExpireBuildInstanceArtifactsWorker' => :expire_build_instance_artifacts, - 'GroupDestroyWorker' => :group_destroy, - 'ImportExportProjectCleanupWorker' => :cronjob, - 'IrkerWorker' => :irker, - 'MergeWorker' => :merge, - 'NewNoteWorker' => :new_note, - 'PipelineHooksWorker' => :pipeline, - 'PipelineMetricsWorker' => :pipeline, - 'PipelineProcessWorker' => :pipeline, - 'PipelineSuccessWorker' => :pipeline, - 'PipelineUpdateWorker' => :pipeline, - 'ProjectCacheWorker' => :project_cache, - 'ProjectDestroyWorker' => :project_destroy, - 'PruneOldEventsWorker' => :cronjob, - 'RemoveExpiredGroupLinksWorker' => :cronjob, - 'RemoveExpiredMembersWorker' => :cronjob, - 'RepositoryArchiveCacheWorker' => :cronjob, - 'RepositoryCheck::BatchWorker' => :cronjob, - 'RepositoryCheck::ClearWorker' => :repository_check, - 'RepositoryCheck::SingleRepositoryWorker' => :repository_check, - 'RequestsProfilesWorker' => :cronjob, - 'StuckCiBuildsWorker' => :cronjob, - 'UpdateMergeRequestsWorker' => :update_merge_requests - } - }.freeze - - def up - Sidekiq.redis do |redis| - RENAMED_QUEUES.each do |queue, jobs| - migrate_from_queue(redis, queue, jobs) - end - end - end - - def down - Sidekiq.redis do |redis| - RENAMED_QUEUES.each do |dest_queue, jobs| - jobs.each do |worker, from_queue| - migrate_from_queue(redis, from_queue, worker => dest_queue) - end - end - end - end - - def migrate_from_queue(redis, queue, job_mapping) - while job = redis.lpop("queue:#{queue}") - payload = JSON.parse(job) - new_queue = job_mapping[payload['class']] - - # If we have no target queue to migrate to we're probably dealing with - # some ancient job for which the worker no longer exists. In that case - # there's no sane option we can take, other than just dropping the job. - next unless new_queue - - payload['queue'] = new_queue - - redis.lpush("queue:#{new_queue}", JSON.dump(payload)) - end - end -end diff --git a/db/migrate/20161019213545_generate_project_feature_for_projects.rb b/db/migrate/20161019213545_generate_project_feature_for_projects.rb deleted file mode 100644 index 587bdf60f70..00000000000 --- a/db/migrate/20161019213545_generate_project_feature_for_projects.rb +++ /dev/null @@ -1,28 +0,0 @@ -class GenerateProjectFeatureForProjects < ActiveRecord::Migration[4.2] - DOWNTIME = true - - DOWNTIME_REASON = <<-HEREDOC - Application was eager loading project_feature for all projects generating an extra query - everytime a project was fetched. We removed that behavior to avoid the extra query, this migration - makes sure all projects have a project_feature record associated. - HEREDOC - - def up - # Generate enabled values for each project feature 20, 20, 20, 20, 20 - # All features are enabled by default - enabled_values = [ProjectFeature::ENABLED] * 5 - - execute <<-EOF.strip_heredoc - INSERT INTO project_features - (project_id, merge_requests_access_level, builds_access_level, - issues_access_level, snippets_access_level, wiki_access_level) - (SELECT projects.id, #{enabled_values.join(',')} FROM projects LEFT OUTER JOIN project_features - ON project_features.project_id = projects.id - WHERE project_features.id IS NULL) - EOF - end - - def down - "Not needed" - end -end diff --git a/db/migrate/20161020075734_default_request_access_groups.rb b/db/migrate/20161020075734_default_request_access_groups.rb deleted file mode 100644 index 72aec86167e..00000000000 --- a/db/migrate/20161020075734_default_request_access_groups.rb +++ /dev/null @@ -1,12 +0,0 @@ -class DefaultRequestAccessGroups < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - def up - change_column_default :namespaces, :request_access_enabled, false - end - - def down - change_column_default :namespaces, :request_access_enabled, true - end -end diff --git a/db/migrate/20161020075830_default_request_access_projects.rb b/db/migrate/20161020075830_default_request_access_projects.rb deleted file mode 100644 index b457e39f838..00000000000 --- a/db/migrate/20161020075830_default_request_access_projects.rb +++ /dev/null @@ -1,12 +0,0 @@ -class DefaultRequestAccessProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - def up - change_column_default :projects, :request_access_enabled, false - end - - def down - change_column_default :projects, :request_access_enabled, true - end -end diff --git a/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb b/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb deleted file mode 100644 index 60352363e42..00000000000 --- a/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb +++ /dev/null @@ -1,40 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddPipelineIdToMergeRequestMetrics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Adding a foreign key' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - add_column :merge_request_metrics, :pipeline_id, :integer - add_foreign_key :merge_request_metrics, :ci_commits, column: :pipeline_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey - add_concurrent_index :merge_request_metrics, :pipeline_id - end - - def down - remove_foreign_key :merge_request_metrics, column: :pipeline_id - remove_index :merge_request_metrics, :pipeline_id if index_exists? :merge_request_metrics, :pipeline_id - remove_column :merge_request_metrics, :pipeline_id - end -end diff --git a/db/migrate/20161020180657_add_minimum_key_length_to_application_settings.rb b/db/migrate/20161020180657_add_minimum_key_length_to_application_settings.rb deleted file mode 100644 index 7839bee6a5b..00000000000 --- a/db/migrate/20161020180657_add_minimum_key_length_to_application_settings.rb +++ /dev/null @@ -1,29 +0,0 @@ -class AddMinimumKeyLengthToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # A key restriction has these possible states: - # - # * -1 means "this key type is completely disabled" - # * 0 means "all keys of this type are valid" - # * > 0 means "keys must have at least this many bits to be valid" - # - # The default is 0, for backward compatibility - add_column_with_default :application_settings, :rsa_key_restriction, :integer, default: 0 - add_column_with_default :application_settings, :dsa_key_restriction, :integer, default: 0 - add_column_with_default :application_settings, :ecdsa_key_restriction, :integer, default: 0 - add_column_with_default :application_settings, :ed25519_key_restriction, :integer, default: 0 - end - - def down - remove_column :application_settings, :rsa_key_restriction - remove_column :application_settings, :dsa_key_restriction - remove_column :application_settings, :ecdsa_key_restriction - remove_column :application_settings, :ed25519_key_restriction - end -end diff --git a/db/migrate/20161021114307_add_lock_version_to_build_and_pipelines.rb b/db/migrate/20161021114307_add_lock_version_to_build_and_pipelines.rb deleted file mode 100644 index e172dc3adf2..00000000000 --- a/db/migrate/20161021114307_add_lock_version_to_build_and_pipelines.rb +++ /dev/null @@ -1,14 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLockVersionToBuildAndPipelines < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :ci_builds, :lock_version, :integer - add_column :ci_commits, :lock_version, :integer - end -end diff --git a/db/migrate/20161024042317_migrate_mailroom_queue_from_default.rb b/db/migrate/20161024042317_migrate_mailroom_queue_from_default.rb deleted file mode 100644 index d27f8fc38c8..00000000000 --- a/db/migrate/20161024042317_migrate_mailroom_queue_from_default.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'json' - -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateMailroomQueueFromDefault < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - - DOWNTIME_REASON = <<-EOF - Moving Sidekiq jobs from queues requires Sidekiq to be stopped. Not stopping - Sidekiq will result in the loss of jobs that are scheduled after this - migration completes. - EOF - - disable_ddl_transaction! - - # Jobs for which the queue names have been changed (e.g. multiple workers - # using the same non-default queue). - # - # The keys are the old queue names, the values the jobs to move and their new - # queue names. - RENAMED_QUEUES = { - incoming_email: { - 'EmailReceiverWorker' => :email_receiver - } - }.freeze - - def up - Sidekiq.redis do |redis| - RENAMED_QUEUES.each do |queue, jobs| - migrate_from_queue(redis, queue, jobs) - end - end - end - - def down - Sidekiq.redis do |redis| - RENAMED_QUEUES.each do |dest_queue, jobs| - jobs.each do |worker, from_queue| - migrate_from_queue(redis, from_queue, worker => dest_queue) - end - end - end - end - - def migrate_from_queue(redis, queue, job_mapping) - while job = redis.lpop("queue:#{queue}") - payload = JSON.parse(job) - new_queue = job_mapping[payload['class']] - - # If we have no target queue to migrate to we're probably dealing with - # some ancient job for which the worker no longer exists. In that case - # there's no sane option we can take, other than just dropping the job. - next unless new_queue - - payload['queue'] = new_queue - - redis.lpush("queue:#{new_queue}", JSON.dump(payload)) - end - end -end diff --git a/db/migrate/20161025231710_migrate_jira_to_gem.rb b/db/migrate/20161025231710_migrate_jira_to_gem.rb deleted file mode 100644 index aa1c59ec9e6..00000000000 --- a/db/migrate/20161025231710_migrate_jira_to_gem.rb +++ /dev/null @@ -1,73 +0,0 @@ -class MigrateJiraToGem < ActiveRecord::Migration[4.2] - DOWNTIME = true - - DOWNTIME_REASON = <<-HEREDOC - Refactor all Jira services properties(serialized field) to use new jira-ruby gem. - There were properties on old Jira service that are not needed anymore after the - service refactoring: api_url, project_url, new_issue_url, issues_url. - We extract the new necessary some properties from old keys and delete them: - taking project_key from project_url and url from api_url - HEREDOC - - def up - active_services_query = "SELECT id, properties FROM services WHERE services.type IN ('JiraService') AND services.active = true" - - select_all(active_services_query).each do |service| - id = service['id'] - properties = JSON.parse(service['properties']) - properties_was = properties.clone - - # Migrate `project_url` to `project_key` - # Ignore if `project_url` doesn't have jql project query with project key - if properties['project_url'].present? - jql = properties['project_url'].match('project=([A-Za-z]*)') - properties['project_key'] = jql.captures.first if jql - end - - # Migrate `api_url` to `url` - if properties['api_url'].present? - url = properties['api_url'].match('(.*)\/rest\/api') - properties['url'] = url.captures.first if url - end - - # Delete now unnecessary properties - properties.delete('api_url') - properties.delete('project_url') - properties.delete('new_issue_url') - properties.delete('issues_url') - - # Update changes properties - if properties != properties_was - execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}") - end - end - end - - def down - active_services_query = "SELECT id, properties FROM services WHERE services.type IN ('JiraService') AND services.active = true" - - select_all(active_services_query).each do |service| - id = service['id'] - properties = JSON.parse(service['properties']) - properties_was = properties.clone - - # Rebuild old properties based on sane defaults - if properties['url'].present? - properties['api_url'] = "#{properties['url']}/rest/api/2" - properties['project_url'] = - "#{properties['url']}/issues/?jql=project=#{properties['project_key']}" - properties['issues_url'] = "#{properties['url']}/browse/:id" - properties['new_issue_url'] = "#{properties['url']}/secure/CreateIssue.jspa" - end - - # Delete the new properties - properties.delete('url') - properties.delete('project_key') - - # Update changes properties - if properties != properties_was - execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}") - end - end - end -end diff --git a/db/migrate/20161031155516_add_housekeeping_to_application_settings.rb b/db/migrate/20161031155516_add_housekeeping_to_application_settings.rb deleted file mode 100644 index 963358fe3e5..00000000000 --- a/db/migrate/20161031155516_add_housekeeping_to_application_settings.rb +++ /dev/null @@ -1,32 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddHousekeepingToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - disable_ddl_transaction! - - def up - add_column_with_default(:application_settings, :housekeeping_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:application_settings, :housekeeping_bitmaps_enabled, :boolean, default: true, allow_null: false) - add_column_with_default(:application_settings, :housekeeping_incremental_repack_period, :integer, default: 10, allow_null: false) - add_column_with_default(:application_settings, :housekeeping_full_repack_period, :integer, default: 50, allow_null: false) - add_column_with_default(:application_settings, :housekeeping_gc_period, :integer, default: 200, allow_null: false) - end - - def down - remove_column(:application_settings, :housekeeping_enabled, :boolean, default: true, allow_null: false) - remove_column(:application_settings, :housekeeping_bitmaps_enabled, :boolean, default: true, allow_null: false) - remove_column(:application_settings, :housekeeping_incremental_repack_period, :integer, default: 10, allow_null: false) - remove_column(:application_settings, :housekeeping_full_repack_period, :integer, default: 50, allow_null: false) - remove_column(:application_settings, :housekeeping_gc_period, :integer, default: 200, allow_null: false) - end -end diff --git a/db/migrate/20161031171301_add_project_id_to_subscriptions.rb b/db/migrate/20161031171301_add_project_id_to_subscriptions.rb deleted file mode 100644 index 5fd10d9b359..00000000000 --- a/db/migrate/20161031171301_add_project_id_to_subscriptions.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddProjectIdToSubscriptions < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - add_column :subscriptions, :project_id, :integer - add_foreign_key :subscriptions, :projects, column: :project_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey - end - - def down - remove_foreign_key :subscriptions, column: :project_id - remove_column :subscriptions, :project_id - end -end diff --git a/db/migrate/20161031174110_migrate_subscriptions_project_id.rb b/db/migrate/20161031174110_migrate_subscriptions_project_id.rb deleted file mode 100644 index 7f4087fdcd3..00000000000 --- a/db/migrate/20161031174110_migrate_subscriptions_project_id.rb +++ /dev/null @@ -1,44 +0,0 @@ -class MigrateSubscriptionsProjectId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Subscriptions will not work as expected until this migration is complete.' - - def up - execute <<-EOF.strip_heredoc - UPDATE subscriptions - SET project_id = ( - SELECT issues.project_id - FROM issues - WHERE issues.id = subscriptions.subscribable_id - ) - WHERE subscriptions.subscribable_type = 'Issue'; - EOF - - execute <<-EOF.strip_heredoc - UPDATE subscriptions - SET project_id = ( - SELECT merge_requests.target_project_id - FROM merge_requests - WHERE merge_requests.id = subscriptions.subscribable_id - ) - WHERE subscriptions.subscribable_type = 'MergeRequest'; - EOF - - execute <<-EOF.strip_heredoc - UPDATE subscriptions - SET project_id = ( - SELECT projects.id - FROM labels INNER JOIN projects ON projects.id = labels.project_id - WHERE labels.id = subscriptions.subscribable_id - ) - WHERE subscriptions.subscribable_type = 'Label'; - EOF - end - - def down - execute <<-EOF.strip_heredoc - UPDATE subscriptions SET project_id = NULL; - EOF - end -end diff --git a/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb b/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb deleted file mode 100644 index 9005b42b41f..00000000000 --- a/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable RemoveIndex -class AddUniqueIndexToSubscriptions < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'This migration requires downtime because it changes a column to not accept null values.' - - disable_ddl_transaction! - - def up - add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id, :project_id], { unique: true, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' } - remove_index :subscriptions, name: 'subscriptions_user_id_and_ref_fields' if index_name_exists?(:subscriptions, 'subscriptions_user_id_and_ref_fields') - end - - def down - add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id], { unique: true, name: 'subscriptions_user_id_and_ref_fields' } - remove_index :subscriptions, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' if index_name_exists?(:subscriptions, 'index_subscriptions_on_subscribable_and_user_id_and_project_id') - end -end diff --git a/db/migrate/20161103171205_rename_repository_storage_column.rb b/db/migrate/20161103171205_rename_repository_storage_column.rb deleted file mode 100644 index d6050500e47..00000000000 --- a/db/migrate/20161103171205_rename_repository_storage_column.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameRepositoryStorageColumn < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Renaming the application_settings.repository_storage column' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - rename_column :application_settings, :repository_storage, :repository_storages - end -end diff --git a/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb b/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb deleted file mode 100644 index 83c51c83509..00000000000 --- a/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb +++ /dev/null @@ -1,32 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/SaferBooleanColumn -class AddSidekiqThrottlingToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :application_settings, :sidekiq_throttling_enabled, :boolean, default: false - add_column :application_settings, :sidekiq_throttling_queues, :string - add_column :application_settings, :sidekiq_throttling_factor, :decimal - end -end diff --git a/db/migrate/20161106185620_add_project_import_data_project_index.rb b/db/migrate/20161106185620_add_project_import_data_project_index.rb deleted file mode 100644 index 46809ca1707..00000000000 --- a/db/migrate/20161106185620_add_project_import_data_project_index.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable RemoveIndex -class AddProjectImportDataProjectIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :project_import_data, :project_id - end - - def down - remove_index :project_import_data, :project_id if index_exists? :project_import_data, :project_id - end -end diff --git a/db/migrate/20161113184239_create_user_chat_names_table.rb b/db/migrate/20161113184239_create_user_chat_names_table.rb deleted file mode 100644 index 0031ca66afe..00000000000 --- a/db/migrate/20161113184239_create_user_chat_names_table.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateUserChatNamesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :chat_names do |t| - t.integer :user_id, null: false - t.integer :service_id, null: false - t.string :team_id, null: false - t.string :team_domain - t.string :chat_id, null: false - t.string :chat_name - t.datetime :last_used_at - t.timestamps null: false - end - - add_index :chat_names, [:user_id, :service_id], unique: true - add_index :chat_names, [:service_id, :team_id, :chat_id], unique: true - end -end diff --git a/db/migrate/20161114024742_add_coverage_regex_to_builds.rb b/db/migrate/20161114024742_add_coverage_regex_to_builds.rb deleted file mode 100644 index 631968b4aee..00000000000 --- a/db/migrate/20161114024742_add_coverage_regex_to_builds.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddCoverageRegexToBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :ci_builds, :coverage_regex, :string - end -end diff --git a/db/migrate/20161118183841_add_commit_events_to_services.rb b/db/migrate/20161118183841_add_commit_events_to_services.rb deleted file mode 100644 index 0eb08915118..00000000000 --- a/db/migrate/20161118183841_add_commit_events_to_services.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddCommitEventsToServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:services, :commit_events, :boolean, default: true, allow_null: false) - end - - def down - remove_column(:services, :commit_events) - end -end diff --git a/db/migrate/20161124111390_add_parent_id_to_namespace.rb b/db/migrate/20161124111390_add_parent_id_to_namespace.rb deleted file mode 100644 index 67f6aee2b9c..00000000000 --- a/db/migrate/20161124111390_add_parent_id_to_namespace.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddParentIdToNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:namespaces, :parent_id, :integer) - end -end diff --git a/db/migrate/20161124111395_add_index_to_parent_id.rb b/db/migrate/20161124111395_add_index_to_parent_id.rb deleted file mode 100644 index d7a51ec905a..00000000000 --- a/db/migrate/20161124111395_add_index_to_parent_id.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexToParentId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:namespaces, [:parent_id, :id], unique: true) - end - - def down - remove_index :namespaces, [:parent_id, :id] if index_exists? :namespaces, [:parent_id, :id] - end -end diff --git a/db/migrate/20161124111402_add_routes_table.rb b/db/migrate/20161124111402_add_routes_table.rb deleted file mode 100644 index 36f49ef8c97..00000000000 --- a/db/migrate/20161124111402_add_routes_table.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/Timestamps -class AddRoutesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :routes do |t| - t.integer :source_id, null: false - t.string :source_type, null: false - t.string :path, null: false - - t.timestamps - end - end -end diff --git a/db/migrate/20161124141322_migrate_process_commit_worker_jobs.rb b/db/migrate/20161124141322_migrate_process_commit_worker_jobs.rb deleted file mode 100644 index 0772821210c..00000000000 --- a/db/migrate/20161124141322_migrate_process_commit_worker_jobs.rb +++ /dev/null @@ -1,105 +0,0 @@ -class MigrateProcessCommitWorkerJobs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - class Repository - attr_reader :storage - - def initialize(storage, relative_path) - @storage = storage - @relative_path = relative_path - end - - def gitaly_repository - Gitaly::Repository.new(storage_name: @storage, relative_path: @relative_path) - end - end - - class Project < ActiveRecord::Base - def self.find_including_path(id) - select("projects.*, CONCAT(namespaces.path, '/', projects.path) AS path_with_namespace") - .joins('INNER JOIN namespaces ON namespaces.id = projects.namespace_id') - .find_by(id: id) - end - - def commit(rev) - Gitlab::GitalyClient::CommitService.new(repository).find_commit(rev) - end - - def repository - @repository ||= Repository.new(repository_storage, read_attribute(:path_with_namespace) + '.git') - end - end - - DOWNTIME = true - DOWNTIME_REASON = 'Existing workers will error until they are using a newer version of the code' - - disable_ddl_transaction! - - def up - Sidekiq.redis do |redis| - new_jobs = [] - - while job = redis.lpop('queue:process_commit') - payload = JSON.parse(job) - project = Project.find_including_path(payload['args'][0]) - - next unless project - - commit = project.commit(payload['args'][2]) - next unless commit - - hash = { - id: commit.id, - message: encode(commit.body), - parent_ids: commit.parent_ids.to_a, - authored_date: Time.at(commit.author.date.seconds).utc, - author_name: encode(commit.author.name), - author_email: encode(commit.author.email), - committed_date: Time.at(commit.committer.date.seconds).utc, - committer_email: encode(commit.committer.email), - committer_name: encode(commit.committer.name) - } - - payload['args'][2] = hash - - new_jobs << JSON.dump(payload) - end - - redis.multi do |multi| - new_jobs.each do |j| - multi.lpush('queue:process_commit', j) - end - end - end - end - - def down - Sidekiq.redis do |redis| - new_jobs = [] - - while job = redis.lpop('queue:process_commit') - payload = JSON.parse(job) - - payload['args'][2] = payload['args'][2]['id'] - - new_jobs << JSON.dump(payload) - end - - redis.multi do |multi| - new_jobs.each do |j| - multi.lpush('queue:process_commit', j) - end - end - end - end - - def encode(data) - encoding = Encoding::UTF_8 - - if data.encoding == encoding - data - else - data.encode(encoding, invalid: :replace, undef: :replace) - end - end -end diff --git a/db/migrate/20161128095517_add_in_reply_to_discussion_id_to_sent_notifications.rb b/db/migrate/20161128095517_add_in_reply_to_discussion_id_to_sent_notifications.rb deleted file mode 100644 index a2971486014..00000000000 --- a/db/migrate/20161128095517_add_in_reply_to_discussion_id_to_sent_notifications.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddInReplyToDiscussionIdToSentNotifications < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :sent_notifications, :in_reply_to_discussion_id, :string - end -end diff --git a/db/migrate/20161128142110_remove_unnecessary_indexes.rb b/db/migrate/20161128142110_remove_unnecessary_indexes.rb deleted file mode 100644 index b6c6e303ec7..00000000000 --- a/db/migrate/20161128142110_remove_unnecessary_indexes.rb +++ /dev/null @@ -1,34 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class RemoveUnnecessaryIndexes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - remove_index :labels, column: :group_id if index_exists?(:labels, :group_id) - remove_index :award_emoji, column: :user_id if index_exists?(:award_emoji, :user_id) - remove_index :ci_builds, column: :commit_id if index_exists?(:ci_builds, :commit_id) - remove_index :deployments, column: :project_id if index_exists?(:deployments, :project_id) - remove_index :deployments, column: %w(project_id environment_id) if index_exists?(:deployments, %w(project_id environment_id)) - remove_index :lists, column: :board_id if index_exists?(:lists, :board_id) - remove_index :milestones, column: :project_id if index_exists?(:milestones, :project_id) - remove_index :notes, column: :project_id if index_exists?(:notes, :project_id) - remove_index :users_star_projects, column: :user_id if index_exists?(:users_star_projects, :user_id) - end - - def down - add_concurrent_index :labels, :group_id - add_concurrent_index :award_emoji, :user_id - add_concurrent_index :ci_builds, :commit_id - add_concurrent_index :deployments, :project_id - add_concurrent_index :deployments, %w(project_id environment_id) - add_concurrent_index :lists, :board_id - add_concurrent_index :milestones, :project_id - add_concurrent_index :notes, :project_id - add_concurrent_index :users_star_projects, :user_id - end -end diff --git a/db/migrate/20161128161412_add_html_emails_enabled_to_application_settings.rb b/db/migrate/20161128161412_add_html_emails_enabled_to_application_settings.rb deleted file mode 100644 index 63139eb97bd..00000000000 --- a/db/migrate/20161128161412_add_html_emails_enabled_to_application_settings.rb +++ /dev/null @@ -1,30 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/SaferBooleanColumn -class AddHtmlEmailsEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :application_settings, :html_emails_enabled, :boolean, default: true - end -end diff --git a/db/migrate/20161130095245_fill_routes_table.rb b/db/migrate/20161130095245_fill_routes_table.rb deleted file mode 100644 index 712be187c7c..00000000000 --- a/db/migrate/20161130095245_fill_routes_table.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class FillRoutesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'No new namespaces should be created during data copy' - - def up - execute <<-EOF - INSERT INTO routes - (source_id, source_type, path) - (SELECT id, 'Namespace', path FROM namespaces) - EOF - end - - def down - execute("DELETE FROM routes WHERE source_type = 'Namespace'") - end -end diff --git a/db/migrate/20161130101252_fill_projects_routes_table.rb b/db/migrate/20161130101252_fill_projects_routes_table.rb deleted file mode 100644 index 1900d6c8013..00000000000 --- a/db/migrate/20161130101252_fill_projects_routes_table.rb +++ /dev/null @@ -1,30 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class FillProjectsRoutesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'No new projects should be created during data copy' - - def up - if Gitlab::Database.postgresql? - execute <<-EOF - INSERT INTO routes (source_id, source_type, path) - (SELECT DISTINCT ON (namespaces.path, projects.path) projects.id, 'Project', concat(namespaces.path, '/', projects.path) - FROM projects INNER JOIN namespaces ON projects.namespace_id = namespaces.id - ORDER BY namespaces.path, projects.path, projects.id DESC) - EOF - else - execute <<-EOF - INSERT INTO routes (source_id, source_type, path) - (SELECT projects.id, 'Project', concat(namespaces.path, '/', projects.path) - FROM projects INNER JOIN namespaces ON projects.namespace_id = namespaces.id) - EOF - end - end - - def down - execute("DELETE FROM routes WHERE source_type = 'Project'") - end -end diff --git a/db/migrate/20161201001911_add_plant_uml_url_to_application_settings.rb b/db/migrate/20161201001911_add_plant_uml_url_to_application_settings.rb deleted file mode 100644 index 79558a6b3b9..00000000000 --- a/db/migrate/20161201001911_add_plant_uml_url_to_application_settings.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPlantUmlUrlToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :plantuml_url, :string - end -end diff --git a/db/migrate/20161201155511_create_project_statistics.rb b/db/migrate/20161201155511_create_project_statistics.rb deleted file mode 100644 index 6dcb5adb82b..00000000000 --- a/db/migrate/20161201155511_create_project_statistics.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateProjectStatistics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - # use bigint columns to support values >2GB - counter_column = { limit: 8, null: false, default: 0 } - - create_table :project_statistics do |t| - t.references :project, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.references :namespace, null: false, index: true - t.integer :commit_count, counter_column - t.integer :storage_size, counter_column - t.integer :repository_size, counter_column - t.integer :lfs_objects_size, counter_column - t.integer :build_artifacts_size, counter_column - end - end -end diff --git a/db/migrate/20161201160452_migrate_project_statistics.rb b/db/migrate/20161201160452_migrate_project_statistics.rb deleted file mode 100644 index 42c5be07e83..00000000000 --- a/db/migrate/20161201160452_migrate_project_statistics.rb +++ /dev/null @@ -1,25 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -class MigrateProjectStatistics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Removes two columns from the projects table' - - def up - # convert repository_size in float (megabytes) to integer (bytes), - # initialize total storage_size with repository_size - execute <<-EOF - INSERT INTO project_statistics (project_id, namespace_id, commit_count, storage_size, repository_size) - SELECT id, namespace_id, commit_count, (repository_size * 1024 * 1024), (repository_size * 1024 * 1024) FROM projects - EOF - - remove_column :projects, :repository_size - remove_column :projects, :commit_count - end - - # rubocop: disable Migration/AddColumn - def down - add_column :projects, :repository_size, :float, default: 0.0 - add_column :projects, :commit_count, :integer, default: 0 - end -end diff --git a/db/migrate/20161202152031_remove_duplicates_from_routes.rb b/db/migrate/20161202152031_remove_duplicates_from_routes.rb deleted file mode 100644 index 0615f683859..00000000000 --- a/db/migrate/20161202152031_remove_duplicates_from_routes.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDuplicatesFromRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - # We can skip this migration when running a PostgreSQL database because - # we use an optimized query in the "FillProjectsRoutesTable" migration - # to fill these values that avoid duplicate entries in the routes table. - return unless Gitlab::Database.mysql? - - execute <<-EOF - DELETE duplicated_rows.* - FROM routes AS duplicated_rows - INNER JOIN ( - SELECT path, MAX(id) as max_id - FROM routes - GROUP BY path - HAVING COUNT(*) > 1 - ) AS good_rows ON good_rows.path = duplicated_rows.path AND good_rows.max_id <> duplicated_rows.id; - EOF - end - - def down - end -end diff --git a/db/migrate/20161202152035_add_index_to_routes.rb b/db/migrate/20161202152035_add_index_to_routes.rb deleted file mode 100644 index ad2e0cd13c9..00000000000 --- a/db/migrate/20161202152035_add_index_to_routes.rb +++ /dev/null @@ -1,22 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexToRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:routes, :path, unique: true) - add_concurrent_index(:routes, [:source_type, :source_id], unique: true) - end - - def down - remove_index(:routes, :path) if index_exists? :routes, :path - remove_index(:routes, [:source_type, :source_id]) if index_exists? :routes, [:source_type, :source_id] - end -end diff --git a/db/migrate/20161206003819_add_plant_uml_enabled_to_application_settings.rb b/db/migrate/20161206003819_add_plant_uml_enabled_to_application_settings.rb deleted file mode 100644 index bb44d56ee56..00000000000 --- a/db/migrate/20161206003819_add_plant_uml_enabled_to_application_settings.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/SaferBooleanColumn -class AddPlantUmlEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :plantuml_enabled, :boolean - end -end diff --git a/db/migrate/20161206153749_remove_uniq_path_index_from_namespace.rb b/db/migrate/20161206153749_remove_uniq_path_index_from_namespace.rb deleted file mode 100644 index c301d76646e..00000000000 --- a/db/migrate/20161206153749_remove_uniq_path_index_from_namespace.rb +++ /dev/null @@ -1,37 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class RemoveUniqPathIndexFromNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - constraint_name = 'namespaces_path_key' - - transaction do - if index_exists?(:namespaces, :path) - remove_index(:namespaces, :path) - end - - # In some bizarre cases PostgreSQL might have a separate unique constraint - # that we'll need to drop. - if constraint_exists?(constraint_name) && Gitlab::Database.postgresql? - execute("ALTER TABLE namespaces DROP CONSTRAINT IF EXISTS #{constraint_name};") - end - end - end - - def down - unless index_exists?(:namespaces, :path) - add_concurrent_index(:namespaces, :path, unique: true) - end - end - - def constraint_exists?(name) - indexes(:namespaces).map(&:name).include?(name) - end -end diff --git a/db/migrate/20161206153751_add_path_index_to_namespace.rb b/db/migrate/20161206153751_add_path_index_to_namespace.rb deleted file mode 100644 index f0848cc59a5..00000000000 --- a/db/migrate/20161206153751_add_path_index_to_namespace.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddPathIndexToNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_concurrent_index :namespaces, :path - end - - def down - if index_exists?(:namespaces, :path) - remove_index :namespaces, :path - end - end -end diff --git a/db/migrate/20161206153753_remove_uniq_name_index_from_namespace.rb b/db/migrate/20161206153753_remove_uniq_name_index_from_namespace.rb deleted file mode 100644 index 13660cec7aa..00000000000 --- a/db/migrate/20161206153753_remove_uniq_name_index_from_namespace.rb +++ /dev/null @@ -1,37 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class RemoveUniqNameIndexFromNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - constraint_name = 'namespaces_name_key' - - transaction do - if index_exists?(:namespaces, :name) - remove_index(:namespaces, :name) - end - - # In some bizarre cases PostgreSQL might have a separate unique constraint - # that we'll need to drop. - if constraint_exists?(constraint_name) && Gitlab::Database.postgresql? - execute("ALTER TABLE namespaces DROP CONSTRAINT IF EXISTS #{constraint_name};") - end - end - end - - def down - unless index_exists?(:namespaces, :name) - add_concurrent_index(:namespaces, :name, unique: true) - end - end - - def constraint_exists?(name) - indexes(:namespaces).map(&:name).include?(name) - end -end diff --git a/db/migrate/20161206153754_add_name_index_to_namespace.rb b/db/migrate/20161206153754_add_name_index_to_namespace.rb deleted file mode 100644 index 14152a6dc07..00000000000 --- a/db/migrate/20161206153754_add_name_index_to_namespace.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddNameIndexToNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_concurrent_index(:namespaces, [:name, :parent_id], unique: true) - end - - def down - if index_exists?(:namespaces, [:name, :parent_id]) - remove_index :namespaces, [:name, :parent_id] - end - end -end diff --git a/db/migrate/20161207231620_fixup_environment_name_uniqueness.rb b/db/migrate/20161207231620_fixup_environment_name_uniqueness.rb deleted file mode 100644 index 420f0ccb45c..00000000000 --- a/db/migrate/20161207231620_fixup_environment_name_uniqueness.rb +++ /dev/null @@ -1,53 +0,0 @@ -class FixupEnvironmentNameUniqueness < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Renaming non-unique environments' - - def up - environments = Arel::Table.new(:environments) - - # Get all [project_id, name] pairs that occur more than once - finder_sql = environments - .group(environments[:project_id], environments[:name]) - .having(Arel.sql("COUNT(1)").gt(1)) - .project(environments[:project_id], environments[:name]) - .to_sql - - conflicting = connection.exec_query(finder_sql) - - conflicting.rows.each do |project_id, name| - fix_duplicates(project_id, name) - end - end - - def down - # Nothing to do - end - - # Rename conflicting environments by appending "-#{id}" to all but the first - def fix_duplicates(project_id, name) - environments = Arel::Table.new(:environments) - finder_sql = environments - .where(environments[:project_id].eq(project_id)) - .where(environments[:name].eq(name)) - .order(environments[:id].asc) - .project(environments[:id], environments[:name]) - .to_sql - - # Now we have the data for all the conflicting rows - conflicts = connection.exec_query(finder_sql).rows - conflicts.shift # Leave the first row alone - - conflicts.each do |id, name| - update_sql = - Arel::UpdateManager.new - .table(environments) - .set(environments[:name] => name + "-" + id.to_s) - .where(environments[:id].eq(id)) - .to_sql - - connection.exec_update(update_sql, self.class.name, []) - end - end -end diff --git a/db/migrate/20161207231621_create_environment_name_unique_index.rb b/db/migrate/20161207231621_create_environment_name_unique_index.rb deleted file mode 100644 index 28d22664405..00000000000 --- a/db/migrate/20161207231621_create_environment_name_unique_index.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable RemoveIndex -class CreateEnvironmentNameUniqueIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = true - DOWNTIME_REASON = 'Making a non-unique index into a unique index' - - def up - remove_index :environments, [:project_id, :name] - add_concurrent_index :environments, [:project_id, :name], unique: true - end - - def down - remove_index :environments, [:project_id, :name] - add_concurrent_index :environments, [:project_id, :name], unique: true - end -end diff --git a/db/migrate/20161207231626_add_environment_slug.rb b/db/migrate/20161207231626_add_environment_slug.rb deleted file mode 100644 index 993b9bd3330..00000000000 --- a/db/migrate/20161207231626_add_environment_slug.rb +++ /dev/null @@ -1,68 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddEnvironmentSlug < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Adding NOT NULL column environments.slug with dependent data' - - # Used to generate random suffixes for the slug - LETTERS = 'a'..'z' - NUMBERS = '0'..'9' - SUFFIX_CHARS = LETTERS.to_a + NUMBERS.to_a - - def up - environments = Arel::Table.new(:environments) - - add_column :environments, :slug, :string - finder = environments.project(:id, :name) - - connection.exec_query(finder.to_sql).rows.each do |id, name| - updater = Arel::UpdateManager.new - .table(environments) - .set(environments[:slug] => generate_slug(name)) - .where(environments[:id].eq(id)) - - connection.exec_update(updater.to_sql, self.class.name, []) - end - - change_column_null :environments, :slug, false - end - - def down - remove_column :environments, :slug - end - - # Copy of the Environment#generate_slug implementation - def generate_slug(name) - # Lowercase letters and numbers only - slugified = name.to_s.downcase.gsub(/[^a-z0-9]/, '-') - - # Must start with a letter - slugified = 'env-' + slugified unless LETTERS.cover?(slugified[0]) - - # Repeated dashes are invalid (OpenShift limitation) - slugified.gsub!(/\-+/, '-') - - # Maximum length: 24 characters (OpenShift limitation) - slugified = slugified[0..23] - - # Cannot end with a dash (Kubernetes label limitation) - slugified.chop! if slugified.end_with?('-') - - # Add a random suffix, shortening the current string if necessary, if it - # has been slugified. This ensures uniqueness. - if slugified != name - slugified = slugified[0..16] - slugified << '-' unless slugified.end_with?('-') - slugified << random_suffix - end - - slugified - end - - def random_suffix - (0..5).map { SUFFIX_CHARS.sample }.join - end -end diff --git a/db/migrate/20161209153400_add_unique_index_for_environment_slug.rb b/db/migrate/20161209153400_add_unique_index_for_environment_slug.rb deleted file mode 100644 index 57606a33cb9..00000000000 --- a/db/migrate/20161209153400_add_unique_index_for_environment_slug.rb +++ /dev/null @@ -1,20 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddUniqueIndexForEnvironmentSlug < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Adding a *unique* index to environments.slug' - - disable_ddl_transaction! - - def up - add_concurrent_index :environments, [:project_id, :slug], unique: true - end - - def down - remove_index :environments, [:project_id, :slug] if index_exists? :environments, [:project_id, :slug] - end -end diff --git a/db/migrate/20161209165216_create_doorkeeper_openid_connect_tables.rb b/db/migrate/20161209165216_create_doorkeeper_openid_connect_tables.rb deleted file mode 100644 index e8ea9cf8fda..00000000000 --- a/db/migrate/20161209165216_create_doorkeeper_openid_connect_tables.rb +++ /dev/null @@ -1,37 +0,0 @@ -class CreateDoorkeeperOpenidConnectTables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :oauth_openid_requests do |t| - t.integer :access_grant_id, null: false - t.string :nonce, null: false - end - - if Gitlab::Database.postgresql? - # add foreign key without validation to avoid downtime on PostgreSQL, - # also see db/post_migrate/20170209140523_validate_foreign_keys_on_oauth_openid_requests.rb - execute %q{ - ALTER TABLE "oauth_openid_requests" - ADD CONSTRAINT "fk_oauth_openid_requests_oauth_access_grants_access_grant_id" - FOREIGN KEY ("access_grant_id") - REFERENCES "oauth_access_grants" ("id") - NOT VALID; - } - else - execute %q{ - ALTER TABLE oauth_openid_requests - ADD CONSTRAINT fk_oauth_openid_requests_oauth_access_grants_access_grant_id - FOREIGN KEY (access_grant_id) - REFERENCES oauth_access_grants (id); - } - end - end - - def down - drop_table :oauth_openid_requests - end -end diff --git a/db/migrate/20161212142807_add_lower_path_index_to_routes.rb b/db/migrate/20161212142807_add_lower_path_index_to_routes.rb deleted file mode 100644 index 92a12dbc699..00000000000 --- a/db/migrate/20161212142807_add_lower_path_index_to_routes.rb +++ /dev/null @@ -1,23 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddLowerPathIndexToRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - execute 'CREATE INDEX CONCURRENTLY index_on_routes_lower_path ON routes (LOWER(path));' - end - - def down - return unless Gitlab::Database.postgresql? - - remove_index :routes, name: :index_on_routes_lower_path if index_exists?(:routes, name: :index_on_routes_lower_path) - end -end diff --git a/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb b/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb deleted file mode 100644 index babac6bfc4f..00000000000 --- a/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb +++ /dev/null @@ -1,11 +0,0 @@ -class ChangeSlackServiceToSlackNotificationService < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # This migration is a no-op, as it existed in an RC but we renamed - # SlackNotificationService back to SlackService: - # https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8191#note_20310845 - def change - end -end diff --git a/db/migrate/20161220141214_remove_dot_git_from_group_names.rb b/db/migrate/20161220141214_remove_dot_git_from_group_names.rb deleted file mode 100644 index 5c0b083325e..00000000000 --- a/db/migrate/20161220141214_remove_dot_git_from_group_names.rb +++ /dev/null @@ -1,82 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDotGitFromGroupNames < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - include Gitlab::ShellAdapter - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - invalid_groups.each do |group| - path_was = group['path'] - path_was_wildcard = quote_string("#{path_was}/%") - path = quote_string(rename_path(path_was)) - - move_namespace(group['id'], path_was, path) - - execute "UPDATE routes SET path = '#{path}' WHERE source_type = 'Namespace' AND source_id = #{group['id']}" - execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{group['id']}" - - select_all("SELECT id, path FROM routes WHERE path LIKE '#{path_was_wildcard}'").each do |route| - new_path = "#{path}/#{route['path'].split('/').last}" - execute "UPDATE routes SET path = '#{new_path}' WHERE id = #{route['id']}" - end - end - end - - def down - # nothing to do here - end - - private - - def invalid_groups - select_all("SELECT id, path FROM namespaces WHERE type = 'Group' AND path LIKE '%.git'") - end - - def route_exists?(path) - select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(path)}'").present? - end - - # Accepts invalid path like test.git and returns test_git or - # test_git1 if test_git already taken - def rename_path(path) - # To stay closer with original name and reduce risk of duplicates - # we rename suffix instead of removing it - path = path.sub(/\.git\z/, '_git') - - counter = 0 - base = path - - while route_exists?(path) - counter += 1 - path = "#{base}#{counter}" - end - - path - end - - def move_namespace(group_id, path_was, path) - repository_storages = select_all("SELECT distinct(repository_storage) FROM projects WHERE namespace_id = #{group_id}").map do |row| - row['repository_storage'] - end.compact - - # Move the namespace directory in all storages paths used by member projects - repository_storages.each do |repository_storage| - # Ensure old directory exists before moving it - gitlab_shell.add_namespace(repository_storage, path_was) - - unless gitlab_shell.mv_namespace(repository_storage, path_was, path) - Rails.logger.error "Exception moving on shard #{repository_storage} from #{path_was} to #{path}" - - # if we cannot move namespace directory we should rollback - # db changes in order to prevent out of sync between db and fs - raise Exception.new('namespace directory cannot be moved') - end - end - - Gitlab::UploadsTransfer.new.rename_namespace(path_was, path) - end -end diff --git a/db/migrate/20161221152132_add_last_used_at_to_key.rb b/db/migrate/20161221152132_add_last_used_at_to_key.rb deleted file mode 100644 index a5b3f2b6f4b..00000000000 --- a/db/migrate/20161221152132_add_last_used_at_to_key.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddLastUsedAtToKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :keys, :last_used_at, :datetime - end -end diff --git a/db/migrate/20161223034433_add_estimate_to_issuables_ce.rb b/db/migrate/20161223034433_add_estimate_to_issuables_ce.rb deleted file mode 100644 index 75bea41387c..00000000000 --- a/db/migrate/20161223034433_add_estimate_to_issuables_ce.rb +++ /dev/null @@ -1,25 +0,0 @@ -class AddEstimateToIssuablesCe < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - unless column_exists?(:issues, :time_estimate) - add_column :issues, :time_estimate, :integer - end - - unless column_exists?(:merge_requests, :time_estimate) - add_column :merge_requests, :time_estimate, :integer - end - end - - def down - if column_exists?(:issues, :time_estimate) - remove_column :issues, :time_estimate - end - - if column_exists?(:merge_requests, :time_estimate) - remove_column :merge_requests, :time_estimate - end - end -end diff --git a/db/migrate/20161223034646_create_timelogs_ce.rb b/db/migrate/20161223034646_create_timelogs_ce.rb deleted file mode 100644 index 489a2b35dfd..00000000000 --- a/db/migrate/20161223034646_create_timelogs_ce.rb +++ /dev/null @@ -1,25 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateTimelogsCe < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - unless table_exists?(:timelogs) - create_table :timelogs do |t| - t.integer :time_spent, null: false - t.references :trackable, polymorphic: true - t.references :user - - t.timestamps null: false - end - - add_index :timelogs, [:trackable_type, :trackable_id] - add_index :timelogs, :user_id - end - end - - def down - drop_table :timelogs if table_exists?(:timelogs) - end -end diff --git a/db/migrate/20161226122833_remove_dot_git_from_usernames.rb b/db/migrate/20161226122833_remove_dot_git_from_usernames.rb deleted file mode 100644 index e3318780151..00000000000 --- a/db/migrate/20161226122833_remove_dot_git_from_usernames.rb +++ /dev/null @@ -1,110 +0,0 @@ -class RemoveDotGitFromUsernames < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - include Gitlab::ShellAdapter - - DOWNTIME = false - - def up - invalid_users.each do |user| - id = user['id'] - namespace_id = user['namespace_id'] - path_was = user['username'] - path_was_wildcard = quote_string("#{path_was}/%") - path = quote_string(new_path(path_was)) - - move_namespace(namespace_id, path_was, path) - - begin - execute "UPDATE routes SET path = '#{path}' WHERE source_type = 'Namespace' AND source_id = #{namespace_id}" - execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{namespace_id}" - execute "UPDATE users SET username = '#{path}' WHERE id = #{id}" - - select_all("SELECT id, path FROM routes WHERE path LIKE '#{path_was_wildcard}'").each do |route| - new_path = "#{path}/#{route['path'].split('/').last}" - execute "UPDATE routes SET path = '#{new_path}' WHERE id = #{route['id']}" - end - rescue => e - say("Couldn't update routes for path #{path_was} to #{path}") - # Move namespace back - move_namespace(namespace_id, path, path_was) - - raise e - end - end - end - - def down - # nothing to do here - end - - private - - def invalid_users - select_all("SELECT u.id, u.username, n.path AS namespace_path, n.id AS namespace_id FROM users u - INNER JOIN namespaces n ON n.owner_id = u.id - WHERE n.type is NULL AND n.path LIKE '%.git'") - end - - def route_exists?(path) - select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(path)}'").present? - end - - def path_exists?(shard, repository_storage_path) - repository_storage_path && gitlab_shell.exists?(shard, repository_storage_path) - end - - # Accepts invalid path like test.git and returns test_git or - # test_git1 if test_git already taken - def new_path(path) - # To stay closer with original name and reduce risk of duplicates - # we rename suffix instead of removing it - path = path.sub(/\.git\z/, '_git') - - check_routes(path.dup, 0, path) - end - - def check_routes(base, counter, path) - route_exists = route_exists?(path) - - Gitlab.config.repositories.storages.each do |shard, _storage| - if route_exists || path_exists?(shard, path) - counter += 1 - path = "#{base}#{counter}" - - return check_routes(base, counter, path) - end - end - - path - end - - def move_namespace(namespace_id, path_was, path) - repository_storages = select_all("SELECT distinct(repository_storage) FROM projects WHERE namespace_id = #{namespace_id}").map do |row| - row['repository_storage'] - end.compact - - # Move the namespace directory in all storages used by member projects - repository_storages.each do |repository_storage| - # Ensure old directory exists before moving it - gitlab_shell.add_namespace(repository_storage, path_was) - - unless gitlab_shell.mv_namespace(repository_storage, path_was, path) - Rails.logger.error "Exception moving on shard #{repository_storage} from #{path_was} to #{path}" - - # if we cannot move namespace directory we should rollback - # db changes in order to prevent out of sync between db and fs - raise Exception.new('namespace directory cannot be moved') - end - end - - begin - Gitlab::UploadsTransfer.new.rename_namespace(path_was, path) - rescue => e - if path.nil? - say("Couldn't find a storage path for #{namespace_id}, #{path_was} -- skipping") - else - raise e - end - end - end -end diff --git a/db/migrate/20161227192806_rename_slack_and_mattermost_notification_services.rb b/db/migrate/20161227192806_rename_slack_and_mattermost_notification_services.rb deleted file mode 100644 index df5714278f2..00000000000 --- a/db/migrate/20161227192806_rename_slack_and_mattermost_notification_services.rb +++ /dev/null @@ -1,28 +0,0 @@ -# rubocop:disable Migration/UpdateColumnInBatches -class RenameSlackAndMattermostNotificationServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:services, :type, 'SlackService') do |table, query| - query.where(table[:type].eq('SlackNotificationService')) - end - - update_column_in_batches(:services, :type, 'MattermostService') do |table, query| - query.where(table[:type].eq('MattermostNotificationService')) - end - end - - def down - update_column_in_batches(:services, :type, 'SlackNotificationService') do |table, query| - query.where(table[:type].eq('SlackService')) - end - - update_column_in_batches(:services, :type, 'MattermostNotificationService') do |table, query| - query.where(table[:type].eq('MattermostService')) - end - end -end diff --git a/db/migrate/20161228124936_change_expires_at_to_date_in_personal_access_tokens.rb b/db/migrate/20161228124936_change_expires_at_to_date_in_personal_access_tokens.rb deleted file mode 100644 index f9f8f11316d..00000000000 --- a/db/migrate/20161228124936_change_expires_at_to_date_in_personal_access_tokens.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/Datetime -class ChangeExpiresAtToDateInPersonalAccessTokens < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - DOWNTIME_REASON = 'This migration requires downtime because it alters expires_at column from datetime to date' - - def up - change_column :personal_access_tokens, :expires_at, :date - end - - def down - change_column :personal_access_tokens, :expires_at, :datetime - end -end diff --git a/db/migrate/20161228135550_add_impersonation_to_personal_access_tokens.rb b/db/migrate/20161228135550_add_impersonation_to_personal_access_tokens.rb deleted file mode 100644 index 489d7fb8b75..00000000000 --- a/db/migrate/20161228135550_add_impersonation_to_personal_access_tokens.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddImpersonationToPersonalAccessTokens < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - add_column_with_default :personal_access_tokens, :impersonation, :boolean, default: false, allow_null: false - end - - def down - remove_column :personal_access_tokens, :impersonation - end -end diff --git a/db/migrate/20170120131253_create_chat_teams.rb b/db/migrate/20170120131253_create_chat_teams.rb deleted file mode 100644 index e9b9bd7bd2f..00000000000 --- a/db/migrate/20170120131253_create_chat_teams.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateChatTeams < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = "Adding a foreign key" - - disable_ddl_transaction! - - def change - create_table :chat_teams do |t| - t.references :namespace, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.string :team_id - t.string :name - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20170121123724_add_index_to_ci_builds_for_status_runner_id_and_type.rb b/db/migrate/20170121123724_add_index_to_ci_builds_for_status_runner_id_and_type.rb deleted file mode 100644 index cc1a4d2db59..00000000000 --- a/db/migrate/20170121123724_add_index_to_ci_builds_for_status_runner_id_and_type.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToCiBuildsForStatusRunnerIdAndType < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, [:status, :type, :runner_id] - end - - def down - if index_exists?(:ci_builds, [:status, :type, :runner_id]) - remove_index :ci_builds, column: [:status, :type, :runner_id] - end - end -end diff --git a/db/migrate/20170121130655_add_index_to_ci_runners_for_is_shared.rb b/db/migrate/20170121130655_add_index_to_ci_runners_for_is_shared.rb deleted file mode 100644 index 1b83ce4cfe3..00000000000 --- a/db/migrate/20170121130655_add_index_to_ci_runners_for_is_shared.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToCiRunnersForIsShared < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_runners, :is_shared - end - - def down - if index_exists?(:ci_runners, :is_shared) - remove_index :ci_runners, :is_shared - end - end -end diff --git a/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb b/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb deleted file mode 100644 index ffd966be086..00000000000 --- a/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb +++ /dev/null @@ -1,57 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddForeignKeysToTimelogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - change_table :timelogs do |t| - t.column :issue_id, :integer - t.column :merge_request_id, :integer - end - - add_concurrent_index :timelogs, :issue_id - add_concurrent_index :timelogs, :merge_request_id - - if Gitlab::Database.postgresql? - execute <<-EOF - ALTER TABLE timelogs ADD CONSTRAINT "fk_timelogs_issues_issue_id" FOREIGN KEY (issue_id) REFERENCES "issues" (id) ON DELETE CASCADE NOT VALID; - ALTER TABLE timelogs ADD CONSTRAINT "fk_timelogs_merge_requests_merge_request_id" FOREIGN KEY (merge_request_id) REFERENCES "merge_requests" (id) ON DELETE CASCADE NOT VALID; - EOF - else - execute "ALTER TABLE timelogs ADD CONSTRAINT fk_timelogs_issues_issue_id FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;" - execute "ALTER TABLE timelogs ADD CONSTRAINT fk_timelogs_merge_requests_merge_request_id FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;" - end - - Timelog.where(trackable_type: 'Issue').update_all("issue_id = trackable_id") - Timelog.where(trackable_type: 'MergeRequest').update_all("merge_request_id = trackable_id") - end - - def down - Timelog.where('issue_id IS NOT NULL').update_all("trackable_id = issue_id, trackable_type = 'Issue'") - Timelog.where('merge_request_id IS NOT NULL').update_all("trackable_id = merge_request_id, trackable_type = 'MergeRequest'") - - remove_foreign_key :timelogs, name: 'fk_timelogs_issues_issue_id' - remove_foreign_key :timelogs, name: 'fk_timelogs_merge_requests_merge_request_id' - - remove_columns :timelogs, :issue_id, :merge_request_id - end -end diff --git a/db/migrate/20170124193147_add_two_factor_columns_to_namespaces.rb b/db/migrate/20170124193147_add_two_factor_columns_to_namespaces.rb deleted file mode 100644 index 324e051666b..00000000000 --- a/db/migrate/20170124193147_add_two_factor_columns_to_namespaces.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddTwoFactorColumnsToNamespaces < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:namespaces, :require_two_factor_authentication, :boolean, default: false) - add_column_with_default(:namespaces, :two_factor_grace_period, :integer, default: 48) - - add_concurrent_index(:namespaces, :require_two_factor_authentication) - end - - def down - remove_column(:namespaces, :require_two_factor_authentication) - remove_column(:namespaces, :two_factor_grace_period) - - remove_concurrent_index(:namespaces, :require_two_factor_authentication) if index_exists?(:namespaces, :require_two_factor_authentication) - end -end diff --git a/db/migrate/20170124193205_add_two_factor_columns_to_users.rb b/db/migrate/20170124193205_add_two_factor_columns_to_users.rb deleted file mode 100644 index 6c80dbfc965..00000000000 --- a/db/migrate/20170124193205_add_two_factor_columns_to_users.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddTwoFactorColumnsToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:users, :require_two_factor_authentication_from_group, :boolean, default: false) - add_column_with_default(:users, :two_factor_grace_period, :integer, default: 48) - end - - def down - remove_column(:users, :require_two_factor_authentication_from_group) - remove_column(:users, :two_factor_grace_period) - end -end diff --git a/db/migrate/20170126174819_add_terminal_max_session_time_to_application_settings.rb b/db/migrate/20170126174819_add_terminal_max_session_time_to_application_settings.rb deleted file mode 100644 index 70f1669108a..00000000000 --- a/db/migrate/20170126174819_add_terminal_max_session_time_to_application_settings.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddTerminalMaxSessionTimeToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :terminal_max_session_time, :integer, default: 0, allow_null: false - end - - def down - remove_column :application_settings, :terminal_max_session_time - end -end diff --git a/db/migrate/20170127032550_remove_backlog_lists_from_boards.rb b/db/migrate/20170127032550_remove_backlog_lists_from_boards.rb deleted file mode 100644 index 2e2fecfa2a7..00000000000 --- a/db/migrate/20170127032550_remove_backlog_lists_from_boards.rb +++ /dev/null @@ -1,17 +0,0 @@ -class RemoveBacklogListsFromBoards < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute <<-SQL - DELETE FROM lists WHERE list_type = 0; - SQL - end - - def down - execute <<-SQL - INSERT INTO lists (board_id, list_type, created_at, updated_at) - SELECT boards.id, 0, NOW(), NOW() - FROM boards; - SQL - end -end diff --git a/db/migrate/20170130204620_add_index_to_project_authorizations.rb b/db/migrate/20170130204620_add_index_to_project_authorizations.rb deleted file mode 100644 index 28c4480e9c6..00000000000 --- a/db/migrate/20170130204620_add_index_to_project_authorizations.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToProjectAuthorizations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - unless index_exists?(:project_authorizations, :project_id) - add_concurrent_index(:project_authorizations, :project_id) - end - end - - def down - remove_index(:project_authorizations, :project_id) if - Gitlab::Database.postgresql? - end -end diff --git a/db/migrate/20170130221926_create_uploads.rb b/db/migrate/20170130221926_create_uploads.rb deleted file mode 100644 index 7bf15ca4978..00000000000 --- a/db/migrate/20170130221926_create_uploads.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateUploads < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :uploads do |t| - t.integer :size, limit: 8, null: false - t.string :path, null: false - t.string :checksum, limit: 64 - t.references :model, polymorphic: true - t.string :uploader, null: false - t.datetime :created_at, null: false - end - - add_index :uploads, :path - add_index :uploads, :checksum - add_index :uploads, [:model_id, :model_type] - end -end diff --git a/db/migrate/20170131221752_add_relative_position_to_issues.rb b/db/migrate/20170131221752_add_relative_position_to_issues.rb deleted file mode 100644 index 126cb9e5415..00000000000 --- a/db/migrate/20170131221752_add_relative_position_to_issues.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddRelativePositionToIssues < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - add_column :issues, :relative_position, :integer - - add_concurrent_index :issues, :relative_position - end - - def down - remove_column :issues, :relative_position - - remove_index :issues, :relative_position if index_exists? :issues, :relative_position - end -end diff --git a/db/migrate/20170204172458_add_name_to_route.rb b/db/migrate/20170204172458_add_name_to_route.rb deleted file mode 100644 index e7c94aceb26..00000000000 --- a/db/migrate/20170204172458_add_name_to_route.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddNameToRoute < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :routes, :name, :string - end -end diff --git a/db/migrate/20170204181513_add_index_to_labels_for_type_and_project.rb b/db/migrate/20170204181513_add_index_to_labels_for_type_and_project.rb deleted file mode 100644 index 746322885b1..00000000000 --- a/db/migrate/20170204181513_add_index_to_labels_for_type_and_project.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToLabelsForTypeAndProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :labels, [:type, :project_id] - end - - def down - remove_index :labels, [:type, :project_id] if index_exists? :labels, [:type, :project_id] - end -end diff --git a/db/migrate/20170206071414_add_recaptcha_verified_to_spam_logs.rb b/db/migrate/20170206071414_add_recaptcha_verified_to_spam_logs.rb deleted file mode 100644 index 06338ac943e..00000000000 --- a/db/migrate/20170206071414_add_recaptcha_verified_to_spam_logs.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddRecaptchaVerifiedToSpamLogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:spam_logs, :recaptcha_verified, :boolean, default: false) - end - - def down - remove_column(:spam_logs, :recaptcha_verified) - end -end diff --git a/db/migrate/20170206115204_add_column_ghost_to_users.rb b/db/migrate/20170206115204_add_column_ghost_to_users.rb deleted file mode 100644 index 4b86814e05d..00000000000 --- a/db/migrate/20170206115204_add_column_ghost_to_users.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddColumnGhostToUsers < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - add_column :users, :ghost, :boolean - end - - def down - remove_column :users, :ghost - end -end diff --git a/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb b/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb deleted file mode 100644 index d0b440b8ccb..00000000000 --- a/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToLabelsForTitleAndProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :labels, :title - add_concurrent_index :labels, :project_id - end - - def down - remove_index :labels, :title if index_exists? :labels, :title - remove_index :labels, :project_id if index_exists? :labels, :project_id - end -end diff --git a/db/migrate/20170210075922_add_index_to_ci_trigger_requests_for_commit_id.rb b/db/migrate/20170210075922_add_index_to_ci_trigger_requests_for_commit_id.rb deleted file mode 100644 index 753d6c77e35..00000000000 --- a/db/migrate/20170210075922_add_index_to_ci_trigger_requests_for_commit_id.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexToCiTriggerRequestsForCommitId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_trigger_requests, :commit_id - end - - def down - remove_index :ci_trigger_requests, :commit_id if index_exists? :ci_trigger_requests, :commit_id - end -end diff --git a/db/migrate/20170210103609_add_index_to_user_agent_detail.rb b/db/migrate/20170210103609_add_index_to_user_agent_detail.rb deleted file mode 100644 index a2d6528ea82..00000000000 --- a/db/migrate/20170210103609_add_index_to_user_agent_detail.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexToUserAgentDetail < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :user_agent_details, [:subject_id, :subject_type] - end - - def down - remove_index :user_agent_details, [:subject_id, :subject_type] if index_exists? :user_agent_details, [:subject_id, :subject_type] - end -end diff --git a/db/migrate/20170210131347_add_unique_ips_limit_to_application_settings.rb b/db/migrate/20170210131347_add_unique_ips_limit_to_application_settings.rb deleted file mode 100644 index c286354f476..00000000000 --- a/db/migrate/20170210131347_add_unique_ips_limit_to_application_settings.rb +++ /dev/null @@ -1,17 +0,0 @@ -class AddUniqueIpsLimitToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - disable_ddl_transaction! - - def up - add_column :application_settings, :unique_ips_limit_per_user, :integer - add_column :application_settings, :unique_ips_limit_time_window, :integer - add_column_with_default :application_settings, :unique_ips_limit_enabled, :boolean, default: false - end - - def down - remove_column :application_settings, :unique_ips_limit_per_user - remove_column :application_settings, :unique_ips_limit_time_window - remove_column :application_settings, :unique_ips_limit_enabled - end -end diff --git a/db/migrate/20170214084746_add_default_artifacts_expiration_to_application_settings.rb b/db/migrate/20170214084746_add_default_artifacts_expiration_to_application_settings.rb deleted file mode 100644 index 84814c2f8f2..00000000000 --- a/db/migrate/20170214084746_add_default_artifacts_expiration_to_application_settings.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddDefaultArtifactsExpirationToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, - :default_artifacts_expire_in, :string, - null: false, default: '0' - end -end diff --git a/db/migrate/20170216135621_add_index_for_latest_successful_pipeline.rb b/db/migrate/20170216135621_add_index_for_latest_successful_pipeline.rb deleted file mode 100644 index be393bd496d..00000000000 --- a/db/migrate/20170216135621_add_index_for_latest_successful_pipeline.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable RemoveIndex -class AddIndexForLatestSuccessfulPipeline < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:ci_commits, [:gl_project_id, :ref, :status]) - end - - def down - remove_index :ci_commits, [:gl_project_id, :ref, :status] if index_exists? :ci_commits, [:gl_project_id, :ref, :status] - end -end diff --git a/db/migrate/20170216141440_drop_index_for_builds_project_status.rb b/db/migrate/20170216141440_drop_index_for_builds_project_status.rb deleted file mode 100644 index 7edf7dd7e10..00000000000 --- a/db/migrate/20170216141440_drop_index_for_builds_project_status.rb +++ /dev/null @@ -1,9 +0,0 @@ -# rubocop:disable RemoveIndex -class DropIndexForBuildsProjectStatus < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - def change - remove_index(:ci_commits, column: [:gl_project_id, :status]) - end -end diff --git a/db/migrate/20170217132157_rename_merge_when_build_succeeds.rb b/db/migrate/20170217132157_rename_merge_when_build_succeeds.rb deleted file mode 100644 index ee8838eff56..00000000000 --- a/db/migrate/20170217132157_rename_merge_when_build_succeeds.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameMergeWhenBuildSucceeds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Renaming the column merge_when_build_succeeds' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - rename_column :merge_requests, :merge_when_build_succeeds, :merge_when_pipeline_succeeds - end -end diff --git a/db/migrate/20170217151947_rename_only_allow_merge_if_build_succeeds.rb b/db/migrate/20170217151947_rename_only_allow_merge_if_build_succeeds.rb deleted file mode 100644 index 5d35216f3af..00000000000 --- a/db/migrate/20170217151947_rename_only_allow_merge_if_build_succeeds.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameOnlyAllowMergeIfBuildSucceeds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = true - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - DOWNTIME_REASON = 'Renaming the column only_allow_merge_if_build_succeeds' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - rename_column :projects, :only_allow_merge_if_build_succeeds, :only_allow_merge_if_pipeline_succeeds - end -end diff --git a/db/migrate/20170217151948_add_owner_id_to_triggers.rb b/db/migrate/20170217151948_add_owner_id_to_triggers.rb deleted file mode 100644 index a28711ae59a..00000000000 --- a/db/migrate/20170217151948_add_owner_id_to_triggers.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddOwnerIdToTriggers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_triggers, :owner_id, :integer - end -end diff --git a/db/migrate/20170217151949_add_description_to_triggers.rb b/db/migrate/20170217151949_add_description_to_triggers.rb deleted file mode 100644 index 27cb4b3ab31..00000000000 --- a/db/migrate/20170217151949_add_description_to_triggers.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddDescriptionToTriggers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_triggers, :description, :string - end -end diff --git a/db/migrate/20170222111732_create_gpg_keys.rb b/db/migrate/20170222111732_create_gpg_keys.rb deleted file mode 100644 index 012e8ef5854..00000000000 --- a/db/migrate/20170222111732_create_gpg_keys.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateGpgKeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :gpg_keys do |t| - t.timestamps_with_timezone null: false - - t.references :user, index: true, foreign_key: { on_delete: :cascade } - - t.binary :primary_keyid - t.binary :fingerprint - - t.text :key - - t.index :primary_keyid, unique: true, length: mysql_compatible_index_length - t.index :fingerprint, unique: true, length: mysql_compatible_index_length - end - end -end diff --git a/db/migrate/20170222143317_drop_ci_projects.rb b/db/migrate/20170222143317_drop_ci_projects.rb deleted file mode 100644 index 9f3aa2da382..00000000000 --- a/db/migrate/20170222143317_drop_ci_projects.rb +++ /dev/null @@ -1,34 +0,0 @@ -class DropCiProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - drop_table :ci_projects - end - - def down - create_table "ci_projects", force: :cascade do |t| - t.string "name" - t.integer "timeout", default: 3600, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "token" - t.string "default_ref" - t.string "path" - t.boolean "always_build", default: false, null: false - t.integer "polling_interval" - t.boolean "public", default: false, null: false - t.string "ssh_url_to_repo" - t.integer "gitlab_id" - t.boolean "allow_git_fetch", default: true, null: false - t.string "email_recipients", default: "", null: false - t.boolean "email_add_pusher", default: true, null: false - t.boolean "email_only_broken_builds", default: true, null: false - t.string "skip_refs" - t.string "coverage_regex" - t.boolean "shared_runners_enabled", default: false - t.text "generated_yaml_config" - end - end -end diff --git a/db/migrate/20170222143500_remove_old_project_id_columns.rb b/db/migrate/20170222143500_remove_old_project_id_columns.rb deleted file mode 100644 index 356dee4a060..00000000000 --- a/db/migrate/20170222143500_remove_old_project_id_columns.rb +++ /dev/null @@ -1,30 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# rubocop:disable RemoveIndex -class RemoveOldProjectIdColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = true - DOWNTIME_REASON = 'Unused columns are being removed.' - - def up - remove_index :ci_builds, :project_id if - index_exists?(:ci_builds, :project_id) - - remove_column :ci_builds, :project_id - remove_column :ci_commits, :project_id - remove_column :ci_runner_projects, :project_id - remove_column :ci_triggers, :project_id - remove_column :ci_variables, :project_id - end - - def down - add_column :ci_builds, :project_id, :integer - add_column :ci_commits, :project_id, :integer - add_column :ci_runner_projects, :project_id, :integer - add_column :ci_triggers, :project_id, :integer - add_column :ci_variables, :project_id, :integer - - add_concurrent_index :ci_builds, :project_id - end -end diff --git a/db/migrate/20170222143603_rename_gl_project_id_to_project_id.rb b/db/migrate/20170222143603_rename_gl_project_id_to_project_id.rb deleted file mode 100644 index 390b2c33d91..00000000000 --- a/db/migrate/20170222143603_rename_gl_project_id_to_project_id.rb +++ /dev/null @@ -1,14 +0,0 @@ -class RenameGlProjectIdToProjectId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Renaming an actively used column.' - - def change - rename_column :ci_builds, :gl_project_id, :project_id - rename_column :ci_commits, :gl_project_id, :project_id - rename_column :ci_runner_projects, :gl_project_id, :project_id - rename_column :ci_triggers, :gl_project_id, :project_id - rename_column :ci_variables, :gl_project_id, :project_id - end -end diff --git a/db/migrate/20170301101006_add_ci_runner_namespaces.rb b/db/migrate/20170301101006_add_ci_runner_namespaces.rb deleted file mode 100644 index aa2d8a14242..00000000000 --- a/db/migrate/20170301101006_add_ci_runner_namespaces.rb +++ /dev/null @@ -1,17 +0,0 @@ -class AddCiRunnerNamespaces < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :ci_runner_namespaces do |t| - t.integer :runner_id - t.integer :namespace_id - - t.index [:runner_id, :namespace_id], unique: true - t.index :namespace_id - t.foreign_key :ci_runners, column: :runner_id, on_delete: :cascade - t.foreign_key :namespaces, column: :namespace_id, on_delete: :cascade - end - end -end diff --git a/db/migrate/20170301125302_add_printing_merge_request_link_enabled_to_project.rb b/db/migrate/20170301125302_add_printing_merge_request_link_enabled_to_project.rb deleted file mode 100644 index a7efeb8ae6f..00000000000 --- a/db/migrate/20170301125302_add_printing_merge_request_link_enabled_to_project.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable Migration/UpdateLargeTable -class AddPrintingMergeRequestLinkEnabledToProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - add_column_with_default(:projects, :printing_merge_request_link_enabled, :boolean, default: true) - end - - def down - remove_column(:projects, :printing_merge_request_link_enabled) - end -end diff --git a/db/migrate/20170301195939_rename_ci_commits_to_ci_pipelines.rb b/db/migrate/20170301195939_rename_ci_commits_to_ci_pipelines.rb deleted file mode 100644 index 791e9c845a6..00000000000 --- a/db/migrate/20170301195939_rename_ci_commits_to_ci_pipelines.rb +++ /dev/null @@ -1,10 +0,0 @@ -class RenameCiCommitsToCiPipelines < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Rename table ci_commits to ci_pipelines' - - def change - rename_table 'ci_commits', 'ci_pipelines' - end -end diff --git a/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb b/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb deleted file mode 100644 index 08a11aee992..00000000000 --- a/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb +++ /dev/null @@ -1,84 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -class RemoveUnusedCiTablesAndColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = - 'Remove unused columns in used tables.' \ - ' Downtime required in case Rails caches them' - - def up - %w[ci_application_settings - ci_events - ci_jobs - ci_sessions - ci_taggings - ci_tags].each do |table| - drop_table(table) - end - - remove_column :ci_pipelines, :push_data, :text - remove_column :ci_builds, :job_id, :integer if column_exists?(:ci_builds, :job_id) - remove_column :ci_builds, :deploy, :boolean - end - - def down - add_column :ci_builds, :deploy, :boolean - add_column :ci_builds, :job_id, :integer - add_column :ci_pipelines, :push_data, :text - - create_table "ci_tags", force: :cascade do |t| - t.string "name" - t.integer "taggings_count", default: 0 - end - - create_table "ci_taggings", force: :cascade do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", limit: 128 - t.datetime "created_at" - end - - add_index "ci_taggings", %w[taggable_id taggable_type context] - - create_table "ci_sessions", force: :cascade do |t| - t.string "session_id", null: false - t.text "data" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "ci_jobs", force: :cascade do |t| - t.integer "project_id", null: false - t.text "commands" - t.boolean "active", default: true, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "name" - t.boolean "build_branches", default: true, null: false - t.boolean "build_tags", default: false, null: false - t.string "job_type", default: "parallel" - t.string "refs" - t.datetime "deleted_at" - end - - create_table "ci_events", force: :cascade do |t| - t.integer "project_id" - t.integer "user_id" - t.integer "is_admin" - t.text "description" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "ci_application_settings", force: :cascade do |t| - t.boolean "all_broken_builds" - t.boolean "add_pusher" - t.datetime "created_at" - t.datetime "updated_at" - end - end -end diff --git a/db/migrate/20170305180853_add_auto_cancel_pending_pipelines_to_project.rb b/db/migrate/20170305180853_add_auto_cancel_pending_pipelines_to_project.rb deleted file mode 100644 index 3e317bb5248..00000000000 --- a/db/migrate/20170305180853_add_auto_cancel_pending_pipelines_to_project.rb +++ /dev/null @@ -1,16 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddAutoCancelPendingPipelinesToProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:projects, :auto_cancel_pending_pipelines, :integer, default: 0) - end - - def down - remove_column(:projects, :auto_cancel_pending_pipelines) - end -end diff --git a/db/migrate/20170305203726_add_owner_id_foreign_key.rb b/db/migrate/20170305203726_add_owner_id_foreign_key.rb deleted file mode 100644 index b3bd441ff9c..00000000000 --- a/db/migrate/20170305203726_add_owner_id_foreign_key.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddOwnerIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key :ci_triggers, :users, column: :owner_id, on_delete: :cascade - end - - def down - remove_foreign_key :ci_triggers, column: :owner_id - end -end diff --git a/db/migrate/20170307125949_add_last_activity_on_to_users.rb b/db/migrate/20170307125949_add_last_activity_on_to_users.rb deleted file mode 100644 index 42331eab753..00000000000 --- a/db/migrate/20170307125949_add_last_activity_on_to_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddLastActivityOnToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :users, :last_activity_on, :date - end -end diff --git a/db/migrate/20170309173138_create_protected_tags.rb b/db/migrate/20170309173138_create_protected_tags.rb deleted file mode 100644 index f518b500bd4..00000000000 --- a/db/migrate/20170309173138_create_protected_tags.rb +++ /dev/null @@ -1,28 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateProtectedTags < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - GITLAB_ACCESS_MASTER = 40 - - def change - create_table :protected_tags do |t| - t.integer :project_id, null: false - t.string :name, null: false - t.timestamps null: false - end - - add_index :protected_tags, :project_id - - create_table :protected_tag_create_access_levels do |t| - t.references :protected_tag, index: { name: "index_protected_tag_create_access" }, foreign_key: true, null: false - t.integer :access_level, default: GITLAB_ACCESS_MASTER, null: true - t.references :user, foreign_key: true, index: true - t.integer :group_id - t.timestamps null: false - end - - add_foreign_key :protected_tag_create_access_levels, :namespaces, column: :group_id # rubocop: disable Migration/AddConcurrentForeignKey - end -end diff --git a/db/migrate/20170312114329_add_auto_canceled_by_id_to_pipeline.rb b/db/migrate/20170312114329_add_auto_canceled_by_id_to_pipeline.rb deleted file mode 100644 index 26187a9e8b3..00000000000 --- a/db/migrate/20170312114329_add_auto_canceled_by_id_to_pipeline.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddAutoCanceledByIdToPipeline < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_pipelines, :auto_canceled_by_id, :integer - end -end diff --git a/db/migrate/20170312114529_add_auto_canceled_by_id_foreign_key_to_pipeline.rb b/db/migrate/20170312114529_add_auto_canceled_by_id_foreign_key_to_pipeline.rb deleted file mode 100644 index a2b5c1c4533..00000000000 --- a/db/migrate/20170312114529_add_auto_canceled_by_id_foreign_key_to_pipeline.rb +++ /dev/null @@ -1,22 +0,0 @@ -class AddAutoCanceledByIdForeignKeyToPipeline < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - on_delete = - if Gitlab::Database.mysql? - :nullify - else - 'SET NULL' - end - - add_concurrent_foreign_key :ci_pipelines, :ci_pipelines, column: :auto_canceled_by_id, on_delete: on_delete - end - - def down - remove_foreign_key :ci_pipelines, column: :auto_canceled_by_id - end -end diff --git a/db/migrate/20170313213916_add_index_to_user_ghost.rb b/db/migrate/20170313213916_add_index_to_user_ghost.rb deleted file mode 100644 index 66e57b444a0..00000000000 --- a/db/migrate/20170313213916_add_index_to_user_ghost.rb +++ /dev/null @@ -1,25 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# rubocop:disable RemoveIndex -class AddIndexToUserGhost < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - disable_ddl_transaction! - - def up - add_concurrent_index :users, :ghost - end - - def down - remove_index :users, :ghost - end -end diff --git a/db/migrate/20170314082049_create_system_note_metadata.rb b/db/migrate/20170314082049_create_system_note_metadata.rb deleted file mode 100644 index d0cc6e3be36..00000000000 --- a/db/migrate/20170314082049_create_system_note_metadata.rb +++ /dev/null @@ -1,24 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateSystemNoteMetadata < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :system_note_metadata do |t| - t.references :note, null: false - t.integer :commit_count - t.string :action - - t.timestamps null: false - end - - add_concurrent_foreign_key :system_note_metadata, :notes, column: :note_id - end - - def down - drop_table :system_note_metadata - end -end diff --git a/db/migrate/20170315174634_revert_add_notified_of_own_activity_to_users.rb b/db/migrate/20170315174634_revert_add_notified_of_own_activity_to_users.rb deleted file mode 100644 index 8773c7ea657..00000000000 --- a/db/migrate/20170315174634_revert_add_notified_of_own_activity_to_users.rb +++ /dev/null @@ -1,26 +0,0 @@ -# rubocop:disable Migration/RemoveColumn -# rubocop:disable Migration/UpdateLargeTable -class RevertAddNotifiedOfOwnActivityToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - if our_column_exists? - remove_column :users, :notified_of_own_activity - end - end - - def down - unless our_column_exists? - add_column_with_default :users, :notified_of_own_activity, :boolean, default: false - end - end - - private - - def our_column_exists? - column_exists?(:users, :notified_of_own_activity) - end -end diff --git a/db/migrate/20170315194013_add_closed_at_to_issues.rb b/db/migrate/20170315194013_add_closed_at_to_issues.rb deleted file mode 100644 index 0b06ee6e74c..00000000000 --- a/db/migrate/20170315194013_add_closed_at_to_issues.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddClosedAtToIssues < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :issues, :closed_at, :datetime - end -end diff --git a/db/migrate/20170316061730_readd_notified_of_own_activity_to_users.rb b/db/migrate/20170316061730_readd_notified_of_own_activity_to_users.rb deleted file mode 100644 index 82029dfd3fc..00000000000 --- a/db/migrate/20170316061730_readd_notified_of_own_activity_to_users.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ReaddNotifiedOfOwnActivityToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def change - add_column :users, :notified_of_own_activity, :boolean - end -end diff --git a/db/migrate/20170316163845_move_uploads_to_system_dir.rb b/db/migrate/20170316163845_move_uploads_to_system_dir.rb deleted file mode 100644 index d24527b55cd..00000000000 --- a/db/migrate/20170316163845_move_uploads_to_system_dir.rb +++ /dev/null @@ -1,59 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MoveUploadsToSystemDir < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - DIRECTORIES_TO_MOVE = %w(user project note group appearance).freeze - - def up - return unless file_storage? - - FileUtils.mkdir_p(new_upload_dir) - - DIRECTORIES_TO_MOVE.each do |dir| - source = File.join(old_upload_dir, dir) - destination = File.join(new_upload_dir, dir) - next unless File.directory?(source) - next if File.directory?(destination) - - say "Moving #{source} -> #{destination}" - FileUtils.mv(source, destination) - FileUtils.ln_s(destination, source) - end - end - - def down - return unless file_storage? - return unless File.directory?(new_upload_dir) - - DIRECTORIES_TO_MOVE.each do |dir| - source = File.join(new_upload_dir, dir) - destination = File.join(old_upload_dir, dir) - next unless File.directory?(source) - next if File.directory?(destination) && !File.symlink?(destination) - - say "Moving #{source} -> #{destination}" - FileUtils.rm(destination) if File.symlink?(destination) - FileUtils.mv(source, destination) - end - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end - - def base_directory - Rails.root - end - - def old_upload_dir - File.join(base_directory, "public", "uploads") - end - - def new_upload_dir - File.join(base_directory, "public", "uploads", "-", "system") - end -end diff --git a/db/migrate/20170317203554_index_routes_path_for_like.rb b/db/migrate/20170317203554_index_routes_path_for_like.rb deleted file mode 100644 index a1bee3c8783..00000000000 --- a/db/migrate/20170317203554_index_routes_path_for_like.rb +++ /dev/null @@ -1,28 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IndexRoutesPathForLike < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - INDEX_NAME = 'index_routes_on_path_text_pattern_ops' - - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - unless index_exists?(:routes, :path, name: INDEX_NAME) - execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME} ON routes (path varchar_pattern_ops);") - end - end - - def down - return unless Gitlab::Database.postgresql? - return unless index_exists?(:routes, :path, name: INDEX_NAME) - - remove_concurrent_index_by_name(:routes, INDEX_NAME) - end -end diff --git a/db/migrate/20170320173259_migrate_assignees.rb b/db/migrate/20170320173259_migrate_assignees.rb deleted file mode 100644 index 43a90758bd9..00000000000 --- a/db/migrate/20170320173259_migrate_assignees.rb +++ /dev/null @@ -1,43 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class MigrateAssignees < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - # Optimisation: this accounts for most of the invalid assignee IDs on GitLab.com - update_column_in_batches(:issues, :assignee_id, nil) do |table, query| - query.where(table[:assignee_id].eq(0)) - end - - users = Arel::Table.new(:users) - - update_column_in_batches(:issues, :assignee_id, nil) do |table, query| - query.where(table[:assignee_id].not_eq(nil)\ - .and( - users.project("true").where(users[:id].eq(table[:assignee_id])).exists.not - )) - end - end - - def down - end -end diff --git a/db/migrate/20170322013926_create_container_repository.rb b/db/migrate/20170322013926_create_container_repository.rb deleted file mode 100644 index b1e778671b2..00000000000 --- a/db/migrate/20170322013926_create_container_repository.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateContainerRepository < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :container_repositories do |t| - t.references :project, foreign_key: true, index: true, null: false - t.string :name, null: false - - t.timestamps null: false - end - - add_index :container_repositories, [:project_id, :name], unique: true - end -end diff --git a/db/migrate/20170327091750_add_created_at_index_to_deployments.rb b/db/migrate/20170327091750_add_created_at_index_to_deployments.rb deleted file mode 100644 index f29fff7d5b9..00000000000 --- a/db/migrate/20170327091750_add_created_at_index_to_deployments.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddCreatedAtIndexToDeployments < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :deployments, :created_at - end - - def down - remove_concurrent_index :deployments, :created_at - end -end diff --git a/db/migrate/20170328010804_add_uuid_to_application_settings.rb b/db/migrate/20170328010804_add_uuid_to_application_settings.rb deleted file mode 100644 index 95a01c2dc8f..00000000000 --- a/db/migrate/20170328010804_add_uuid_to_application_settings.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddUuidToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :application_settings, :uuid, :string - execute("UPDATE application_settings SET uuid = #{quote(SecureRandom.uuid)}") - end - - def down - remove_column :application_settings, :uuid - end -end diff --git a/db/migrate/20170329095325_add_ref_to_triggers.rb b/db/migrate/20170329095325_add_ref_to_triggers.rb deleted file mode 100644 index db09b36db17..00000000000 --- a/db/migrate/20170329095325_add_ref_to_triggers.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRefToTriggers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_triggers, :ref, :string - end -end diff --git a/db/migrate/20170329095907_create_ci_trigger_schedules.rb b/db/migrate/20170329095907_create_ci_trigger_schedules.rb deleted file mode 100644 index 7f759f908cd..00000000000 --- a/db/migrate/20170329095907_create_ci_trigger_schedules.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateCiTriggerSchedules < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :ci_trigger_schedules do |t| - t.integer "project_id" - t.integer "trigger_id", null: false - t.datetime "deleted_at" - t.datetime "created_at" - t.datetime "updated_at" - t.string "cron" - t.string "cron_timezone" - t.datetime "next_run_at" - end - - add_index :ci_trigger_schedules, :next_run_at - add_index :ci_trigger_schedules, :project_id - end -end diff --git a/db/migrate/20170329124448_add_polling_interval_multiplier_to_application_settings.rb b/db/migrate/20170329124448_add_polling_interval_multiplier_to_application_settings.rb deleted file mode 100644 index 17307879a2a..00000000000 --- a/db/migrate/20170329124448_add_polling_interval_multiplier_to_application_settings.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPollingIntervalMultiplierToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :polling_interval_multiplier, :decimal, default: 1, allow_null: false - end - - def down - remove_column :application_settings, :polling_interval_multiplier - end -end diff --git a/db/migrate/20170330141723_disable_invalid_service_templates2.rb b/db/migrate/20170330141723_disable_invalid_service_templates2.rb deleted file mode 100644 index f09f3b3e355..00000000000 --- a/db/migrate/20170330141723_disable_invalid_service_templates2.rb +++ /dev/null @@ -1,18 +0,0 @@ -# This is the same as DisableInvalidServiceTemplates. Later migrations may have -# inadvertently enabled some invalid templates again. -# -class DisableInvalidServiceTemplates2 < ActiveRecord::Migration[4.2] - DOWNTIME = false - - unless defined?(Service) - class Service < ActiveRecord::Base - self.inheritance_column = nil - end - end - - def up - Service.where(template: true, active: true).each do |template| - template.update(active: false) unless template.valid? - end - end -end diff --git a/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb b/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb deleted file mode 100644 index 4c417ce2f71..00000000000 --- a/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -class RemoveIndexForUsersCurrentSignInAt < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - remove_concurrent_index :users, :current_sign_in_at - end - - def down - add_concurrent_index :users, :current_sign_in_at - end -end diff --git a/db/migrate/20170404163427_add_trigger_id_foreign_key.rb b/db/migrate/20170404163427_add_trigger_id_foreign_key.rb deleted file mode 100644 index f35730c8e45..00000000000 --- a/db/migrate/20170404163427_add_trigger_id_foreign_key.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddTriggerIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key :ci_trigger_schedules, :ci_triggers, column: :trigger_id, on_delete: :cascade - end - - def down - remove_foreign_key :ci_trigger_schedules, column: :trigger_id - end -end diff --git a/db/migrate/20170405080720_add_import_jid_to_projects.rb b/db/migrate/20170405080720_add_import_jid_to_projects.rb deleted file mode 100644 index ddbea9d7ab6..00000000000 --- a/db/migrate/20170405080720_add_import_jid_to_projects.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddImportJidToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :projects, :import_jid, :string - end -end diff --git a/db/migrate/20170406114958_add_auto_canceled_by_id_to_ci_builds.rb b/db/migrate/20170406114958_add_auto_canceled_by_id_to_ci_builds.rb deleted file mode 100644 index ba43a070587..00000000000 --- a/db/migrate/20170406114958_add_auto_canceled_by_id_to_ci_builds.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddAutoCanceledByIdToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_builds, :auto_canceled_by_id, :integer - end -end diff --git a/db/migrate/20170406115029_add_auto_canceled_by_id_foreign_key_to_ci_builds.rb b/db/migrate/20170406115029_add_auto_canceled_by_id_foreign_key_to_ci_builds.rb deleted file mode 100644 index 2ec281e20c1..00000000000 --- a/db/migrate/20170406115029_add_auto_canceled_by_id_foreign_key_to_ci_builds.rb +++ /dev/null @@ -1,22 +0,0 @@ -class AddAutoCanceledByIdForeignKeyToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - on_delete = - if Gitlab::Database.mysql? - :nullify - else - 'SET NULL' - end - - add_concurrent_foreign_key :ci_builds, :ci_pipelines, column: :auto_canceled_by_id, on_delete: on_delete - end - - def down - remove_foreign_key :ci_builds, column: :auto_canceled_by_id - end -end diff --git a/db/migrate/20170407114956_add_ref_to_ci_trigger_schedule.rb b/db/migrate/20170407114956_add_ref_to_ci_trigger_schedule.rb deleted file mode 100644 index 5d156b7ef2e..00000000000 --- a/db/migrate/20170407114956_add_ref_to_ci_trigger_schedule.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRefToCiTriggerSchedule < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_trigger_schedules, :ref, :string - end -end diff --git a/db/migrate/20170407122426_add_active_to_ci_trigger_schedule.rb b/db/migrate/20170407122426_add_active_to_ci_trigger_schedule.rb deleted file mode 100644 index 33295bd3f2e..00000000000 --- a/db/migrate/20170407122426_add_active_to_ci_trigger_schedule.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddActiveToCiTriggerSchedule < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_trigger_schedules, :active, :boolean - end -end diff --git a/db/migrate/20170407135259_add_foreigh_key_trigger_requests_trigger.rb b/db/migrate/20170407135259_add_foreigh_key_trigger_requests_trigger.rb deleted file mode 100644 index 9aaa4d0eddf..00000000000 --- a/db/migrate/20170407135259_add_foreigh_key_trigger_requests_trigger.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddForeighKeyTriggerRequestsTrigger < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:ci_trigger_requests, :ci_triggers, column: :trigger_id) - end - - def down - remove_foreign_key(:ci_trigger_requests, column: :trigger_id) - end -end diff --git a/db/migrate/20170407140450_add_index_to_next_run_at_and_active.rb b/db/migrate/20170407140450_add_index_to_next_run_at_and_active.rb deleted file mode 100644 index 0bde4f69b3b..00000000000 --- a/db/migrate/20170407140450_add_index_to_next_run_at_and_active.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexToNextRunAtAndActive < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_trigger_schedules, [:active, :next_run_at] - end - - def down - remove_concurrent_index :ci_trigger_schedules, [:active, :next_run_at] - end -end diff --git a/db/migrate/20170410133135_add_version_field_to_markdown_cache.rb b/db/migrate/20170410133135_add_version_field_to_markdown_cache.rb deleted file mode 100644 index c019e0627d3..00000000000 --- a/db/migrate/20170410133135_add_version_field_to_markdown_cache.rb +++ /dev/null @@ -1,25 +0,0 @@ -class AddVersionFieldToMarkdownCache < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - %i[ - abuse_reports - appearances - application_settings - broadcast_messages - issues - labels - merge_requests - milestones - namespaces - notes - projects - releases - snippets - ].each do |table| - add_column table, :cached_markdown_version, :integer, limit: 4 - end - end -end diff --git a/db/migrate/20170413035209_add_preferred_language_to_users.rb b/db/migrate/20170413035209_add_preferred_language_to_users.rb deleted file mode 100644 index 5b5f00ea60f..00000000000 --- a/db/migrate/20170413035209_add_preferred_language_to_users.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPreferredLanguageToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - add_column :users, :preferred_language, :string - end - - def down - remove_column :users, :preferred_language - end -end diff --git a/db/migrate/20170418103908_delete_orphan_notification_settings.rb b/db/migrate/20170418103908_delete_orphan_notification_settings.rb deleted file mode 100644 index c99729b9127..00000000000 --- a/db/migrate/20170418103908_delete_orphan_notification_settings.rb +++ /dev/null @@ -1,24 +0,0 @@ -class DeleteOrphanNotificationSettings < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute("DELETE FROM notification_settings WHERE EXISTS (SELECT true FROM (#{orphan_notification_settings}) AS ns WHERE ns.id = notification_settings.id)") - end - - def down - # This is a no-op method to make the migration reversible. - # If someone is trying to rollback for other reasons, we should not throw an Exception. - # raise ActiveRecord::IrreversibleMigration - end - - def orphan_notification_settings - <<-SQL - SELECT notification_settings.id - FROM notification_settings - LEFT OUTER JOIN namespaces - ON namespaces.id = notification_settings.source_id - WHERE notification_settings.source_type = 'Namespace' - AND namespaces.id IS NULL - SQL - end -end diff --git a/db/migrate/20170419001229_add_index_to_system_note_metadata.rb b/db/migrate/20170419001229_add_index_to_system_note_metadata.rb deleted file mode 100644 index 59cd55395fc..00000000000 --- a/db/migrate/20170419001229_add_index_to_system_note_metadata.rb +++ /dev/null @@ -1,17 +0,0 @@ -class AddIndexToSystemNoteMetadata < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # MySQL automatically creates an index on a foreign-key constraint; PostgreSQL does not - add_concurrent_index :system_note_metadata, :note_id, unique: true if Gitlab::Database.postgresql? - end - - def down - remove_concurrent_index :system_note_metadata, :note_id, unique: true if Gitlab::Database.postgresql? - end -end diff --git a/db/migrate/20170421102337_remove_nil_type_services.rb b/db/migrate/20170421102337_remove_nil_type_services.rb deleted file mode 100644 index 561eddf69e0..00000000000 --- a/db/migrate/20170421102337_remove_nil_type_services.rb +++ /dev/null @@ -1,12 +0,0 @@ -class RemoveNilTypeServices < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute <<-SQL - DELETE FROM services WHERE type IS NULL OR type = ''; - SQL - end - - def down - end -end diff --git a/db/migrate/20170423064036_add_index_on_ci_builds_updated_at.rb b/db/migrate/20170423064036_add_index_on_ci_builds_updated_at.rb deleted file mode 100644 index 76252378c2e..00000000000 --- a/db/migrate/20170423064036_add_index_on_ci_builds_updated_at.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexOnCiBuildsUpdatedAt < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, :updated_at - end - - def down - remove_concurrent_index :ci_builds, :updated_at if index_exists?(:ci_builds, :updated_at) - end -end diff --git a/db/migrate/20170424095707_add_index_on_ci_builds_user_id.rb b/db/migrate/20170424095707_add_index_on_ci_builds_user_id.rb deleted file mode 100644 index ab2501da941..00000000000 --- a/db/migrate/20170424095707_add_index_on_ci_builds_user_id.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexOnCiBuildsUserId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, :user_id - end - - def down - remove_concurrent_index :ci_builds, :user_id if index_exists?(:ci_builds, :user_id) - end -end diff --git a/db/migrate/20170424142900_add_index_to_web_hooks_type.rb b/db/migrate/20170424142900_add_index_to_web_hooks_type.rb deleted file mode 100644 index 1c56c1ed65a..00000000000 --- a/db/migrate/20170424142900_add_index_to_web_hooks_type.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddIndexToWebHooksType < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :web_hooks, :type - end - - def down - remove_concurrent_index :web_hooks, :type - end -end diff --git a/db/migrate/20170425112128_create_pipeline_schedules_table.rb b/db/migrate/20170425112128_create_pipeline_schedules_table.rb deleted file mode 100644 index e66e81b34be..00000000000 --- a/db/migrate/20170425112128_create_pipeline_schedules_table.rb +++ /dev/null @@ -1,29 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreatePipelineSchedulesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - create_table :ci_pipeline_schedules do |t| - t.string :description - t.string :ref - t.string :cron - t.string :cron_timezone - t.datetime :next_run_at - t.integer :project_id - t.integer :owner_id - t.boolean :active, default: true - t.datetime :deleted_at - - t.timestamps null: true - end - - add_index(:ci_pipeline_schedules, :project_id) - add_index(:ci_pipeline_schedules, [:next_run_at, :active]) - end - - def down - drop_table :ci_pipeline_schedules - end -end diff --git a/db/migrate/20170425112628_remove_foreigh_key_ci_trigger_schedules.rb b/db/migrate/20170425112628_remove_foreigh_key_ci_trigger_schedules.rb deleted file mode 100644 index d89c4c61cbe..00000000000 --- a/db/migrate/20170425112628_remove_foreigh_key_ci_trigger_schedules.rb +++ /dev/null @@ -1,23 +0,0 @@ -class RemoveForeighKeyCiTriggerSchedules < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - if fk_on_trigger_schedules? - remove_foreign_key :ci_trigger_schedules, column: :trigger_id - end - end - - def down - # no op, the foreign key should not have been here - end - - private - - # Not made more generic and lifted to the helpers as Rails 5 will provide - # such an API - def fk_on_trigger_schedules? - connection.foreign_keys(:ci_trigger_schedules).include?("ci_triggers") - end -end diff --git a/db/migrate/20170425114731_add_pipeline_schedule_id_to_pipelines.rb b/db/migrate/20170425114731_add_pipeline_schedule_id_to_pipelines.rb deleted file mode 100644 index da16d89febc..00000000000 --- a/db/migrate/20170425114731_add_pipeline_schedule_id_to_pipelines.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddPipelineScheduleIdToPipelines < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_pipelines, :pipeline_schedule_id, :integer - end -end diff --git a/db/migrate/20170426175636_fill_missing_uuid_on_application_settings.rb b/db/migrate/20170426175636_fill_missing_uuid_on_application_settings.rb deleted file mode 100644 index eeeb216f32c..00000000000 --- a/db/migrate/20170426175636_fill_missing_uuid_on_application_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -class FillMissingUuidOnApplicationSettings < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute("UPDATE application_settings SET uuid = #{quote(SecureRandom.uuid)} WHERE uuid is NULL") - end - - def down - end -end diff --git a/db/migrate/20170426181740_add_index_on_ci_runners_contacted_at.rb b/db/migrate/20170426181740_add_index_on_ci_runners_contacted_at.rb deleted file mode 100644 index e14b2eb4c8a..00000000000 --- a/db/migrate/20170426181740_add_index_on_ci_runners_contacted_at.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexOnCiRunnersContactedAt < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_runners, :contacted_at - end - - def down - remove_concurrent_index :ci_runners, :contacted_at if index_exists?(:ci_runners, :contacted_at) - end -end diff --git a/db/migrate/20170427103502_create_web_hook_logs.rb b/db/migrate/20170427103502_create_web_hook_logs.rb deleted file mode 100644 index a7a061e7bae..00000000000 --- a/db/migrate/20170427103502_create_web_hook_logs.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable all -class CreateWebHookLogs < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :web_hook_logs do |t| - t.references :web_hook, null: false, index: true, foreign_key: { on_delete: :cascade } - - t.string :trigger - t.string :url - t.text :request_headers - t.text :request_data - t.text :response_headers - t.text :response_body - t.string :response_status - t.float :execution_duration - t.string :internal_error_message - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20170427215854_create_redirect_routes.rb b/db/migrate/20170427215854_create_redirect_routes.rb deleted file mode 100644 index 069c9b39d37..00000000000 --- a/db/migrate/20170427215854_create_redirect_routes.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateRedirectRoutes < ActiveRecord::Migration[4.2] - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - create_table :redirect_routes do |t| - t.integer :source_id, null: false - t.string :source_type, null: false - t.string :path, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20170428064307_add_column_delete_error_to_projects.rb b/db/migrate/20170428064307_add_column_delete_error_to_projects.rb deleted file mode 100644 index bef0373309c..00000000000 --- a/db/migrate/20170428064307_add_column_delete_error_to_projects.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddColumnDeleteErrorToProjects < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :projects, :delete_error, :text - end -end diff --git a/db/migrate/20170502065653_make_auto_cancel_pending_pipelines_on_by_default.rb b/db/migrate/20170502065653_make_auto_cancel_pending_pipelines_on_by_default.rb deleted file mode 100644 index e51a790de4d..00000000000 --- a/db/migrate/20170502065653_make_auto_cancel_pending_pipelines_on_by_default.rb +++ /dev/null @@ -1,13 +0,0 @@ -class MakeAutoCancelPendingPipelinesOnByDefault < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - change_column_default(:projects, :auto_cancel_pending_pipelines, 1) - end - - def down - change_column_default(:projects, :auto_cancel_pending_pipelines, 0) - end -end diff --git a/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb b/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb deleted file mode 100644 index 1c5d4997d40..00000000000 --- a/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative 'markdown_cache_limits_to_mysql' diff --git a/db/migrate/20170502135553_create_index_ci_pipelines_auto_canceled_by_id.rb b/db/migrate/20170502135553_create_index_ci_pipelines_auto_canceled_by_id.rb deleted file mode 100644 index 7acae645c7b..00000000000 --- a/db/migrate/20170502135553_create_index_ci_pipelines_auto_canceled_by_id.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateIndexCiPipelinesAutoCanceledById < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # MySQL would already have the index - unless index_exists?(:ci_pipelines, :auto_canceled_by_id) - add_concurrent_index(:ci_pipelines, :auto_canceled_by_id) - end - end - - def down - # We cannot remove index for MySQL because it's needed for foreign key - if Gitlab::Database.postgresql? - remove_concurrent_index(:ci_pipelines, :auto_canceled_by_id) - end - end -end diff --git a/db/migrate/20170502140503_create_index_ci_builds_auto_canceled_by_id.rb b/db/migrate/20170502140503_create_index_ci_builds_auto_canceled_by_id.rb deleted file mode 100644 index f5148f6fdb8..00000000000 --- a/db/migrate/20170502140503_create_index_ci_builds_auto_canceled_by_id.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateIndexCiBuildsAutoCanceledById < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # MySQL would already have the index - unless index_exists?(:ci_builds, :auto_canceled_by_id) - add_concurrent_index(:ci_builds, :auto_canceled_by_id) - end - end - - def down - # We cannot remove index for MySQL because it's needed for foreign key - if Gitlab::Database.postgresql? - remove_concurrent_index(:ci_builds, :auto_canceled_by_id) - end - end -end diff --git a/db/migrate/20170503004125_add_last_repository_updated_at_to_projects.rb b/db/migrate/20170503004125_add_last_repository_updated_at_to_projects.rb deleted file mode 100644 index 303250ff3b0..00000000000 --- a/db/migrate/20170503004125_add_last_repository_updated_at_to_projects.rb +++ /dev/null @@ -1,8 +0,0 @@ -# rubocop:disable Migration/Datetime -class AddLastRepositoryUpdatedAtToProjects < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :projects, :last_repository_updated_at, :datetime - end -end diff --git a/db/migrate/20170503004425_add_index_to_last_repository_updated_at_on_projects.rb b/db/migrate/20170503004425_add_index_to_last_repository_updated_at_on_projects.rb deleted file mode 100644 index ae54cfb39f5..00000000000 --- a/db/migrate/20170503004425_add_index_to_last_repository_updated_at_on_projects.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddIndexToLastRepositoryUpdatedAtOnProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:projects, :last_repository_updated_at) - end - - def down - remove_concurrent_index(:projects, :last_repository_updated_at) if index_exists?(:projects, :last_repository_updated_at) - end -end diff --git a/db/migrate/20170503004426_add_retried_to_ci_build.rb b/db/migrate/20170503004426_add_retried_to_ci_build.rb deleted file mode 100644 index ff2e0ba64c5..00000000000 --- a/db/migrate/20170503004426_add_retried_to_ci_build.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRetriedToCiBuild < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:ci_builds, :retried, :boolean) - end -end diff --git a/db/migrate/20170503021915_add_last_edited_at_and_last_edited_by_id_to_issues.rb b/db/migrate/20170503021915_add_last_edited_at_and_last_edited_by_id_to_issues.rb deleted file mode 100644 index ef527bb8007..00000000000 --- a/db/migrate/20170503021915_add_last_edited_at_and_last_edited_by_id_to_issues.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable Migration/Datetime -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLastEditedAtAndLastEditedByIdToIssues < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :issues, :last_edited_at, :timestamp - add_column :issues, :last_edited_by_id, :integer - end -end diff --git a/db/migrate/20170503022548_add_last_edited_at_and_last_edited_by_id_to_merge_requests.rb b/db/migrate/20170503022548_add_last_edited_at_and_last_edited_by_id_to_merge_requests.rb deleted file mode 100644 index 19b8a9d66e7..00000000000 --- a/db/migrate/20170503022548_add_last_edited_at_and_last_edited_by_id_to_merge_requests.rb +++ /dev/null @@ -1,15 +0,0 @@ -# rubocop:disable Migration/Datetime -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLastEditedAtAndLastEditedByIdToMergeRequests < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :merge_requests, :last_edited_at, :timestamp - add_column :merge_requests, :last_edited_by_id, :integer - end -end diff --git a/db/migrate/20170503023315_add_repository_update_events_to_web_hooks.rb b/db/migrate/20170503023315_add_repository_update_events_to_web_hooks.rb deleted file mode 100644 index 4824c404ec7..00000000000 --- a/db/migrate/20170503023315_add_repository_update_events_to_web_hooks.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddRepositoryUpdateEventsToWebHooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :web_hooks, :repository_update_events, :boolean, default: false, allow_null: false - end - - def down - remove_column :web_hooks, :repository_update_events - end -end diff --git a/db/migrate/20170503114228_add_description_to_snippets.rb b/db/migrate/20170503114228_add_description_to_snippets.rb deleted file mode 100644 index 78151ed9ff6..00000000000 --- a/db/migrate/20170503114228_add_description_to_snippets.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddDescriptionToSnippets < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def change - add_column :snippets, :description, :text - add_column :snippets, :description_html, :text - end -end diff --git a/db/migrate/20170503140201_reschedule_project_authorizations.rb b/db/migrate/20170503140201_reschedule_project_authorizations.rb deleted file mode 100644 index aa940bed2d3..00000000000 --- a/db/migrate/20170503140201_reschedule_project_authorizations.rb +++ /dev/null @@ -1,44 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RescheduleProjectAuthorizations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class User < ActiveRecord::Base - self.table_name = 'users' - end - - def up - offset = 0 - batch = 5000 - start = Time.now - - loop do - relation = User.where('id > ?', offset) - user_ids = relation.limit(batch).reorder(id: :asc).pluck(:id) - - break if user_ids.empty? - - offset = user_ids.last - - # This will schedule each batch 5 minutes after the previous batch was - # scheduled. This smears out the load over time, instead of immediately - # scheduling a million jobs. - Sidekiq::Client.push_bulk( - 'queue' => 'authorized_projects', - 'args' => user_ids.zip, - 'class' => 'AuthorizedProjectsWorker', - 'at' => start.to_i - ) - - start += 5.minutes - end - end - - def down - end -end diff --git a/db/migrate/20170503140202_turn_nested_groups_into_regular_groups_for_mysql.rb b/db/migrate/20170503140202_turn_nested_groups_into_regular_groups_for_mysql.rb deleted file mode 100644 index 65b2c6a57be..00000000000 --- a/db/migrate/20170503140202_turn_nested_groups_into_regular_groups_for_mysql.rb +++ /dev/null @@ -1,116 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# This migration depends on code external to it. For example, it relies on -# updating a namespace to also rename directories (uploads, GitLab pages, etc). -# The alternative is to copy hundreds of lines of code into this migration, -# adjust them where needed, etc; something which doesn't work well at all. -class TurnNestedGroupsIntoRegularGroupsForMysql < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def run_migration? - Gitlab::Database.mysql? - end - - def up - return unless run_migration? - - # For all sub-groups we need to give the right people access. We do this as - # follows: - # - # 1. Get all the ancestors for the current namespace - # 2. Get all the members of these namespaces, along with their higher access - # level - # 3. Give these members access to the current namespace - Namespace.unscoped.where('parent_id IS NOT NULL').find_each do |namespace| - rows = [] - existing = namespace.members.pluck(:user_id) - - all_members_for(namespace).each do |member| - next if existing.include?(member[:user_id]) - - rows << { - access_level: member[:access_level], - source_id: namespace.id, - source_type: 'Namespace', - user_id: member[:user_id], - notification_level: 3, # global - type: 'GroupMember', - created_at: Time.current, - updated_at: Time.current - } - end - - bulk_insert_members(rows) - - namespace.update!(parent_id: nil, path: new_path_for(namespace)) - end - end - - def down - # There is no way to go back from regular groups to nested groups. - end - - # Generates a new (unique) path for a namespace. - def new_path_for(namespace) - counter = 1 - base = namespace.full_path.tr('/', '-') - new_path = base - - while Namespace.unscoped.where(path: new_path).exists? - new_path = base + "-#{counter}" - counter += 1 - end - - new_path - end - - # Returns an Array containing all the ancestors of the current namespace. - # - # This method is not particularly efficient, but it's probably still faster - # than using the "routes" table. Most importantly of all, it _only_ depends - # on the namespaces table and the "parent_id" column. - def ancestors_for(namespace) - ancestors = [] - current = namespace - - while current&.parent_id - # We're using find_by(id: ...) here to deal with cases where the - # parent_id may point to a missing row. - current = Namespace.unscoped.select([:id, :parent_id]) - .find_by(id: current.parent_id) - - ancestors << current.id if current - end - - ancestors - end - - # Returns a relation containing all the members that have access to any of - # the current namespace's parent namespaces. - def all_members_for(namespace) - Member - .unscoped - .select(['user_id', 'MAX(access_level) AS access_level']) - .where(source_type: 'Namespace', source_id: ancestors_for(namespace)) - .group(:user_id) - end - - def bulk_insert_members(rows) - return if rows.empty? - - keys = rows.first.keys - - tuples = rows.map do |row| - row.map { |(_, value)| connection.quote(value) } - end - - execute <<-EOF.strip_heredoc - INSERT INTO members (#{keys.join(', ')}) - VALUES #{tuples.map { |tuple| "(#{tuple.join(', ')})" }.join(', ')} - EOF - end -end diff --git a/db/migrate/20170503184421_add_index_to_redirect_routes.rb b/db/migrate/20170503184421_add_index_to_redirect_routes.rb deleted file mode 100644 index 6320d4bbc99..00000000000 --- a/db/migrate/20170503184421_add_index_to_redirect_routes.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexToRedirectRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:redirect_routes, :path, unique: true) - add_concurrent_index(:redirect_routes, [:source_type, :source_id]) - end - - def down - remove_concurrent_index(:redirect_routes, :path) if index_exists?(:redirect_routes, :path) - remove_concurrent_index(:redirect_routes, [:source_type, :source_id]) if index_exists?(:redirect_routes, [:source_type, :source_id]) - end -end diff --git a/db/migrate/20170503185032_index_redirect_routes_path_for_like.rb b/db/migrate/20170503185032_index_redirect_routes_path_for_like.rb deleted file mode 100644 index 5d06fd0511c..00000000000 --- a/db/migrate/20170503185032_index_redirect_routes_path_for_like.rb +++ /dev/null @@ -1,28 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IndexRedirectRoutesPathForLike < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - INDEX_NAME = 'index_redirect_routes_on_path_text_pattern_ops' - - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - unless index_exists?(:redirect_routes, :path, name: INDEX_NAME) - execute("CREATE INDEX CONCURRENTLY #{INDEX_NAME} ON redirect_routes (path varchar_pattern_ops);") - end - end - - def down - return unless Gitlab::Database.postgresql? - return unless index_exists?(:redirect_routes, :path, name: INDEX_NAME) - - remove_concurrent_index_by_name(:redirect_routes, INDEX_NAME) - end -end diff --git a/db/migrate/20170504102911_add_clientside_sentry_to_application_settings.rb b/db/migrate/20170504102911_add_clientside_sentry_to_application_settings.rb deleted file mode 100644 index 4659f694020..00000000000 --- a/db/migrate/20170504102911_add_clientside_sentry_to_application_settings.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddClientsideSentryToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :clientside_sentry_enabled, :boolean, default: false - add_column :application_settings, :clientside_sentry_dsn, :string - end - - def down - remove_columns :application_settings, :clientside_sentry_enabled, :clientside_sentry_dsn - end -end diff --git a/db/migrate/20170504182103_add_index_project_group_links_group_id.rb b/db/migrate/20170504182103_add_index_project_group_links_group_id.rb deleted file mode 100644 index 5b1c14e66dd..00000000000 --- a/db/migrate/20170504182103_add_index_project_group_links_group_id.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexProjectGroupLinksGroupId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :project_group_links, :group_id - end - - def down - remove_concurrent_index :project_group_links, :group_id - end -end diff --git a/db/migrate/20170506085040_add_index_to_pipeline_pipeline_schedule_id.rb b/db/migrate/20170506085040_add_index_to_pipeline_pipeline_schedule_id.rb deleted file mode 100644 index 9d8cc8a83a2..00000000000 --- a/db/migrate/20170506085040_add_index_to_pipeline_pipeline_schedule_id.rb +++ /dev/null @@ -1,19 +0,0 @@ -class AddIndexToPipelinePipelineScheduleId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - unless index_exists?(:ci_pipelines, :pipeline_schedule_id) - add_concurrent_index(:ci_pipelines, :pipeline_schedule_id) - end - end - - def down - if index_exists?(:ci_pipelines, :pipeline_schedule_id) - remove_concurrent_index(:ci_pipelines, :pipeline_schedule_id) - end - end -end diff --git a/db/migrate/20170506091344_add_foreign_key_to_pipeline_schedules.rb b/db/migrate/20170506091344_add_foreign_key_to_pipeline_schedules.rb deleted file mode 100644 index 244e41e2f07..00000000000 --- a/db/migrate/20170506091344_add_foreign_key_to_pipeline_schedules.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddForeignKeyToPipelineSchedules < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key :ci_pipeline_schedules, :projects, column: :project_id - end - - def down - remove_foreign_key :ci_pipeline_schedules, :projects - end -end diff --git a/db/migrate/20170506185517_add_foreign_key_pipeline_schedules_and_pipelines.rb b/db/migrate/20170506185517_add_foreign_key_pipeline_schedules_and_pipelines.rb deleted file mode 100644 index 50364cac259..00000000000 --- a/db/migrate/20170506185517_add_foreign_key_pipeline_schedules_and_pipelines.rb +++ /dev/null @@ -1,23 +0,0 @@ -class AddForeignKeyPipelineSchedulesAndPipelines < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - on_delete = - if Gitlab::Database.mysql? - :nullify - else - 'SET NULL' - end - - add_concurrent_foreign_key :ci_pipelines, :ci_pipeline_schedules, - column: :pipeline_schedule_id, on_delete: on_delete - end - - def down - remove_foreign_key :ci_pipelines, column: :pipeline_schedule_id - end -end diff --git a/db/migrate/20170507205316_add_head_pipeline_id_to_merge_requests.rb b/db/migrate/20170507205316_add_head_pipeline_id_to_merge_requests.rb deleted file mode 100644 index adfe6559084..00000000000 --- a/db/migrate/20170507205316_add_head_pipeline_id_to_merge_requests.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddHeadPipelineIdToMergeRequests < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :merge_requests, :head_pipeline_id, :integer - end -end diff --git a/db/migrate/20170508153950_add_not_null_contraints_to_ci_variables.rb b/db/migrate/20170508153950_add_not_null_contraints_to_ci_variables.rb deleted file mode 100644 index 2a0c7132bfd..00000000000 --- a/db/migrate/20170508153950_add_not_null_contraints_to_ci_variables.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddNotNullContraintsToCiVariables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - change_column(:ci_variables, :key, :string, null: false) - change_column(:ci_variables, :project_id, :integer, null: false) - end - - def down - # no op - end -end diff --git a/db/migrate/20170508190732_add_foreign_key_to_ci_variables.rb b/db/migrate/20170508190732_add_foreign_key_to_ci_variables.rb deleted file mode 100644 index 305366b2171..00000000000 --- a/db/migrate/20170508190732_add_foreign_key_to_ci_variables.rb +++ /dev/null @@ -1,24 +0,0 @@ -class AddForeignKeyToCiVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - execute <<~SQL - DELETE FROM ci_variables - WHERE NOT EXISTS ( - SELECT true - FROM projects - WHERE projects.id = ci_variables.project_id - ) - SQL - - add_concurrent_foreign_key(:ci_variables, :projects, column: :project_id) - end - - def down - remove_foreign_key(:ci_variables, column: :project_id) - end -end diff --git a/db/migrate/20170511082759_rename_web_hooks_build_events_to_job_events.rb b/db/migrate/20170511082759_rename_web_hooks_build_events_to_job_events.rb deleted file mode 100644 index 3a44057d948..00000000000 --- a/db/migrate/20170511082759_rename_web_hooks_build_events_to_job_events.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameWebHooksBuildEventsToJobEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - rename_column_concurrently :web_hooks, :build_events, :job_events - end - - def down - cleanup_concurrent_column_rename :web_hooks, :job_events, :build_events - end -end diff --git a/db/migrate/20170511083824_rename_services_build_events_to_job_events.rb b/db/migrate/20170511083824_rename_services_build_events_to_job_events.rb deleted file mode 100644 index 713adde76ef..00000000000 --- a/db/migrate/20170511083824_rename_services_build_events_to_job_events.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameServicesBuildEventsToJobEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - rename_column_concurrently :services, :build_events, :job_events - end - - def down - cleanup_concurrent_column_rename :services, :job_events, :build_events - end -end diff --git a/db/migrate/20170516153305_migrate_assignee_to_separate_table.rb b/db/migrate/20170516153305_migrate_assignee_to_separate_table.rb deleted file mode 100644 index 0ed45775421..00000000000 --- a/db/migrate/20170516153305_migrate_assignee_to_separate_table.rb +++ /dev/null @@ -1,83 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateAssigneeToSeparateTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - drop_table(:issue_assignees) if table_exists?(:issue_assignees) - - if Gitlab::Database.mysql? - execute <<-EOF - CREATE TABLE issue_assignees AS - SELECT assignee_id AS user_id, id AS issue_id FROM issues WHERE assignee_id IS NOT NULL - EOF - else - ActiveRecord::Base.transaction do - execute('LOCK TABLE issues IN EXCLUSIVE MODE') - - execute <<-EOF - CREATE TABLE issue_assignees AS - SELECT assignee_id AS user_id, id AS issue_id FROM issues WHERE assignee_id IS NOT NULL - EOF - - execute <<-EOF - CREATE OR REPLACE FUNCTION replicate_assignee_id() - RETURNS trigger AS - $BODY$ - BEGIN - if OLD IS NOT NULL AND OLD.assignee_id IS NOT NULL THEN - DELETE FROM issue_assignees WHERE issue_id = OLD.id; - END IF; - - if NEW.assignee_id IS NOT NULL THEN - INSERT INTO issue_assignees (user_id, issue_id) VALUES (NEW.assignee_id, NEW.id); - END IF; - - RETURN NEW; - END; - $BODY$ - LANGUAGE 'plpgsql' - VOLATILE; - - CREATE TRIGGER replicate_assignee_id - BEFORE INSERT OR UPDATE OF assignee_id - ON issues - FOR EACH ROW EXECUTE PROCEDURE replicate_assignee_id(); - EOF - end - end - end - - def down - drop_table(:issue_assignees) if table_exists?(:issue_assignees) - - if Gitlab::Database.postgresql? - execute <<-EOF - DROP TRIGGER IF EXISTS replicate_assignee_id ON issues; - DROP FUNCTION IF EXISTS replicate_assignee_id(); - EOF - end - end -end diff --git a/db/migrate/20170516183131_add_indices_to_issue_assignees.rb b/db/migrate/20170516183131_add_indices_to_issue_assignees.rb deleted file mode 100644 index 6877fe9ff98..00000000000 --- a/db/migrate/20170516183131_add_indices_to_issue_assignees.rb +++ /dev/null @@ -1,41 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndicesToIssueAssignees < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - add_concurrent_index :issue_assignees, [:issue_id, :user_id], unique: true, name: 'index_issue_assignees_on_issue_id_and_user_id' - add_concurrent_index :issue_assignees, :user_id, name: 'index_issue_assignees_on_user_id' - add_concurrent_foreign_key :issue_assignees, :users, column: :user_id, on_delete: :cascade - add_concurrent_foreign_key :issue_assignees, :issues, column: :issue_id, on_delete: :cascade - end - - def down - remove_foreign_key :issue_assignees, column: :user_id - remove_foreign_key :issue_assignees, column: :issue_id - remove_concurrent_index :issue_assignees, [:issue_id, :user_id] if index_exists?(:issue_assignees, [:issue_id, :user_id]) - remove_concurrent_index :issue_assignees, :user_id if index_exists?(:issue_assignees, :user_id) - end -end diff --git a/db/migrate/20170519102115_add_prometheus_settings_to_metrics_settings.rb b/db/migrate/20170519102115_add_prometheus_settings_to_metrics_settings.rb deleted file mode 100644 index 9c8f58104bd..00000000000 --- a/db/migrate/20170519102115_add_prometheus_settings_to_metrics_settings.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddPrometheusSettingsToMetricsSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:application_settings, :prometheus_metrics_enabled, :boolean, - default: false, allow_null: false) - end - - def down - remove_column(:application_settings, :prometheus_metrics_enabled) - end -end diff --git a/db/migrate/20170521184006_add_change_position_to_notes.rb b/db/migrate/20170521184006_add_change_position_to_notes.rb deleted file mode 100644 index f0ca3a2a9ea..00000000000 --- a/db/migrate/20170521184006_add_change_position_to_notes.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddChangePositionToNotes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :notes, :change_position, :text - end -end diff --git a/db/migrate/20170523091700_add_rss_token_to_users.rb b/db/migrate/20170523091700_add_rss_token_to_users.rb deleted file mode 100644 index e1bcd9b3fee..00000000000 --- a/db/migrate/20170523091700_add_rss_token_to_users.rb +++ /dev/null @@ -1,19 +0,0 @@ -class AddRssTokenToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :users, :rss_token, :string - - add_concurrent_index :users, :rss_token - end - - def down - remove_concurrent_index :users, :rss_token if index_exists? :users, :rss_token - - remove_column :users, :rss_token - end -end diff --git a/db/migrate/20170523121229_create_conversational_development_index_metrics.rb b/db/migrate/20170523121229_create_conversational_development_index_metrics.rb deleted file mode 100644 index 5f8c0d07e3c..00000000000 --- a/db/migrate/20170523121229_create_conversational_development_index_metrics.rb +++ /dev/null @@ -1,40 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreateConversationalDevelopmentIndexMetrics < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :conversational_development_index_metrics do |t| - t.float :leader_issues, null: false - t.float :instance_issues, null: false - - t.float :leader_notes, null: false - t.float :instance_notes, null: false - - t.float :leader_milestones, null: false - t.float :instance_milestones, null: false - - t.float :leader_boards, null: false - t.float :instance_boards, null: false - - t.float :leader_merge_requests, null: false - t.float :instance_merge_requests, null: false - - t.float :leader_ci_pipelines, null: false - t.float :instance_ci_pipelines, null: false - - t.float :leader_environments, null: false - t.float :instance_environments, null: false - - t.float :leader_deployments, null: false - t.float :instance_deployments, null: false - - t.float :leader_projects_prometheus_active, null: false - t.float :instance_projects_prometheus_active, null: false - - t.float :leader_service_desk_issues, null: false - t.float :instance_service_desk_issues, null: false - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20170524125940_add_source_to_ci_pipeline.rb b/db/migrate/20170524125940_add_source_to_ci_pipeline.rb deleted file mode 100644 index 81358e7ce3d..00000000000 --- a/db/migrate/20170524125940_add_source_to_ci_pipeline.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddSourceToCiPipeline < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_pipelines, :source, :integer - end -end diff --git a/db/migrate/20170524161101_add_protected_to_ci_variables.rb b/db/migrate/20170524161101_add_protected_to_ci_variables.rb deleted file mode 100644 index 6125ea5d5a8..00000000000 --- a/db/migrate/20170524161101_add_protected_to_ci_variables.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddProtectedToCiVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:ci_variables, :protected, :boolean, default: false) - end - - def down - remove_column(:ci_variables, :protected) - end -end diff --git a/db/migrate/20170525130346_create_group_variables_table.rb b/db/migrate/20170525130346_create_group_variables_table.rb deleted file mode 100644 index 6eae7eff7bd..00000000000 --- a/db/migrate/20170525130346_create_group_variables_table.rb +++ /dev/null @@ -1,23 +0,0 @@ -class CreateGroupVariablesTable < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - create_table :ci_group_variables do |t| - t.string :key, null: false - t.text :value - t.text :encrypted_value - t.string :encrypted_value_salt - t.string :encrypted_value_iv - t.integer :group_id, null: false - t.boolean :protected, default: false, null: false - - t.timestamps_with_timezone null: false - end - - add_index :ci_group_variables, [:group_id, :key], unique: true - end - - def down - drop_table :ci_group_variables - end -end diff --git a/db/migrate/20170525130758_add_foreign_key_to_group_variables.rb b/db/migrate/20170525130758_add_foreign_key_to_group_variables.rb deleted file mode 100644 index f1f51a1dda3..00000000000 --- a/db/migrate/20170525130758_add_foreign_key_to_group_variables.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddForeignKeyToGroupVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key :ci_group_variables, :namespaces, column: :group_id - end - - def down - remove_foreign_key :ci_group_variables, column: :group_id - end -end diff --git a/db/migrate/20170525132202_create_pipeline_stages.rb b/db/migrate/20170525132202_create_pipeline_stages.rb deleted file mode 100644 index 0a6400fde90..00000000000 --- a/db/migrate/20170525132202_create_pipeline_stages.rb +++ /dev/null @@ -1,26 +0,0 @@ -# rubocop:disable Migration/Timestamps -class CreatePipelineStages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :ci_stages do |t| - t.integer :project_id - t.integer :pipeline_id - t.timestamps null: true - t.string :name - end - - add_concurrent_foreign_key :ci_stages, :projects, column: :project_id, on_delete: :cascade - add_concurrent_foreign_key :ci_stages, :ci_pipelines, column: :pipeline_id, on_delete: :cascade - add_concurrent_index :ci_stages, :project_id - add_concurrent_index :ci_stages, :pipeline_id - end - - def down - drop_table :ci_stages - end -end diff --git a/db/migrate/20170525174156_create_feature_tables.rb b/db/migrate/20170525174156_create_feature_tables.rb deleted file mode 100644 index e1eaaff8d35..00000000000 --- a/db/migrate/20170525174156_create_feature_tables.rb +++ /dev/null @@ -1,26 +0,0 @@ -class CreateFeatureTables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def self.up - create_table :features do |t| - t.string :key, null: false - t.timestamps null: false - end - add_index :features, :key, unique: true - - create_table :feature_gates do |t| - t.string :feature_key, null: false - t.string :key, null: false - t.string :value - t.timestamps null: false - end - add_index :feature_gates, [:feature_key, :key, :value], unique: true - end - - def self.down - drop_table :feature_gates - drop_table :features - end -end diff --git a/db/migrate/20170526185602_add_stage_id_to_ci_builds.rb b/db/migrate/20170526185602_add_stage_id_to_ci_builds.rb deleted file mode 100644 index 6958557d118..00000000000 --- a/db/migrate/20170526185602_add_stage_id_to_ci_builds.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddStageIdToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - add_column :ci_builds, :stage_id, :integer - end - - def down - remove_column :ci_builds, :stage_id, :integer - end -end diff --git a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb b/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb deleted file mode 100644 index b4658bc4017..00000000000 --- a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb +++ /dev/null @@ -1,198 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - CONCURRENCY = 4 - - disable_ddl_transaction! - - # The tables/columns for which to remove orphans and add foreign keys. Order - # matters as some tables/columns should be processed before others. - TABLES = [ - [:boards, :projects, :project_id], - [:lists, :labels, :label_id], - [:lists, :boards, :board_id], - [:services, :projects, :project_id], - [:forked_project_links, :projects, :forked_to_project_id], - [:merge_requests, :projects, :target_project_id], - [:labels, :projects, :project_id], - [:issues, :projects, :project_id], - [:events, :projects, :project_id], - [:milestones, :projects, :project_id], - [:notes, :projects, :project_id], - [:snippets, :projects, :project_id], - [:web_hooks, :projects, :project_id], - [:protected_branch_merge_access_levels, :protected_branches, :protected_branch_id], - [:protected_branch_push_access_levels, :protected_branches, :protected_branch_id], - [:protected_branches, :projects, :project_id], - [:protected_tags, :projects, :project_id], - [:deploy_keys_projects, :projects, :project_id], - [:users_star_projects, :projects, :project_id], - [:releases, :projects, :project_id], - [:project_group_links, :projects, :project_id], - [:pages_domains, :projects, :project_id], - [:todos, :projects, :project_id], - [:project_import_data, :projects, :project_id], - [:project_features, :projects, :project_id], - [:ci_builds, :projects, :project_id], - [:ci_pipelines, :projects, :project_id], - [:ci_runner_projects, :projects, :project_id], - [:ci_triggers, :projects, :project_id], - [:environments, :projects, :project_id], - [:deployments, :projects, :project_id] - ] - - def up - # These existing foreign keys don't have an "ON DELETE CASCADE" clause. - remove_foreign_key_without_error(:boards, :project_id) - remove_foreign_key_without_error(:lists, :label_id) - remove_foreign_key_without_error(:lists, :board_id) - remove_foreign_key_without_error(:protected_branch_merge_access_levels, - :protected_branch_id) - - remove_foreign_key_without_error(:protected_branch_push_access_levels, - :protected_branch_id) - - remove_orphaned_rows - add_foreign_keys - - # These columns are not indexed yet, meaning a cascading delete would take - # forever. - add_index_if_not_exists(:project_group_links, :project_id) - add_index_if_not_exists(:pages_domains, :project_id) - end - - def down - TABLES.each do |(source, _, column)| - remove_foreign_key_without_error(source, column) - end - - add_foreign_key_if_not_exists(:boards, :projects, column: :project_id) - add_foreign_key_if_not_exists(:lists, :labels, column: :label_id) - add_foreign_key_if_not_exists(:lists, :boards, column: :board_id) - - add_foreign_key_if_not_exists(:protected_branch_merge_access_levels, - :protected_branches, - column: :protected_branch_id) - - add_foreign_key_if_not_exists(:protected_branch_push_access_levels, - :protected_branches, - column: :protected_branch_id) - - remove_index_without_error(:project_group_links, :project_id) - remove_index_without_error(:pages_domains, :project_id) - end - - def add_foreign_keys - TABLES.each do |(source, target, column)| - add_foreign_key_if_not_exists(source, target, column: column) - end - end - - # Removes orphans from various tables concurrently. - def remove_orphaned_rows - Gitlab::Database.with_connection_pool(CONCURRENCY) do |pool| - queues = queues_for_rows(TABLES) - - threads = queues.map do |queue| - Thread.new do - pool.with_connection do |connection| - Thread.current[:foreign_key_connection] = connection - - # Disables statement timeouts for the current connection. This is - # necessary as removing of orphaned data might otherwise exceed the - # statement timeout. - disable_statement_timeout do - remove_orphans(*queue.pop) until queue.empty? - - steal_from_queues(queues - [queue]) - end - end - end - end - - threads.each(&:join) - end - end - - def steal_from_queues(queues) - loop do - stolen = false - - queues.each do |queue| - # Stealing is racy so it's possible a pop might be called on an - # already-empty queue. - - remove_orphans(*queue.pop(true)) - stolen = true - rescue ThreadError - end - - break unless stolen - end - end - - def remove_orphans(source, target, column) - quoted_source = quote_table_name(source) - quoted_target = quote_table_name(target) - quoted_column = quote_column_name(column) - - execute <<-EOF.strip_heredoc - DELETE FROM #{quoted_source} - WHERE NOT EXISTS ( - SELECT true - FROM #{quoted_target} - WHERE #{quoted_target}.id = #{quoted_source}.#{quoted_column} - ) - AND #{quoted_source}.#{quoted_column} IS NOT NULL - EOF - end - - def add_foreign_key_if_not_exists(source, target, column:) - return if foreign_key_exists?(source, target, column: column) - - add_concurrent_foreign_key(source, target, column: column) - end - - def add_index_if_not_exists(table, column) - return if index_exists?(table, column) - - add_concurrent_index(table, column) - end - - def remove_foreign_key_without_error(table, column) - remove_foreign_key(table, column: column) - rescue ArgumentError - end - - def remove_index_without_error(table, column) - remove_concurrent_index(table, column) - rescue ArgumentError - end - - def connection - # Rails memoizes connection objects, but this causes them to be shared - # amongst threads; we don't want that. - Thread.current[:foreign_key_connection] || ActiveRecord::Base.connection - end - - def queues_for_rows(rows) - queues = Array.new(CONCURRENCY) { Queue.new } - slice_size = rows.length / CONCURRENCY - - # Divide all the tuples as evenly as possible amongst the queues. - rows.each_slice(slice_size).each_with_index do |slice, index| - bucket = index % CONCURRENCY - - slice.each do |row| - queues[bucket] << row - end - end - - queues - end -end diff --git a/db/migrate/20170531180233_add_authorized_keys_enabled_to_application_settings.rb b/db/migrate/20170531180233_add_authorized_keys_enabled_to_application_settings.rb deleted file mode 100644 index f440609ff8a..00000000000 --- a/db/migrate/20170531180233_add_authorized_keys_enabled_to_application_settings.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddAuthorizedKeysEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :authorized_keys_enabled, :boolean, default: true, allow_null: false - end - - def down - remove_column :application_settings, :authorized_keys_enabled - end -end diff --git a/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb b/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb deleted file mode 100644 index 7b1a7644555..00000000000 --- a/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb +++ /dev/null @@ -1,16 +0,0 @@ -class RenameUsersLdapEmailToExternalEmail < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # rubocop:disable Migration/UpdateLargeTable - rename_column_concurrently :users, :ldap_email, :external_email - end - - def down - cleanup_concurrent_column_rename :users, :external_email, :ldap_email - end -end diff --git a/db/migrate/20170601163708_add_artifacts_store_to_ci_build.rb b/db/migrate/20170601163708_add_artifacts_store_to_ci_build.rb deleted file mode 100644 index 4c9ac821b20..00000000000 --- a/db/migrate/20170601163708_add_artifacts_store_to_ci_build.rb +++ /dev/null @@ -1,10 +0,0 @@ -class AddArtifactsStoreToCiBuild < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:ci_builds, :artifacts_file_store, :integer) - add_column(:ci_builds, :artifacts_metadata_store, :integer) - end -end diff --git a/db/migrate/20170602154736_add_help_page_hide_commercial_content_to_application_settings.rb b/db/migrate/20170602154736_add_help_page_hide_commercial_content_to_application_settings.rb deleted file mode 100644 index ff9e188d7a8..00000000000 --- a/db/migrate/20170602154736_add_help_page_hide_commercial_content_to_application_settings.rb +++ /dev/null @@ -1,10 +0,0 @@ -# rubocop:disable Migration/SaferBooleanColumn -class AddHelpPageHideCommercialContentToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :help_page_hide_commercial_content, :boolean, default: false - end -end diff --git a/db/migrate/20170602154813_add_help_page_support_url_to_application_settings.rb b/db/migrate/20170602154813_add_help_page_support_url_to_application_settings.rb deleted file mode 100644 index 388e130ab88..00000000000 --- a/db/migrate/20170602154813_add_help_page_support_url_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddHelpPageSupportUrlToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :help_page_support_url, :string - end -end diff --git a/db/migrate/20170603200744_add_email_provider_to_users.rb b/db/migrate/20170603200744_add_email_provider_to_users.rb deleted file mode 100644 index ad6e813d31b..00000000000 --- a/db/migrate/20170603200744_add_email_provider_to_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddEmailProviderToUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :users, :email_provider, :string - end -end diff --git a/db/migrate/20170606154216_add_notification_setting_columns.rb b/db/migrate/20170606154216_add_notification_setting_columns.rb deleted file mode 100644 index 3b9493e6b49..00000000000 --- a/db/migrate/20170606154216_add_notification_setting_columns.rb +++ /dev/null @@ -1,26 +0,0 @@ -class AddNotificationSettingColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - COLUMNS = [ - :new_note, - :new_issue, - :reopen_issue, - :close_issue, - :reassign_issue, - :new_merge_request, - :reopen_merge_request, - :close_merge_request, - :reassign_merge_request, - :merge_merge_request, - :failed_pipeline, - :success_pipeline - ] - - def change - COLUMNS.each do |column| - add_column(:notification_settings, column, :boolean) - end - end -end diff --git a/db/migrate/20170608152747_prepare_events_table_for_push_events_migration.rb b/db/migrate/20170608152747_prepare_events_table_for_push_events_migration.rb deleted file mode 100644 index 851af7f7bf6..00000000000 --- a/db/migrate/20170608152747_prepare_events_table_for_push_events_migration.rb +++ /dev/null @@ -1,51 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PrepareEventsTableForPushEventsMigration < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # The order of these columns is deliberate and results in the following - # columns and sizes: - # - # * id (4 bytes) - # * project_id (4 bytes) - # * author_id (4 bytes) - # * target_id (4 bytes) - # * created_at (8 bytes) - # * updated_at (8 bytes) - # * action (2 bytes) - # * target_type (variable) - # - # Unfortunately we can't make the "id" column a bigint/bigserial as Rails 4 - # does not support this properly. - create_table :events_for_migration do |t| - t.references :project, - index: true, - foreign_key: { on_delete: :cascade } - - t.integer :author_id, index: true, null: false - t.integer :target_id - - t.timestamps_with_timezone null: false - - t.integer :action, null: false, limit: 2, index: true - t.string :target_type - - t.index %i[target_type target_id] - end - - # t.references doesn't like it when the column name doesn't make the table - # name so we have to add the foreign key separately. - add_concurrent_foreign_key(:events_for_migration, :users, column: :author_id) - end - - def down - drop_table :events_for_migration - end -end diff --git a/db/migrate/20170608152748_create_push_event_payloads_tables.rb b/db/migrate/20170608152748_create_push_event_payloads_tables.rb deleted file mode 100644 index 292d9e3ca06..00000000000 --- a/db/migrate/20170608152748_create_push_event_payloads_tables.rb +++ /dev/null @@ -1,46 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CreatePushEventPayloadsTables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :push_event_payloads, id: false do |t| - t.bigint :commit_count, null: false - - t.integer :event_id, null: false - t.integer :action, null: false, limit: 2 - t.integer :ref_type, null: false, limit: 2 - - t.binary :commit_from - t.binary :commit_to - - t.text :ref - t.string :commit_title, limit: 70 - - t.index :event_id, unique: true - end - - # We're adding a foreign key to the _shadow_ table, and this is deliberate. - # By using the shadow table we don't have to recreate/revalidate this - # foreign key after swapping the "events_for_migration" and "events" tables. - # - # The "events_for_migration" table has a foreign key to "projects.id" - # ensuring that project removals also remove events from the shadow table - # (and thus also from this table). - add_concurrent_foreign_key( - :push_event_payloads, - :events_for_migration, - column: :event_id - ) - end - - def down - drop_table :push_event_payloads - end -end diff --git a/db/migrate/20170608171156_create_merge_request_diff_files.rb b/db/migrate/20170608171156_create_merge_request_diff_files.rb deleted file mode 100644 index 94b518455ee..00000000000 --- a/db/migrate/20170608171156_create_merge_request_diff_files.rb +++ /dev/null @@ -1,22 +0,0 @@ -class CreateMergeRequestDiffFiles < ActiveRecord::Migration[4.2] - DOWNTIME = false - - disable_ddl_transaction! - - def change - create_table :merge_request_diff_files, id: false do |t| - t.belongs_to :merge_request_diff, null: false, foreign_key: { on_delete: :cascade } - t.integer :relative_order, null: false - t.boolean :new_file, null: false - t.boolean :renamed_file, null: false - t.boolean :deleted_file, null: false - t.boolean :too_large, null: false - t.string :a_mode, null: false - t.string :b_mode, null: false - t.text :new_path, null: false - t.text :old_path, null: false - t.text :diff, null: false - t.index [:merge_request_diff_id, :relative_order], name: 'index_merge_request_diff_files_on_mr_diff_id_and_order', unique: true - end - end -end diff --git a/db/migrate/20170613154149_create_gpg_signatures.rb b/db/migrate/20170613154149_create_gpg_signatures.rb deleted file mode 100644 index 181d35fe7af..00000000000 --- a/db/migrate/20170613154149_create_gpg_signatures.rb +++ /dev/null @@ -1,25 +0,0 @@ -class CreateGpgSignatures < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :gpg_signatures do |t| - t.timestamps_with_timezone null: false - - t.references :project, index: true, foreign_key: { on_delete: :cascade } - t.references :gpg_key, index: true, foreign_key: { on_delete: :nullify } - - t.boolean :valid_signature - - t.binary :commit_sha - t.binary :gpg_key_primary_keyid - - t.text :gpg_key_user_name - t.text :gpg_key_user_email - - t.index :commit_sha, unique: true, length: mysql_compatible_index_length - t.index :gpg_key_primary_keyid, length: mysql_compatible_index_length - end - end -end diff --git a/db/migrate/20170614115405_merge_request_diff_file_limits_to_mysql.rb b/db/migrate/20170614115405_merge_request_diff_file_limits_to_mysql.rb deleted file mode 100644 index 4c1cf08aa06..00000000000 --- a/db/migrate/20170614115405_merge_request_diff_file_limits_to_mysql.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative 'merge_request_diff_file_limits_to_mysql' diff --git a/db/migrate/20170616133147_create_merge_request_diff_commits.rb b/db/migrate/20170616133147_create_merge_request_diff_commits.rb deleted file mode 100644 index 5e148affba2..00000000000 --- a/db/migrate/20170616133147_create_merge_request_diff_commits.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateMergeRequestDiffCommits < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :merge_request_diff_commits, id: false do |t| - t.datetime_with_timezone :authored_date - t.datetime_with_timezone :committed_date - t.belongs_to :merge_request_diff, null: false, foreign_key: { on_delete: :cascade } - t.integer :relative_order, null: false - t.binary :sha, null: false, limit: 20 - t.text :author_name - t.text :author_email - t.text :committer_name - t.text :committer_email - t.text :message - - t.index [:merge_request_diff_id, :relative_order], name: 'index_merge_request_diff_commits_on_mr_diff_id_and_order', unique: true - end - end -end diff --git a/db/migrate/20170619144837_add_index_for_head_pipeline_merge_request.rb b/db/migrate/20170619144837_add_index_for_head_pipeline_merge_request.rb deleted file mode 100644 index f97c8a14b8d..00000000000 --- a/db/migrate/20170619144837_add_index_for_head_pipeline_merge_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddIndexForHeadPipelineMergeRequest < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :merge_requests, :head_pipeline_id - end - - def down - remove_concurrent_index :merge_requests, :head_pipeline_id if index_exists?(:merge_requests, :head_pipeline_id) - end -end diff --git a/db/migrate/20170620064728_create_ci_pipeline_schedule_variables.rb b/db/migrate/20170620064728_create_ci_pipeline_schedule_variables.rb deleted file mode 100644 index 74f3603505b..00000000000 --- a/db/migrate/20170620064728_create_ci_pipeline_schedule_variables.rb +++ /dev/null @@ -1,25 +0,0 @@ -class CreateCiPipelineScheduleVariables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - create_table :ci_pipeline_schedule_variables do |t| - t.string :key, null: false - t.text :value - t.text :encrypted_value - t.string :encrypted_value_salt - t.string :encrypted_value_iv - t.integer :pipeline_schedule_id, null: false - - t.timestamps_with_timezone null: true - end - - add_index :ci_pipeline_schedule_variables, - [:pipeline_schedule_id, :key], - name: "index_ci_pipeline_schedule_variables_on_schedule_id_and_key", - unique: true - end - - def down - drop_table :ci_pipeline_schedule_variables - end -end diff --git a/db/migrate/20170620065449_add_foreign_key_to_ci_pipeline_schedule_variables.rb b/db/migrate/20170620065449_add_foreign_key_to_ci_pipeline_schedule_variables.rb deleted file mode 100644 index f6de19aeaf2..00000000000 --- a/db/migrate/20170620065449_add_foreign_key_to_ci_pipeline_schedule_variables.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddForeignKeyToCiPipelineScheduleVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:ci_pipeline_schedule_variables, :ci_pipeline_schedules, column: :pipeline_schedule_id) - end - - def down - remove_foreign_key(:ci_pipeline_schedule_variables, column: :pipeline_schedule_id) - end -end diff --git a/db/migrate/20170622130029_correct_protected_branches_foreign_keys.rb b/db/migrate/20170622130029_correct_protected_branches_foreign_keys.rb deleted file mode 100644 index c4ba3ec2cc0..00000000000 --- a/db/migrate/20170622130029_correct_protected_branches_foreign_keys.rb +++ /dev/null @@ -1,40 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CorrectProtectedBranchesForeignKeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - remove_foreign_key_without_error(:protected_branch_push_access_levels, - column: :protected_branch_id) - - execute <<-EOF - DELETE FROM protected_branch_push_access_levels - WHERE NOT EXISTS ( - SELECT true - FROM protected_branches - WHERE protected_branch_push_access_levels.protected_branch_id = protected_branches.id - ) - AND protected_branch_id IS NOT NULL - EOF - - add_concurrent_foreign_key(:protected_branch_push_access_levels, - :protected_branches, - column: :protected_branch_id) - end - - def down - # Previously there was a foreign key without a CASCADING DELETE, so we'll - # just leave the foreign key in place. - end - - def remove_foreign_key_without_error(*args) - remove_foreign_key(*args) - rescue ArgumentError - end -end diff --git a/db/migrate/20170622132212_add_foreign_key_for_merge_request_diffs.rb b/db/migrate/20170622132212_add_foreign_key_for_merge_request_diffs.rb deleted file mode 100644 index b826f67ff39..00000000000 --- a/db/migrate/20170622132212_add_foreign_key_for_merge_request_diffs.rb +++ /dev/null @@ -1,30 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddForeignKeyForMergeRequestDiffs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - execute <<-EOF - DELETE FROM merge_request_diffs - WHERE NOT EXISTS ( - SELECT true - FROM merge_requests - WHERE merge_requests.id = merge_request_diffs.merge_request_id - ) - EOF - - add_concurrent_foreign_key(:merge_request_diffs, - :merge_requests, - column: :merge_request_id) - end - - def down - remove_foreign_key(:merge_request_diffs, column: :merge_request_id) - end -end diff --git a/db/migrate/20170622135451_rename_duplicated_variable_key.rb b/db/migrate/20170622135451_rename_duplicated_variable_key.rb deleted file mode 100644 index 06a9529ae79..00000000000 --- a/db/migrate/20170622135451_rename_duplicated_variable_key.rb +++ /dev/null @@ -1,38 +0,0 @@ -class RenameDuplicatedVariableKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - execute(<<~SQL) - UPDATE ci_variables - SET #{key} = CONCAT(#{key}, #{underscore}, id) - WHERE id IN ( - SELECT * - FROM ( -- MySQL requires an extra layer - SELECT dup.id - FROM ci_variables dup - INNER JOIN (SELECT max(id) AS id, #{key}, project_id - FROM ci_variables tmp - GROUP BY #{key}, project_id) var - USING (#{key}, project_id) where dup.id <> var.id - ) dummy - ) - SQL - end - - def down - # noop - end - - def key - # key needs to be quoted in MySQL - quote_column_name('key') - end - - def underscore - quote('_') - end -end diff --git a/db/migrate/20170622135628_add_environment_scope_to_ci_variables.rb b/db/migrate/20170622135628_add_environment_scope_to_ci_variables.rb deleted file mode 100644 index 8fbb2ab57d5..00000000000 --- a/db/migrate/20170622135628_add_environment_scope_to_ci_variables.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddEnvironmentScopeToCiVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:ci_variables, :environment_scope, :string, default: '*') - end - - def down - remove_column(:ci_variables, :environment_scope) - end -end diff --git a/db/migrate/20170622135728_add_unique_constraint_to_ci_variables.rb b/db/migrate/20170622135728_add_unique_constraint_to_ci_variables.rb deleted file mode 100644 index 240f55766d3..00000000000 --- a/db/migrate/20170622135728_add_unique_constraint_to_ci_variables.rb +++ /dev/null @@ -1,35 +0,0 @@ -class AddUniqueConstraintToCiVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - INDEX_NAME = 'index_ci_variables_on_project_id_and_key_and_environment_scope' - - disable_ddl_transaction! - - def up - unless this_index_exists? - add_concurrent_index(:ci_variables, columns, name: INDEX_NAME, unique: true) - end - end - - def down - if this_index_exists? - if Gitlab::Database.mysql? && !index_exists?(:ci_variables, :project_id) - # Need to add this index for MySQL project_id foreign key constraint - add_concurrent_index(:ci_variables, :project_id) - end - - remove_concurrent_index(:ci_variables, columns, name: INDEX_NAME) - end - end - - private - - def this_index_exists? - index_exists?(:ci_variables, columns, name: INDEX_NAME) - end - - def columns - @columns ||= [:project_id, :key, :environment_scope] - end -end diff --git a/db/migrate/20170622162730_add_ref_fetched_to_merge_request.rb b/db/migrate/20170622162730_add_ref_fetched_to_merge_request.rb deleted file mode 100644 index 4715ff7a715..00000000000 --- a/db/migrate/20170622162730_add_ref_fetched_to_merge_request.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRefFetchedToMergeRequest < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :merge_requests, :ref_fetched, :boolean - end -end diff --git a/db/migrate/20170623080805_remove_ci_variables_project_id_index.rb b/db/migrate/20170623080805_remove_ci_variables_project_id_index.rb deleted file mode 100644 index 861dbd2ee14..00000000000 --- a/db/migrate/20170623080805_remove_ci_variables_project_id_index.rb +++ /dev/null @@ -1,19 +0,0 @@ -class RemoveCiVariablesProjectIdIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if index_exists?(:ci_variables, :project_id) - remove_concurrent_index(:ci_variables, :project_id) - end - end - - def down - unless index_exists?(:ci_variables, :project_id) - add_concurrent_index(:ci_variables, :project_id) - end - end -end diff --git a/db/migrate/20170629171610_rename_application_settings_signin_enabled_to_password_authentication_enabled.rb b/db/migrate/20170629171610_rename_application_settings_signin_enabled_to_password_authentication_enabled.rb deleted file mode 100644 index 1651a47ebec..00000000000 --- a/db/migrate/20170629171610_rename_application_settings_signin_enabled_to_password_authentication_enabled.rb +++ /dev/null @@ -1,15 +0,0 @@ -class RenameApplicationSettingsSigninEnabledToPasswordAuthenticationEnabled < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - rename_column_concurrently :application_settings, :signin_enabled, :password_authentication_enabled - end - - def down - cleanup_concurrent_column_rename :application_settings, :password_authentication_enabled, :signin_enabled - end -end diff --git a/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb b/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb deleted file mode 100644 index 36ac360fb0b..00000000000 --- a/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb +++ /dev/null @@ -1,27 +0,0 @@ -class AddStageIdForeignKeyToBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - unless index_exists?(:ci_builds, :stage_id) - add_concurrent_index(:ci_builds, :stage_id) - end - - unless foreign_key_exists?(:ci_builds, :ci_stages, column: :stage_id) - add_concurrent_foreign_key(:ci_builds, :ci_stages, column: :stage_id, on_delete: :cascade) - end - end - - def down - if foreign_key_exists?(:ci_builds, column: :stage_id) - remove_foreign_key(:ci_builds, column: :stage_id) - end - - if index_exists?(:ci_builds, :stage_id) - remove_concurrent_index(:ci_builds, :stage_id) - end - end -end diff --git a/db/migrate/20170706151212_add_performance_bar_allowed_group_id_to_application_settings.rb b/db/migrate/20170706151212_add_performance_bar_allowed_group_id_to_application_settings.rb deleted file mode 100644 index 61416f74b63..00000000000 --- a/db/migrate/20170706151212_add_performance_bar_allowed_group_id_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddPerformanceBarAllowedGroupIdToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :performance_bar_allowed_group_id, :integer - end -end diff --git a/db/migrate/20170707183807_add_group_id_to_milestones.rb b/db/migrate/20170707183807_add_group_id_to_milestones.rb deleted file mode 100644 index e778a30192f..00000000000 --- a/db/migrate/20170707183807_add_group_id_to_milestones.rb +++ /dev/null @@ -1,20 +0,0 @@ -class AddGroupIdToMilestones < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - return if column_exists? :milestones, :group_id - - change_column_null :milestones, :project_id, true - - add_column :milestones, :group_id, :integer - end - - def down - # We cannot rollback project_id not null constraint if there are records - # with null values. - execute "DELETE from milestones WHERE project_id IS NULL" - - remove_column :milestones, :group_id - change_column :milestones, :project_id, :integer, null: false - end -end diff --git a/db/migrate/20170707184243_add_group_milestone_id_indexes.rb b/db/migrate/20170707184243_add_group_milestone_id_indexes.rb deleted file mode 100644 index 545ee070194..00000000000 --- a/db/migrate/20170707184243_add_group_milestone_id_indexes.rb +++ /dev/null @@ -1,21 +0,0 @@ -class AddGroupMilestoneIdIndexes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - return if index_exists?(:milestones, :group_id) - - add_concurrent_foreign_key :milestones, :namespaces, column: :group_id, on_delete: :cascade - - add_concurrent_index :milestones, :group_id - end - - def down - remove_foreign_key :milestones, column: :group_id - - remove_concurrent_index :milestones, :group_id - end -end diff --git a/db/migrate/20170707184244_remove_wrong_versions_from_schema_versions.rb b/db/migrate/20170707184244_remove_wrong_versions_from_schema_versions.rb deleted file mode 100644 index f99206c7f78..00000000000 --- a/db/migrate/20170707184244_remove_wrong_versions_from_schema_versions.rb +++ /dev/null @@ -1,10 +0,0 @@ -class RemoveWrongVersionsFromSchemaVersions < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - execute("DELETE FROM schema_migrations WHERE version IN ('20170723183807', '20170724184243')") - end - - def down - end -end diff --git a/db/migrate/20170710083355_clean_stage_id_reference_migration.rb b/db/migrate/20170710083355_clean_stage_id_reference_migration.rb deleted file mode 100644 index d33c6f53b15..00000000000 --- a/db/migrate/20170710083355_clean_stage_id_reference_migration.rb +++ /dev/null @@ -1,18 +0,0 @@ -class CleanStageIdReferenceMigration < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - ## - # `MigrateStageIdReferenceInBackground` background migration cleanup. - # - def up - Gitlab::BackgroundMigration.steal('MigrateBuildStageIdReference') - end - - def down - # noop - end -end diff --git a/db/migrate/20170711145320_add_status_to_ci_stages.rb b/db/migrate/20170711145320_add_status_to_ci_stages.rb deleted file mode 100644 index 3ea7b750882..00000000000 --- a/db/migrate/20170711145320_add_status_to_ci_stages.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddStatusToCiStages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_stages, :status, :integer - end -end diff --git a/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb b/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb deleted file mode 100644 index 908b122c659..00000000000 --- a/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb +++ /dev/null @@ -1,37 +0,0 @@ -class AddForeignKeyToMergeRequests < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - self.table_name = 'merge_requests' - include ::EachBatch - end - - def up - scope = <<-SQL.strip_heredoc - head_pipeline_id IS NOT NULL - AND NOT EXISTS ( - SELECT 1 FROM ci_pipelines - WHERE ci_pipelines.id = merge_requests.head_pipeline_id - ) - SQL - - MergeRequest.where(scope).each_batch(of: 1000) do |merge_requests| - merge_requests.update_all(head_pipeline_id: nil) - end - - unless foreign_key_exists?(:merge_requests, column: :head_pipeline_id) - add_concurrent_foreign_key(:merge_requests, :ci_pipelines, - column: :head_pipeline_id, on_delete: :nullify) - end - end - - def down - if foreign_key_exists?(:merge_requests, column: :head_pipeline_id) - remove_foreign_key(:merge_requests, column: :head_pipeline_id) - end - end -end diff --git a/db/migrate/20170717074009_move_system_upload_folder.rb b/db/migrate/20170717074009_move_system_upload_folder.rb deleted file mode 100644 index 6c57a751c8d..00000000000 --- a/db/migrate/20170717074009_move_system_upload_folder.rb +++ /dev/null @@ -1,70 +0,0 @@ -class MoveSystemUploadFolder < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - unless file_storage? - say 'Using object storage, no need to move.' - return - end - - unless File.directory?(old_directory) - say "#{old_directory} doesn't exist, no need to move it." - return - end - - if File.directory?(new_directory) - say "#{new_directory} already exists. No need to redo the move." - return - end - - FileUtils.mkdir_p(File.join(base_directory, '-')) - - say "Moving #{old_directory} -> #{new_directory}" - FileUtils.mv(old_directory, new_directory) - FileUtils.ln_s(new_directory, old_directory) - end - - def down - unless file_storage? - say 'Using object storage, no need to move.' - return - end - - unless File.directory?(new_directory) - say "#{new_directory} doesn't exist, no need to move it." - return - end - - if !File.symlink?(old_directory) && File.directory?(old_directory) - say "#{old_directory} already exists and is not a symlink, no need to revert." - return - end - - if File.symlink?(old_directory) - say "Removing #{old_directory} -> #{new_directory} symlink" - FileUtils.rm(old_directory) - end - - say "Moving #{new_directory} -> #{old_directory}" - FileUtils.mv(new_directory, old_directory) - end - - def new_directory - File.join(base_directory, '-', 'system') - end - - def old_directory - File.join(base_directory, 'system') - end - - def base_directory - File.join(Rails.root, 'public', 'uploads') - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end -end diff --git a/db/migrate/20170717200542_add_trusted_column_to_oauth_applications.rb b/db/migrate/20170717200542_add_trusted_column_to_oauth_applications.rb deleted file mode 100644 index d9ae86f6c52..00000000000 --- a/db/migrate/20170717200542_add_trusted_column_to_oauth_applications.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddTrustedColumnToOauthApplications < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:oauth_applications, :trusted, :boolean, default: false) - end - - def down - remove_column(:oauth_applications, :trusted) - end -end diff --git a/db/migrate/20170720111708_add_lock_version_to_ci_stages.rb b/db/migrate/20170720111708_add_lock_version_to_ci_stages.rb deleted file mode 100644 index a5caca7e80c..00000000000 --- a/db/migrate/20170720111708_add_lock_version_to_ci_stages.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddLockVersionToCiStages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_stages, :lock_version, :integer - end -end diff --git a/db/migrate/20170720122741_create_user_custom_attributes.rb b/db/migrate/20170720122741_create_user_custom_attributes.rb deleted file mode 100644 index 0e6f37d7317..00000000000 --- a/db/migrate/20170720122741_create_user_custom_attributes.rb +++ /dev/null @@ -1,17 +0,0 @@ -class CreateUserCustomAttributes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :user_custom_attributes do |t| - t.timestamps_with_timezone null: false - t.references :user, null: false, foreign_key: { on_delete: :cascade } - t.string :key, null: false - t.string :value, null: false - - t.index [:user_id, :key], unique: true - t.index [:key, :value] - end - end -end diff --git a/db/migrate/20170720130522_create_ci_pipeline_variables.rb b/db/migrate/20170720130522_create_ci_pipeline_variables.rb deleted file mode 100644 index 4f162d46cf5..00000000000 --- a/db/migrate/20170720130522_create_ci_pipeline_variables.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateCiPipelineVariables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - create_table :ci_pipeline_variables do |t| - t.string :key, null: false - t.text :value - t.text :encrypted_value - t.string :encrypted_value_salt - t.string :encrypted_value_iv - t.integer :pipeline_id, null: false - end - - add_index :ci_pipeline_variables, [:pipeline_id, :key], unique: true - end - - def down - drop_table :ci_pipeline_variables - end -end diff --git a/db/migrate/20170720130749_add_foreign_key_to_ci_pipeline_variables.rb b/db/migrate/20170720130749_add_foreign_key_to_ci_pipeline_variables.rb deleted file mode 100644 index df9350d9ad5..00000000000 --- a/db/migrate/20170720130749_add_foreign_key_to_ci_pipeline_variables.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddForeignKeyToCiPipelineVariables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:ci_pipeline_variables, :ci_pipelines, column: :pipeline_id) - end - - def down - remove_foreign_key(:ci_pipeline_variables, column: :pipeline_id) - end -end diff --git a/db/migrate/20170724214302_add_lower_path_index_to_redirect_routes.rb b/db/migrate/20170724214302_add_lower_path_index_to_redirect_routes.rb deleted file mode 100644 index 1a6516f8777..00000000000 --- a/db/migrate/20170724214302_add_lower_path_index_to_redirect_routes.rb +++ /dev/null @@ -1,35 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddLowerPathIndexToRedirectRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - INDEX_NAME = 'index_on_redirect_routes_lower_path' - - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - execute "CREATE INDEX CONCURRENTLY #{INDEX_NAME} ON redirect_routes (LOWER(path));" - end - - def down - return unless Gitlab::Database.postgresql? - - # Why not use remove_concurrent_index_by_name? - # - # `index_exists?` doesn't work on this index. Perhaps this is related to the - # fact that the index doesn't show up in the schema. And apparently it isn't - # trivial to write a query that checks for an index. BUT there is a - # convenient `IF EXISTS` parameter for `DROP INDEX`. - if supports_drop_index_concurrently? - disable_statement_timeout do - execute "DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME};" - end - else - execute "DROP INDEX IF EXISTS #{INDEX_NAME};" - end - end -end diff --git a/db/migrate/20170725145659_add_binary_to_merge_request_diff_files.rb b/db/migrate/20170725145659_add_binary_to_merge_request_diff_files.rb deleted file mode 100644 index c7d377547e4..00000000000 --- a/db/migrate/20170725145659_add_binary_to_merge_request_diff_files.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddBinaryToMergeRequestDiffFiles < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :merge_request_diff_files, :binary, :boolean - end -end diff --git a/db/migrate/20170727123534_add_index_on_events_project_id_id.rb b/db/migrate/20170727123534_add_index_on_events_project_id_id.rb deleted file mode 100644 index 076b8ee87b2..00000000000 --- a/db/migrate/20170727123534_add_index_on_events_project_id_id.rb +++ /dev/null @@ -1,37 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexOnEventsProjectIdId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - COLUMNS = %i[project_id id].freeze - TABLES = %i[events events_for_migration].freeze - - disable_ddl_transaction! - - def up - TABLES.each do |table| - add_concurrent_index(table, COLUMNS) unless index_exists?(table, COLUMNS) - - # We remove the index _after_ adding the new one since MySQL doesn't let - # you remove an index when a foreign key exists for the same column. - if index_exists?(table, :project_id) - remove_concurrent_index(table, :project_id) - end - end - end - - def down - TABLES.each do |table| - unless index_exists?(table, :project_id) - add_concurrent_index(table, :project_id) - end - - unless index_exists?(table, COLUMNS) - remove_concurrent_index(table, COLUMNS) - end - end - end -end diff --git a/db/migrate/20170731175128_add_percentages_to_conv_dev.rb b/db/migrate/20170731175128_add_percentages_to_conv_dev.rb deleted file mode 100644 index 522e99c0751..00000000000 --- a/db/migrate/20170731175128_add_percentages_to_conv_dev.rb +++ /dev/null @@ -1,32 +0,0 @@ -class AddPercentagesToConvDev < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default :conversational_development_index_metrics, :percentage_boards, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_ci_pipelines, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_deployments, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_environments, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_issues, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_merge_requests, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_milestones, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_notes, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_projects_prometheus_active, :float, allow_null: false, default: 0 - add_column_with_default :conversational_development_index_metrics, :percentage_service_desk_issues, :float, allow_null: false, default: 0 - end - - def down - remove_column :conversational_development_index_metrics, :percentage_boards - remove_column :conversational_development_index_metrics, :percentage_ci_pipelines - remove_column :conversational_development_index_metrics, :percentage_deployments - remove_column :conversational_development_index_metrics, :percentage_environments - remove_column :conversational_development_index_metrics, :percentage_issues - remove_column :conversational_development_index_metrics, :percentage_merge_requests - remove_column :conversational_development_index_metrics, :percentage_milestones - remove_column :conversational_development_index_metrics, :percentage_notes - remove_column :conversational_development_index_metrics, :percentage_projects_prometheus_active - remove_column :conversational_development_index_metrics, :percentage_service_desk_issues - end -end diff --git a/db/migrate/20170731183033_add_merge_jid_to_merge_requests.rb b/db/migrate/20170731183033_add_merge_jid_to_merge_requests.rb deleted file mode 100644 index 3c677f3bc2d..00000000000 --- a/db/migrate/20170731183033_add_merge_jid_to_merge_requests.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddMergeJidToMergeRequests < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :merge_requests, :merge_jid, :string - end -end diff --git a/db/migrate/20170802013652_add_storage_fields_to_project.rb b/db/migrate/20170802013652_add_storage_fields_to_project.rb deleted file mode 100644 index d6672b9b3af..00000000000 --- a/db/migrate/20170802013652_add_storage_fields_to_project.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddStorageFieldsToProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - add_column :projects, :storage_version, :integer, limit: 2 - end - - def down - remove_column :projects, :storage_version - end -end diff --git a/db/migrate/20170803130232_reorganise_issues_indexes_for_faster_sorting.rb b/db/migrate/20170803130232_reorganise_issues_indexes_for_faster_sorting.rb deleted file mode 100644 index e92b5f28685..00000000000 --- a/db/migrate/20170803130232_reorganise_issues_indexes_for_faster_sorting.rb +++ /dev/null @@ -1,43 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ReorganiseIssuesIndexesForFasterSorting < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - REMOVE_INDEX_COLUMNS = %i[project_id created_at due_date updated_at].freeze - - ADD_INDEX_COLUMNS = [ - %i[project_id created_at id state], - %i[project_id due_date id state], - %i[project_id updated_at id state] - ].freeze - - TABLE = :issues - - def up - add_indexes(ADD_INDEX_COLUMNS) - remove_indexes(REMOVE_INDEX_COLUMNS) - end - - def down - add_indexes(REMOVE_INDEX_COLUMNS) - remove_indexes(ADD_INDEX_COLUMNS) - end - - def add_indexes(columns) - columns.each do |column| - add_concurrent_index(TABLE, column) unless index_exists?(TABLE, column) - end - end - - def remove_indexes(columns) - columns.each do |column| - remove_concurrent_index(TABLE, column) if index_exists?(TABLE, column) - end - end -end diff --git a/db/migrate/20170807071105_add_hashed_storage_to_settings.rb b/db/migrate/20170807071105_add_hashed_storage_to_settings.rb deleted file mode 100644 index cfb89743127..00000000000 --- a/db/migrate/20170807071105_add_hashed_storage_to_settings.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddHashedStorageToSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :hashed_storage_enabled, :boolean, default: false - end - - def down - remove_columns :application_settings, :hashed_storage_enabled - end -end diff --git a/db/migrate/20170809133343_add_broadcast_messages_index.rb b/db/migrate/20170809133343_add_broadcast_messages_index.rb deleted file mode 100644 index bcbc6c9f7d2..00000000000 --- a/db/migrate/20170809133343_add_broadcast_messages_index.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddBroadcastMessagesIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - COLUMNS = %i[starts_at ends_at id].freeze - - def up - add_concurrent_index :broadcast_messages, COLUMNS - end - - def down - remove_concurrent_index :broadcast_messages, COLUMNS - end -end diff --git a/db/migrate/20170809134534_add_broadcast_message_not_null_constraints.rb b/db/migrate/20170809134534_add_broadcast_message_not_null_constraints.rb deleted file mode 100644 index fd8cdbb95aa..00000000000 --- a/db/migrate/20170809134534_add_broadcast_message_not_null_constraints.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddBroadcastMessageNotNullConstraints < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - COLUMNS = %i[starts_at ends_at created_at updated_at message_html] - - class BroadcastMessage < ActiveRecord::Base - self.table_name = 'broadcast_messages' - end - - def up - COLUMNS.each do |column| - BroadcastMessage.where(column => nil).delete_all - - change_column_null :broadcast_messages, column, false - end - end - - def down - COLUMNS.each do |column| - change_column_null :broadcast_messages, column, true - end - end -end diff --git a/db/migrate/20170809142252_cleanup_appearances_schema.rb b/db/migrate/20170809142252_cleanup_appearances_schema.rb deleted file mode 100644 index 4c5d6a6d75d..00000000000 --- a/db/migrate/20170809142252_cleanup_appearances_schema.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupAppearancesSchema < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - NOT_NULL_COLUMNS = %i[title description created_at updated_at] - - TIME_COLUMNS = %i[created_at updated_at] - - def up - NOT_NULL_COLUMNS.each do |column| - change_column_null :appearances, column, false - end - - TIME_COLUMNS.each do |column| - change_column :appearances, column, :datetime_with_timezone - end - end - - def down - NOT_NULL_COLUMNS.each do |column| - change_column_null :appearances, column, true - end - - TIME_COLUMNS.each do |column| - change_column :appearances, column, :datetime # rubocop: disable Migration/Datetime - end - end -end diff --git a/db/migrate/20170809161910_add_project_export_enabled_to_application_settings.rb b/db/migrate/20170809161910_add_project_export_enabled_to_application_settings.rb deleted file mode 100644 index 9dd520de264..00000000000 --- a/db/migrate/20170809161910_add_project_export_enabled_to_application_settings.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AddProjectExportEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - add_column_with_default(:application_settings, :project_export_enabled, :boolean, default: true) - end - - def down - remove_column(:application_settings, :project_export_enabled) - end -end diff --git a/db/migrate/20170815221154_add_discussion_locked_to_issuable.rb b/db/migrate/20170815221154_add_discussion_locked_to_issuable.rb deleted file mode 100644 index 1444ca480b3..00000000000 --- a/db/migrate/20170815221154_add_discussion_locked_to_issuable.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddDiscussionLockedToIssuable < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - add_column(:merge_requests, :discussion_locked, :boolean) - add_column(:issues, :discussion_locked, :boolean) - end - - def down - remove_column(:merge_requests, :discussion_locked) - remove_column(:issues, :discussion_locked) - end -end diff --git a/db/migrate/20170816133938_add_access_level_to_ci_runners.rb b/db/migrate/20170816133938_add_access_level_to_ci_runners.rb deleted file mode 100644 index 5a1ea9514d1..00000000000 --- a/db/migrate/20170816133938_add_access_level_to_ci_runners.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddAccessLevelToCiRunners < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:ci_runners, :access_level, :integer, - default: Ci::Runner.access_levels['not_protected']) - end - - def down - remove_column(:ci_runners, :access_level) - end -end diff --git a/db/migrate/20170816133940_add_protected_to_ci_builds.rb b/db/migrate/20170816133940_add_protected_to_ci_builds.rb deleted file mode 100644 index 13e1be0d89c..00000000000 --- a/db/migrate/20170816133940_add_protected_to_ci_builds.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddProtectedToCiBuilds < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :ci_builds, :protected, :boolean - end -end diff --git a/db/migrate/20170816143940_add_protected_to_ci_pipelines.rb b/db/migrate/20170816143940_add_protected_to_ci_pipelines.rb deleted file mode 100644 index aefaf4a487b..00000000000 --- a/db/migrate/20170816143940_add_protected_to_ci_pipelines.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddProtectedToCiPipelines < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :ci_pipelines, :protected, :boolean - end -end diff --git a/db/migrate/20170816153940_add_index_on_ci_builds_protected.rb b/db/migrate/20170816153940_add_index_on_ci_builds_protected.rb deleted file mode 100644 index fbe5fe31ae8..00000000000 --- a/db/migrate/20170816153940_add_index_on_ci_builds_protected.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddIndexOnCiBuildsProtected < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, :protected - end - - def down - remove_concurrent_index :ci_builds, :protected if index_exists?(:ci_builds, :protected) - end -end diff --git a/db/migrate/20170816234252_add_theme_id_to_users.rb b/db/migrate/20170816234252_add_theme_id_to_users.rb deleted file mode 100644 index bd04445cac6..00000000000 --- a/db/migrate/20170816234252_add_theme_id_to_users.rb +++ /dev/null @@ -1,10 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddThemeIdToUsers < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :users, :theme_id, :integer, limit: 2 - end -end diff --git a/db/migrate/20170817123339_add_verification_status_to_gpg_signatures.rb b/db/migrate/20170817123339_add_verification_status_to_gpg_signatures.rb deleted file mode 100644 index c7d81dc005a..00000000000 --- a/db/migrate/20170817123339_add_verification_status_to_gpg_signatures.rb +++ /dev/null @@ -1,20 +0,0 @@ -class AddVerificationStatusToGpgSignatures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - def up - # First we remove all signatures because we need to re-verify them all - # again anyway (because of the updated verification logic). - # - # This makes adding the column with default values faster - truncate(:gpg_signatures) - - add_column_with_default(:gpg_signatures, :verification_status, :smallint, default: 0) - end - - def down - remove_column(:gpg_signatures, :verification_status) - end -end diff --git a/db/migrate/20170820100558_correct_protected_tags_foreign_keys.rb b/db/migrate/20170820100558_correct_protected_tags_foreign_keys.rb deleted file mode 100644 index 82e05885b0e..00000000000 --- a/db/migrate/20170820100558_correct_protected_tags_foreign_keys.rb +++ /dev/null @@ -1,35 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CorrectProtectedTagsForeignKeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - remove_foreign_key_without_error(:protected_tag_create_access_levels, - column: :protected_tag_id) - - execute <<-EOF - DELETE FROM protected_tag_create_access_levels - WHERE NOT EXISTS ( - SELECT true - FROM protected_tags - WHERE protected_tag_create_access_levels.protected_tag_id = protected_tags.id - ) - AND protected_tag_id IS NOT NULL - EOF - - add_concurrent_foreign_key(:protected_tag_create_access_levels, - :protected_tags, - column: :protected_tag_id) - end - - def down - # Previously there was a foreign key without a CASCADING DELETE, so we'll - # just leave the foreign key in place. - end -end diff --git a/db/migrate/20170820120108_create_user_synced_attributes_metadata.rb b/db/migrate/20170820120108_create_user_synced_attributes_metadata.rb deleted file mode 100644 index 131dcf7ac25..00000000000 --- a/db/migrate/20170820120108_create_user_synced_attributes_metadata.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateUserSyncedAttributesMetadata < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :user_synced_attributes_metadata do |t| - t.boolean :name_synced, default: false - t.boolean :email_synced, default: false - t.boolean :location_synced, default: false - t.references :user, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.string :provider - end - end -end diff --git a/db/migrate/20170824101926_add_auto_devops_enabled_to_application_settings.rb b/db/migrate/20170824101926_add_auto_devops_enabled_to_application_settings.rb deleted file mode 100644 index f7c0aeab8f9..00000000000 --- a/db/migrate/20170824101926_add_auto_devops_enabled_to_application_settings.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddAutoDevopsEnabledToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:application_settings, :auto_devops_enabled, :boolean, default: false) - end - - def down - remove_column(:application_settings, :auto_devops_enabled, :boolean) - end -end diff --git a/db/migrate/20170824162758_allow_appearances_description_html_null.rb b/db/migrate/20170824162758_allow_appearances_description_html_null.rb deleted file mode 100644 index 6efa3452796..00000000000 --- a/db/migrate/20170824162758_allow_appearances_description_html_null.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AllowAppearancesDescriptionHtmlNull < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - change_column_null :appearances, :description_html, true - end - - def down - # This column should not have a `NOT NULL` class, so we don't want to revert - # back to re-adding it. - end -end diff --git a/db/migrate/20170825015534_add_file_store_to_lfs_objects.rb b/db/migrate/20170825015534_add_file_store_to_lfs_objects.rb deleted file mode 100644 index be543ffc983..00000000000 --- a/db/migrate/20170825015534_add_file_store_to_lfs_objects.rb +++ /dev/null @@ -1,31 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddFileStoreToLfsObjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column(:lfs_objects, :file_store, :integer) - end -end diff --git a/db/migrate/20170825104051_migrate_issues_to_ghost_user.rb b/db/migrate/20170825104051_migrate_issues_to_ghost_user.rb deleted file mode 100644 index b1adccc9c5c..00000000000 --- a/db/migrate/20170825104051_migrate_issues_to_ghost_user.rb +++ /dev/null @@ -1,37 +0,0 @@ -class MigrateIssuesToGhostUser < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - disable_ddl_transaction! - - class User < ActiveRecord::Base - self.table_name = 'users' - end - - class Issue < ActiveRecord::Base - self.table_name = 'issues' - - include ::EachBatch - end - - def reset_column_in_migration_models - ActiveRecord::Base.clear_cache! - - ::User.reset_column_information - ::Namespace.reset_column_information - end - - def up - reset_column_in_migration_models - - # we use the model method because rewriting it is too complicated and would require copying multiple methods - ghost_id = ::User.ghost.id - - Issue.where('NOT EXISTS (?)', User.unscoped.select(1).where('issues.author_id = users.id')).each_batch do |relation| - relation.update_all(author_id: ghost_id) - end - end - - def down - end -end diff --git a/db/migrate/20170825154015_resolve_outdated_diff_discussions.rb b/db/migrate/20170825154015_resolve_outdated_diff_discussions.rb deleted file mode 100644 index 1aed21f10a0..00000000000 --- a/db/migrate/20170825154015_resolve_outdated_diff_discussions.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ResolveOutdatedDiffDiscussions < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:projects, :resolve_outdated_diff_discussions, :boolean) - end -end diff --git a/db/migrate/20170827123848_add_index_on_merge_request_diff_commit_sha.rb b/db/migrate/20170827123848_add_index_on_merge_request_diff_commit_sha.rb deleted file mode 100644 index e2061b5600a..00000000000 --- a/db/migrate/20170827123848_add_index_on_merge_request_diff_commit_sha.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable RemoveIndex - -class AddIndexOnMergeRequestDiffCommitSha < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :merge_request_diff_commits, :sha, length: mysql_compatible_index_length - end - - def down - remove_index :merge_request_diff_commits, :sha if index_exists? :merge_request_diff_commits, :sha - end -end diff --git a/db/migrate/20170828093725_create_project_auto_dev_ops.rb b/db/migrate/20170828093725_create_project_auto_dev_ops.rb deleted file mode 100644 index ea895dc14c1..00000000000 --- a/db/migrate/20170828093725_create_project_auto_dev_ops.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateProjectAutoDevOps < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - create_table :project_auto_devops do |t| - t.belongs_to :project, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - t.boolean :enabled, default: nil, null: true - t.string :domain - end - end - - def down - drop_table(:project_auto_devops) - end -end diff --git a/db/migrate/20170828135939_migrate_user_external_mail_data.rb b/db/migrate/20170828135939_migrate_user_external_mail_data.rb deleted file mode 100644 index 9ee4a4598bf..00000000000 --- a/db/migrate/20170828135939_migrate_user_external_mail_data.rb +++ /dev/null @@ -1,57 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateUserExternalMailData < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class User < ActiveRecord::Base - self.table_name = 'users' - - include EachBatch - end - - class UserSyncedAttributesMetadata < ActiveRecord::Base - self.table_name = 'user_synced_attributes_metadata' - - include EachBatch - end - - def up - User.each_batch do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - execute <<-EOF - INSERT INTO user_synced_attributes_metadata (user_id, provider, email_synced) - SELECT id, email_provider, external_email - FROM users - WHERE external_email = TRUE - AND NOT EXISTS ( - SELECT true - FROM user_synced_attributes_metadata - WHERE user_id = users.id - AND (provider = users.email_provider OR (provider IS NULL AND users.email_provider IS NULL)) - ) - AND id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - - def down - UserSyncedAttributesMetadata.each_batch do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - execute <<-EOF - UPDATE users - SET users.email_provider = metadata.provider, users.external_email = metadata.email_synced - FROM user_synced_attributes_metadata as metadata, users - WHERE metadata.email_synced = TRUE - AND metadata.user_id = users.id - AND id BETWEEN #{start_id} AND #{end_id} - EOF - end - end -end diff --git a/db/migrate/20170830125940_add_failure_reason_to_ci_builds.rb b/db/migrate/20170830125940_add_failure_reason_to_ci_builds.rb deleted file mode 100644 index 44f709868ca..00000000000 --- a/db/migrate/20170830125940_add_failure_reason_to_ci_builds.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddFailureReasonToCiBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_builds, :failure_reason, :integer - end -end diff --git a/db/migrate/20170830130119_steal_remaining_event_migration_jobs.rb b/db/migrate/20170830130119_steal_remaining_event_migration_jobs.rb deleted file mode 100644 index bcc34d56d2d..00000000000 --- a/db/migrate/20170830130119_steal_remaining_event_migration_jobs.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class StealRemainingEventMigrationJobs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - Gitlab::BackgroundMigration.steal('MigrateEventsToPushEventPayloads') - end - - def down - end -end diff --git a/db/migrate/20170830131015_swap_event_migration_tables.rb b/db/migrate/20170830131015_swap_event_migration_tables.rb deleted file mode 100644 index fb3b2472ffe..00000000000 --- a/db/migrate/20170830131015_swap_event_migration_tables.rb +++ /dev/null @@ -1,47 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class SwapEventMigrationTables < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - class Event < ActiveRecord::Base - self.table_name = 'events' - end - - def up - rename_tables - end - - def down - rename_tables - end - - def rename_tables - rename_table :events, :events_old - rename_table :events_for_migration, :events - rename_table :events_old, :events_for_migration - - # Once swapped we need to reset the primary key of the new "events" table to - # make sure that data created starts with the right value. This isn't - # necessary for events_for_migration since we replicate existing primary key - # values to it. - if Gitlab::Database.postgresql? - reset_primary_key_for_postgresql - else - reset_primary_key_for_mysql - end - end - - def reset_primary_key_for_postgresql - reset_pk_sequence!(Event.table_name) - end - - def reset_primary_key_for_mysql - amount = Event.pluck('COALESCE(MAX(id), 1)').first - - execute "ALTER TABLE #{Event.table_name} AUTO_INCREMENT = #{amount}" - end -end diff --git a/db/migrate/20170831092813_add_config_source_to_pipelines.rb b/db/migrate/20170831092813_add_config_source_to_pipelines.rb deleted file mode 100644 index ba1f73f0e68..00000000000 --- a/db/migrate/20170831092813_add_config_source_to_pipelines.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddConfigSourceToPipelines < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column(:ci_pipelines, :config_source, :integer, allow_null: true) - end -end diff --git a/db/migrate/20170901071411_add_foreign_key_to_issue_author.rb b/db/migrate/20170901071411_add_foreign_key_to_issue_author.rb deleted file mode 100644 index 00d0b0f2c7f..00000000000 --- a/db/migrate/20170901071411_add_foreign_key_to_issue_author.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AddForeignKeyToIssueAuthor < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:issues, :users, column: :author_id, on_delete: :nullify) - end - - def down - remove_foreign_key(:issues, column: :author_id) - end -end diff --git a/db/migrate/20170904092148_add_email_confirmation.rb b/db/migrate/20170904092148_add_email_confirmation.rb deleted file mode 100644 index 8bfb2005936..00000000000 --- a/db/migrate/20170904092148_add_email_confirmation.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddEmailConfirmation < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - add_column :emails, :confirmation_token, :string - add_column :emails, :confirmed_at, :datetime_with_timezone - add_column :emails, :confirmation_sent_at, :datetime_with_timezone - end -end diff --git a/db/migrate/20170905112933_add_resolved_by_push_to_notes.rb b/db/migrate/20170905112933_add_resolved_by_push_to_notes.rb deleted file mode 100644 index 1f27ea3c467..00000000000 --- a/db/migrate/20170905112933_add_resolved_by_push_to_notes.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddResolvedByPushToNotes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :notes, :resolved_by_push, :boolean - end -end diff --git a/db/migrate/20170906133745_add_runners_token_to_groups.rb b/db/migrate/20170906133745_add_runners_token_to_groups.rb deleted file mode 100644 index a02160feb83..00000000000 --- a/db/migrate/20170906133745_add_runners_token_to_groups.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRunnersTokenToGroups < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :namespaces, :runners_token, :string - end -end diff --git a/db/migrate/20170909090114_add_email_confirmation_index.rb b/db/migrate/20170909090114_add_email_confirmation_index.rb deleted file mode 100644 index 31c48db2bd2..00000000000 --- a/db/migrate/20170909090114_add_email_confirmation_index.rb +++ /dev/null @@ -1,36 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddEmailConfirmationIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - # Not necessary to remove duplicates, as :confirmation_token is a new column - def up - add_concurrent_index :emails, :confirmation_token, unique: true - end - - def down - remove_concurrent_index :emails, :confirmation_token if index_exists?(:emails, :confirmation_token) - end -end diff --git a/db/migrate/20170909150936_add_spent_at_to_timelogs.rb b/db/migrate/20170909150936_add_spent_at_to_timelogs.rb deleted file mode 100644 index 3a2c900b445..00000000000 --- a/db/migrate/20170909150936_add_spent_at_to_timelogs.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddSpentAtToTimelogs < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - add_column :timelogs, :spent_at, :datetime_with_timezone - end - - def down - remove_column :timelogs, :spent_at - end -end diff --git a/db/migrate/20170912113435_clean_stages_statuses_migration.rb b/db/migrate/20170912113435_clean_stages_statuses_migration.rb deleted file mode 100644 index f2040f819cd..00000000000 --- a/db/migrate/20170912113435_clean_stages_statuses_migration.rb +++ /dev/null @@ -1,26 +0,0 @@ -class CleanStagesStatusesMigration < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class Stage < ActiveRecord::Base - include ::EachBatch - self.table_name = 'ci_stages' - end - - def up - Gitlab::BackgroundMigration.steal('MigrateStageStatus') - - Stage.where('status IS NULL').each_batch(of: 50) do |batch| - range = batch.pluck('MIN(id)', 'MAX(id)').first - - Gitlab::BackgroundMigration::MigrateStageStatus.new.perform(*range) - end - end - - def down - # noop - end -end diff --git a/db/migrate/20170913131410_environments_project_id_not_null.rb b/db/migrate/20170913131410_environments_project_id_not_null.rb deleted file mode 100644 index ba66113945b..00000000000 --- a/db/migrate/20170913131410_environments_project_id_not_null.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class EnvironmentsProjectIdNotNull < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - change_column_null :environments, :project_id, false - end - - def down - change_column_null :environments, :project_id, true - end -end diff --git a/db/migrate/20170914135630_add_index_for_recent_push_events.rb b/db/migrate/20170914135630_add_index_for_recent_push_events.rb deleted file mode 100644 index ac86185ba50..00000000000 --- a/db/migrate/20170914135630_add_index_for_recent_push_events.rb +++ /dev/null @@ -1,40 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddIndexForRecentPushEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index_if_not_present( - :merge_requests, - [:source_project_id, :source_branch] - ) - - remove_concurrent_index_if_present(:merge_requests, :source_project_id) - end - - def down - add_concurrent_index_if_not_present(:merge_requests, :source_project_id) - - remove_concurrent_index_if_present( - :merge_requests, - [:source_project_id, :source_branch] - ) - end - - def add_concurrent_index_if_not_present(table, columns) - return if index_exists?(table, columns) - - add_concurrent_index(table, columns) - end - - def remove_concurrent_index_if_present(table, columns) - return unless index_exists?(table, columns) - - remove_concurrent_index(table, columns) - end -end diff --git a/db/migrate/20170918072948_create_job_artifacts.rb b/db/migrate/20170918072948_create_job_artifacts.rb deleted file mode 100644 index 4dd24aaff99..00000000000 --- a/db/migrate/20170918072948_create_job_artifacts.rb +++ /dev/null @@ -1,23 +0,0 @@ -class CreateJobArtifacts < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :ci_job_artifacts do |t| - t.belongs_to :project, null: false, index: true, foreign_key: { on_delete: :cascade } - t.integer :job_id, null: false - t.integer :file_type, null: false - t.integer :size, limit: 8 - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - t.datetime_with_timezone :expire_at - - t.string :file - - t.foreign_key :ci_builds, column: :job_id, on_delete: :cascade - t.index [:job_id, :file_type], unique: true - end - end -end diff --git a/db/migrate/20170918072949_add_file_store_job_artifacts.rb b/db/migrate/20170918072949_add_file_store_job_artifacts.rb deleted file mode 100644 index 3eb355c9305..00000000000 --- a/db/migrate/20170918072949_add_file_store_job_artifacts.rb +++ /dev/null @@ -1,10 +0,0 @@ -class AddFileStoreJobArtifacts < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - DOWNTIME = false - - def change - add_column(:ci_job_artifacts, :file_store, :integer) - end -end diff --git a/db/migrate/20170918111708_create_project_custom_attributes.rb b/db/migrate/20170918111708_create_project_custom_attributes.rb deleted file mode 100644 index bd6064689ff..00000000000 --- a/db/migrate/20170918111708_create_project_custom_attributes.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateProjectCustomAttributes < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :project_custom_attributes do |t| - t.timestamps_with_timezone null: false - t.references :project, null: false, foreign_key: { on_delete: :cascade } - t.string :key, null: false - t.string :value, null: false - - t.index [:project_id, :key], unique: true - t.index [:key, :value] - end - end -end diff --git a/db/migrate/20170918140927_create_group_custom_attributes.rb b/db/migrate/20170918140927_create_group_custom_attributes.rb deleted file mode 100644 index 215a0f16b6f..00000000000 --- a/db/migrate/20170918140927_create_group_custom_attributes.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateGroupCustomAttributes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :group_custom_attributes do |t| - t.timestamps_with_timezone null: false - t.references :group, null: false - t.string :key, null: false - t.string :value, null: false - - t.index [:group_id, :key], unique: true - t.index [:key, :value] - end - - add_foreign_key :group_custom_attributes, :namespaces, column: :group_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey - end -end diff --git a/db/migrate/20170918222253_reorganize_deployments_indexes.rb b/db/migrate/20170918222253_reorganize_deployments_indexes.rb deleted file mode 100644 index 480847ac393..00000000000 --- a/db/migrate/20170918222253_reorganize_deployments_indexes.rb +++ /dev/null @@ -1,28 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ReorganizeDeploymentsIndexes < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_index_if_not_exists :deployments, [:environment_id, :iid, :project_id] - remove_index_if_exists :deployments, [:project_id, :environment_id, :iid] - end - - def down - add_index_if_not_exists :deployments, [:project_id, :environment_id, :iid] - remove_index_if_exists :deployments, [:environment_id, :iid, :project_id] - end - - def add_index_if_not_exists(table, columns) - add_concurrent_index(table, columns) unless index_exists?(table, columns) - end - - def remove_index_if_exists(table, columns) - remove_concurrent_index(table, columns) if index_exists?(table, columns) - end -end diff --git a/db/migrate/20170918223303_add_deployments_index_for_last_deployment.rb b/db/migrate/20170918223303_add_deployments_index_for_last_deployment.rb deleted file mode 100644 index 8e165ac647d..00000000000 --- a/db/migrate/20170918223303_add_deployments_index_for_last_deployment.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddDeploymentsIndexForLastDeployment < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - TO_INDEX = [:deployments, %i[environment_id id]].freeze - - def up - add_concurrent_index(*TO_INDEX) - end - - def down - remove_concurrent_index(*TO_INDEX) - end -end diff --git a/db/migrate/20170919211300_remove_temporary_ci_builds_index.rb b/db/migrate/20170919211300_remove_temporary_ci_builds_index.rb deleted file mode 100644 index 23c94a809d4..00000000000 --- a/db/migrate/20170919211300_remove_temporary_ci_builds_index.rb +++ /dev/null @@ -1,28 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveTemporaryCiBuildsIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # To use create/remove index concurrently - disable_ddl_transaction! - - def up - return unless index_exists?(:ci_builds, :id, name: 'index_for_ci_builds_retried_migration') - - remove_concurrent_index(:ci_builds, :id, name: "index_for_ci_builds_retried_migration") - end - - def down - # this was a temporary index for a migration that was never - # present previously so this probably shouldn't be here but it's - # easier to test the drop if we have a way to create it. - add_concurrent_index("ci_builds", ["id"], - name: "index_for_ci_builds_retried_migration", - where: "(retried IS NULL)", - using: :btree) - end -end diff --git a/db/migrate/20170921115009_add_project_repository_storage_index.rb b/db/migrate/20170921115009_add_project_repository_storage_index.rb deleted file mode 100644 index 9e1f5052f28..00000000000 --- a/db/migrate/20170921115009_add_project_repository_storage_index.rb +++ /dev/null @@ -1,19 +0,0 @@ -class AddProjectRepositoryStorageIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(*index_spec) unless index_exists?(*index_spec) - end - - def down - remove_concurrent_index(*index_spec) if index_exists?(*index_spec) - end - - def index_spec - [:projects, :repository_storage] - end -end diff --git a/db/migrate/20170924094327_create_gcp_clusters.rb b/db/migrate/20170924094327_create_gcp_clusters.rb deleted file mode 100644 index 43201f75ad7..00000000000 --- a/db/migrate/20170924094327_create_gcp_clusters.rb +++ /dev/null @@ -1,45 +0,0 @@ -class CreateGcpClusters < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :gcp_clusters do |t| - # Order columns by best align scheme - t.references :project, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.references :user, foreign_key: { on_delete: :nullify } - t.references :service, foreign_key: { on_delete: :nullify } - t.integer :status - t.integer :gcp_cluster_size, null: false - - # Timestamps - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - # Enable/disable - t.boolean :enabled, default: true - - # General - t.text :status_reason - - # k8s integration specific - t.string :project_namespace - - # Cluster details - t.string :endpoint - t.text :ca_cert - t.text :encrypted_kubernetes_token - t.string :encrypted_kubernetes_token_iv - t.string :username - t.text :encrypted_password - t.string :encrypted_password_iv - - # GKE - t.string :gcp_project_id, null: false - t.string :gcp_cluster_zone, null: false - t.string :gcp_cluster_name, null: false - t.string :gcp_machine_type - t.string :gcp_operation_id - t.text :encrypted_gcp_token - t.string :encrypted_gcp_token_iv - end - end -end diff --git a/db/migrate/20170925184228_add_favicon_to_appearances.rb b/db/migrate/20170925184228_add_favicon_to_appearances.rb deleted file mode 100644 index 1ce750f7e83..00000000000 --- a/db/migrate/20170925184228_add_favicon_to_appearances.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddFaviconToAppearances < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - add_column :appearances, :favicon, :string - end -end diff --git a/db/migrate/20170927095921_add_ci_builds_index_for_jobscontroller.rb b/db/migrate/20170927095921_add_ci_builds_index_for_jobscontroller.rb deleted file mode 100644 index 3ee9c959fca..00000000000 --- a/db/migrate/20170927095921_add_ci_builds_index_for_jobscontroller.rb +++ /dev/null @@ -1,39 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddCiBuildsIndexForJobscontroller < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - disable_ddl_transaction! - - def up - add_concurrent_index :ci_builds, [:project_id, :id] unless index_exists? :ci_builds, [:project_id, :id] - remove_concurrent_index :ci_builds, :project_id if index_exists? :ci_builds, :project_id - end - - def down - add_concurrent_index :ci_builds, :project_id unless index_exists? :ci_builds, :project_id - remove_concurrent_index :ci_builds, [:project_id, :id] if index_exists? :ci_builds, [:project_id, :id] - end -end diff --git a/db/migrate/20170927122209_add_partial_index_for_labels_template.rb b/db/migrate/20170927122209_add_partial_index_for_labels_template.rb deleted file mode 100644 index dd79e024df4..00000000000 --- a/db/migrate/20170927122209_add_partial_index_for_labels_template.rb +++ /dev/null @@ -1,45 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPartialIndexForLabelsTemplate < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - - disable_ddl_transaction! - - # Note this is a partial index in Postgres but MySQL will ignore the - # partial index clause. By making it an index on "template" this - # means the index will still accomplish the same goal of optimizing - # a query with "where template = true" on MySQL -- it'll just take - # more space. In this case the number of records with template=true - # is expected to be very small (small enough to display on a single - # web page) so it's ok to filter or sort them without the index - # anyways. - - def up - add_concurrent_index "labels", ["template"], where: "template" - end - - def down - remove_concurrent_index "labels", ["template"], where: "template" - end -end diff --git a/db/migrate/20170927161718_create_gpg_key_subkeys.rb b/db/migrate/20170927161718_create_gpg_key_subkeys.rb deleted file mode 100644 index 3b5d452ee12..00000000000 --- a/db/migrate/20170927161718_create_gpg_key_subkeys.rb +++ /dev/null @@ -1,25 +0,0 @@ -class CreateGpgKeySubkeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - create_table :gpg_key_subkeys do |t| - t.references :gpg_key, null: false, index: true, foreign_key: { on_delete: :cascade } - - t.binary :keyid - t.binary :fingerprint - - t.index :keyid, unique: true, length: mysql_compatible_index_length - t.index :fingerprint, unique: true, length: mysql_compatible_index_length - end - - add_reference :gpg_signatures, :gpg_key_subkey, index: true, foreign_key: { on_delete: :nullify } - end - - def down - remove_reference(:gpg_signatures, :gpg_key_subkey, index: true, foreign_key: true) - - drop_table :gpg_key_subkeys - end -end diff --git a/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb b/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb deleted file mode 100644 index cb16589e8db..00000000000 --- a/db/migrate/20170928100231_add_composite_index_on_merge_requests_merge_commit_sha.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddCompositeIndexOnMergeRequestsMergeCommitSha < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # The default index name is too long for PostgreSQL and would thus be - # truncated. - INDEX_NAME = 'index_merge_requests_on_tp_id_and_merge_commit_sha_and_id' - - COLUMNS = [:target_project_id, :merge_commit_sha, :id] - - disable_ddl_transaction! - - def up - return if index_is_present? - - add_concurrent_index(:merge_requests, COLUMNS, name: INDEX_NAME) - end - - def down - return unless index_is_present? - - remove_concurrent_index(:merge_requests, COLUMNS, name: INDEX_NAME) - end - - def index_is_present? - index_exists?(:merge_requests, COLUMNS, name: INDEX_NAME) - end -end diff --git a/db/migrate/20170928124105_create_fork_networks.rb b/db/migrate/20170928124105_create_fork_networks.rb deleted file mode 100644 index 01f623117f5..00000000000 --- a/db/migrate/20170928124105_create_fork_networks.rb +++ /dev/null @@ -1,29 +0,0 @@ -class CreateForkNetworks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :fork_networks do |t| - t.references :root_project, - references: :projects, - index: { unique: true } - - t.string :deleted_root_project_name - end - - add_concurrent_foreign_key :fork_networks, :projects, - column: :root_project_id, - on_delete: :nullify - end - - def down - if foreign_keys_for(:fork_networks, :root_project_id).any? - remove_foreign_key :fork_networks, column: :root_project_id - end - - drop_table :fork_networks - end -end diff --git a/db/migrate/20170928133643_create_fork_network_members.rb b/db/migrate/20170928133643_create_fork_network_members.rb deleted file mode 100644 index e2a6d7b0e8a..00000000000 --- a/db/migrate/20170928133643_create_fork_network_members.rb +++ /dev/null @@ -1,27 +0,0 @@ -class CreateForkNetworkMembers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - create_table :fork_network_members do |t| - t.references :fork_network, null: false, index: true, foreign_key: { on_delete: :cascade } - t.references :project, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - t.references :forked_from_project, references: :projects - end - - add_concurrent_foreign_key :fork_network_members, :projects, - column: :forked_from_project_id, - on_delete: :nullify - end - - def down - if foreign_keys_for(:fork_network_members, :forked_from_project_id).any? - remove_foreign_key :fork_network_members, column: :forked_from_project_id - end - - drop_table :fork_network_members - end -end diff --git a/db/migrate/20170929080234_add_failure_reason_to_pipelines.rb b/db/migrate/20170929080234_add_failure_reason_to_pipelines.rb deleted file mode 100644 index e000ee27eef..00000000000 --- a/db/migrate/20170929080234_add_failure_reason_to_pipelines.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddFailureReasonToPipelines < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :ci_pipelines, :failure_reason, :integer - end -end diff --git a/db/migrate/20170929131201_populate_fork_networks.rb b/db/migrate/20170929131201_populate_fork_networks.rb deleted file mode 100644 index ba4f8ef2531..00000000000 --- a/db/migrate/20170929131201_populate_fork_networks.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PopulateForkNetworks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - say 'Fork networks will be populated in 20171205190711 - RescheduleForkNetworkCreationCaller' - end - - def down - # nothing - end -end diff --git a/db/migrate/20171004121444_make_sure_fast_forward_option_exists.rb b/db/migrate/20171004121444_make_sure_fast_forward_option_exists.rb deleted file mode 100644 index 9b417de1793..00000000000 --- a/db/migrate/20171004121444_make_sure_fast_forward_option_exists.rb +++ /dev/null @@ -1,25 +0,0 @@ -# rubocop:disable all -class MakeSureFastForwardOptionExists < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # We had to fix the migration db/migrate/20150827121444_add_fast_forward_option_to_project.rb - # And this is why it's possible that someone has ran the migrations but does - # not have the merge_requests_ff_only_enabled column. This migration makes sure it will - # be added - unless column_exists?(:projects, :merge_requests_ff_only_enabled) - add_column_with_default(:projects, :merge_requests_ff_only_enabled, :boolean, default: false) - end - end - - def down - if column_exists?(:projects, :merge_requests_ff_only_enabled) - remove_column(:projects, :merge_requests_ff_only_enabled) - end - end -end diff --git a/db/migrate/20171006090001_create_ci_build_trace_sections.rb b/db/migrate/20171006090001_create_ci_build_trace_sections.rb deleted file mode 100644 index a2eca0832f2..00000000000 --- a/db/migrate/20171006090001_create_ci_build_trace_sections.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateCiBuildTraceSections < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :ci_build_trace_sections do |t| - t.references :project, null: false, index: true, foreign_key: { on_delete: :cascade } - t.datetime_with_timezone :date_start, null: false - t.datetime_with_timezone :date_end, null: false - t.integer :byte_start, limit: 8, null: false - t.integer :byte_end, limit: 8, null: false - t.integer :build_id, null: false - t.integer :section_name_id, null: false - end - - add_index :ci_build_trace_sections, [:build_id, :section_name_id], unique: true - end -end diff --git a/db/migrate/20171006090010_add_build_foreign_key_to_ci_build_trace_sections.rb b/db/migrate/20171006090010_add_build_foreign_key_to_ci_build_trace_sections.rb deleted file mode 100644 index 7b17763ac84..00000000000 --- a/db/migrate/20171006090010_add_build_foreign_key_to_ci_build_trace_sections.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddBuildForeignKeyToCiBuildTraceSections < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:ci_build_trace_sections, :ci_builds, column: :build_id) - end - - def down - remove_foreign_key(:ci_build_trace_sections, column: :build_id) - end -end diff --git a/db/migrate/20171006090100_create_ci_build_trace_section_names.rb b/db/migrate/20171006090100_create_ci_build_trace_section_names.rb deleted file mode 100644 index 00a38fa59c2..00000000000 --- a/db/migrate/20171006090100_create_ci_build_trace_section_names.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateCiBuildTraceSectionNames < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - create_table :ci_build_trace_section_names do |t| - t.references :project, null: false, foreign_key: { on_delete: :cascade } - t.string :name, null: false - end - - add_index :ci_build_trace_section_names, [:project_id, :name], unique: true - end - - def down - remove_foreign_key :ci_build_trace_section_names, column: :project_id - drop_table :ci_build_trace_section_names - end -end diff --git a/db/migrate/20171006091000_add_name_foreign_key_to_ci_build_trace_sections.rb b/db/migrate/20171006091000_add_name_foreign_key_to_ci_build_trace_sections.rb deleted file mode 100644 index 1342ff013b7..00000000000 --- a/db/migrate/20171006091000_add_name_foreign_key_to_ci_build_trace_sections.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddNameForeignKeyToCiBuildTraceSections < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:ci_build_trace_sections, :ci_build_trace_section_names, column: :section_name_id) - end - - def down - remove_foreign_key(:ci_build_trace_sections, column: :section_name_id) - end -end diff --git a/db/migrate/20171006220837_add_global_rate_limits_to_application_settings.rb b/db/migrate/20171006220837_add_global_rate_limits_to_application_settings.rb deleted file mode 100644 index 96d76069b35..00000000000 --- a/db/migrate/20171006220837_add_global_rate_limits_to_application_settings.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddGlobalRateLimitsToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, :throttle_unauthenticated_enabled, :boolean, default: false, allow_null: false - add_column_with_default :application_settings, :throttle_unauthenticated_requests_per_period, :integer, default: 3600, allow_null: false - add_column_with_default :application_settings, :throttle_unauthenticated_period_in_seconds, :integer, default: 3600, allow_null: false - - add_column_with_default :application_settings, :throttle_authenticated_api_enabled, :boolean, default: false, allow_null: false - add_column_with_default :application_settings, :throttle_authenticated_api_requests_per_period, :integer, default: 7200, allow_null: false - add_column_with_default :application_settings, :throttle_authenticated_api_period_in_seconds, :integer, default: 3600, allow_null: false - - add_column_with_default :application_settings, :throttle_authenticated_web_enabled, :boolean, default: false, allow_null: false - add_column_with_default :application_settings, :throttle_authenticated_web_requests_per_period, :integer, default: 7200, allow_null: false - add_column_with_default :application_settings, :throttle_authenticated_web_period_in_seconds, :integer, default: 3600, allow_null: false - end - - def down - remove_column :application_settings, :throttle_authenticated_web_period_in_seconds - remove_column :application_settings, :throttle_authenticated_web_requests_per_period - remove_column :application_settings, :throttle_authenticated_web_enabled - - remove_column :application_settings, :throttle_authenticated_api_period_in_seconds - remove_column :application_settings, :throttle_authenticated_api_requests_per_period - remove_column :application_settings, :throttle_authenticated_api_enabled - - remove_column :application_settings, :throttle_unauthenticated_period_in_seconds - remove_column :application_settings, :throttle_unauthenticated_requests_per_period - remove_column :application_settings, :throttle_unauthenticated_enabled - end -end diff --git a/db/migrate/20171012101043_add_circuit_breaker_properties_to_application_settings.rb b/db/migrate/20171012101043_add_circuit_breaker_properties_to_application_settings.rb deleted file mode 100644 index 91bba07b4d7..00000000000 --- a/db/migrate/20171012101043_add_circuit_breaker_properties_to_application_settings.rb +++ /dev/null @@ -1,27 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddCircuitBreakerPropertiesToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, - :circuitbreaker_failure_count_threshold, - :integer, - default: 160 - add_column :application_settings, - :circuitbreaker_failure_wait_time, - :integer, - default: 30 - add_column :application_settings, - :circuitbreaker_failure_reset_time, - :integer, - default: 1800 - add_column :application_settings, - :circuitbreaker_storage_timeout, - :integer, - default: 30 - end -end diff --git a/db/migrate/20171012125712_migrate_user_authentication_token_to_personal_access_token.rb b/db/migrate/20171012125712_migrate_user_authentication_token_to_personal_access_token.rb deleted file mode 100644 index 305c12e31f8..00000000000 --- a/db/migrate/20171012125712_migrate_user_authentication_token_to_personal_access_token.rb +++ /dev/null @@ -1,78 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateUserAuthenticationTokenToPersonalAccessToken < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # disable_ddl_transaction! - - TOKEN_NAME = 'Private Token'.freeze - - def up - execute <<~SQL - INSERT INTO personal_access_tokens (user_id, token, name, created_at, updated_at, scopes) - SELECT id, authentication_token, '#{TOKEN_NAME}', NOW(), NOW(), '#{%w[api].to_yaml}' - FROM users - WHERE authentication_token IS NOT NULL - AND admin = FALSE - AND NOT EXISTS ( - SELECT true - FROM personal_access_tokens - WHERE user_id = users.id - AND token = users.authentication_token - ) - SQL - - # Admins also need the `sudo` scope - execute <<~SQL - INSERT INTO personal_access_tokens (user_id, token, name, created_at, updated_at, scopes) - SELECT id, authentication_token, '#{TOKEN_NAME}', NOW(), NOW(), '#{%w[api sudo].to_yaml}' - FROM users - WHERE authentication_token IS NOT NULL - AND admin = TRUE - AND NOT EXISTS ( - SELECT true - FROM personal_access_tokens - WHERE user_id = users.id - AND token = users.authentication_token - ) - SQL - end - - def down - if Gitlab::Database.postgresql? - execute <<~SQL - UPDATE users - SET authentication_token = pats.token - FROM ( - SELECT user_id, token - FROM personal_access_tokens - WHERE name = '#{TOKEN_NAME}' - ) AS pats - WHERE id = pats.user_id - SQL - else - execute <<~SQL - UPDATE users - INNER JOIN personal_access_tokens AS pats - ON users.id = pats.user_id - SET authentication_token = pats.token - WHERE pats.name = '#{TOKEN_NAME}' - SQL - end - - execute <<~SQL - DELETE FROM personal_access_tokens - WHERE name = '#{TOKEN_NAME}' - AND EXISTS ( - SELECT true - FROM users - WHERE id = personal_access_tokens.user_id - AND authentication_token = personal_access_tokens.token - ) - SQL - end -end diff --git a/db/migrate/20171013094327_create_new_clusters_architectures.rb b/db/migrate/20171013094327_create_new_clusters_architectures.rb deleted file mode 100644 index 98f91e6130f..00000000000 --- a/db/migrate/20171013094327_create_new_clusters_architectures.rb +++ /dev/null @@ -1,68 +0,0 @@ -class CreateNewClustersArchitectures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - create_table :clusters do |t| - t.references :user, index: true, foreign_key: { on_delete: :nullify } - - t.integer :provider_type - t.integer :platform_type - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - t.boolean :enabled, index: true, default: true - - t.string :name, null: false # If manual, read-write. If gcp, read-only. - end - - create_table :cluster_projects do |t| - t.references :project, null: false, index: true, foreign_key: { on_delete: :cascade } - t.references :cluster, null: false, index: true, foreign_key: { on_delete: :cascade } - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - end - - create_table :cluster_platforms_kubernetes do |t| - t.references :cluster, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - t.text :api_url - t.text :ca_cert - - t.string :namespace - - t.string :username - t.text :encrypted_password - t.string :encrypted_password_iv - - t.text :encrypted_token - t.string :encrypted_token_iv - end - - create_table :cluster_providers_gcp do |t| - t.references :cluster, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade } - - t.integer :status - t.integer :num_nodes, null: false - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - t.text :status_reason - - t.string :gcp_project_id, null: false - t.string :zone, null: false - t.string :machine_type - t.string :operation_id - - t.string :endpoint - - t.text :encrypted_access_token - t.string :encrypted_access_token_iv - end - end -end diff --git a/db/migrate/20171017145932_add_new_circuitbreaker_settings_to_application_settings.rb b/db/migrate/20171017145932_add_new_circuitbreaker_settings_to_application_settings.rb deleted file mode 100644 index 4a0cadea364..00000000000 --- a/db/migrate/20171017145932_add_new_circuitbreaker_settings_to_application_settings.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddNewCircuitbreakerSettingsToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, - :circuitbreaker_access_retries, - :integer, - default: 3 - add_column :application_settings, - :circuitbreaker_backoff_threshold, - :integer, - default: 80 - end -end diff --git a/db/migrate/20171019141859_fix_dev_timezone_schema.rb b/db/migrate/20171019141859_fix_dev_timezone_schema.rb deleted file mode 100644 index 68c8b528e17..00000000000 --- a/db/migrate/20171019141859_fix_dev_timezone_schema.rb +++ /dev/null @@ -1,25 +0,0 @@ -class FixDevTimezoneSchema < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # The this migrations tries to help solve unwanted changes to `schema.rb` - # while developing GitLab. Installations created before we started using - # `datetime_with_timezone` are likely to face this problem. Updating those - # columns to the new type should help fix this. - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - TIMEZONE_TABLES = %i(appearances ci_group_variables ci_pipeline_schedule_variables events gpg_keys gpg_signatures project_auto_devops) - - def up - return unless Rails.env.development? || Rails.env.test? - - TIMEZONE_TABLES.each do |table| - change_column table, :created_at, :datetime_with_timezone - change_column table, :updated_at, :datetime_with_timezone - end - end - - def down - end -end diff --git a/db/migrate/20171025110159_add_latest_merge_request_diff_id_to_merge_requests.rb b/db/migrate/20171025110159_add_latest_merge_request_diff_id_to_merge_requests.rb deleted file mode 100644 index 1af0cf70958..00000000000 --- a/db/migrate/20171025110159_add_latest_merge_request_diff_id_to_merge_requests.rb +++ /dev/null @@ -1,26 +0,0 @@ -class AddLatestMergeRequestDiffIdToMergeRequests < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :merge_requests, :latest_merge_request_diff_id, :integer - add_concurrent_index :merge_requests, :latest_merge_request_diff_id - - add_concurrent_foreign_key :merge_requests, :merge_request_diffs, - column: :latest_merge_request_diff_id, - on_delete: :nullify - end - - def down - remove_foreign_key :merge_requests, column: :latest_merge_request_diff_id - - if index_exists?(:merge_requests, :latest_merge_request_diff_id) - remove_concurrent_index :merge_requests, :latest_merge_request_diff_id - end - - remove_column :merge_requests, :latest_merge_request_diff_id - end -end diff --git a/db/migrate/20171031100710_create_clusters_kubernetes_helm_apps.rb b/db/migrate/20171031100710_create_clusters_kubernetes_helm_apps.rb deleted file mode 100644 index 0af05f5c94a..00000000000 --- a/db/migrate/20171031100710_create_clusters_kubernetes_helm_apps.rb +++ /dev/null @@ -1,18 +0,0 @@ -class CreateClustersKubernetesHelmApps < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :clusters_applications_helm do |t| - t.references :cluster, null: false, unique: true, foreign_key: { on_delete: :cascade } - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - t.integer :status, null: false - t.string :version, null: false - t.text :status_reason - end - end -end diff --git a/db/migrate/20171101130535_add_gitaly_timeout_properties_to_application_settings.rb b/db/migrate/20171101130535_add_gitaly_timeout_properties_to_application_settings.rb deleted file mode 100644 index 6d60fdc6132..00000000000 --- a/db/migrate/20171101130535_add_gitaly_timeout_properties_to_application_settings.rb +++ /dev/null @@ -1,31 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddGitalyTimeoutPropertiesToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, - :gitaly_timeout_default, - :integer, - default: 55 - add_column_with_default :application_settings, - :gitaly_timeout_medium, - :integer, - default: 30 - add_column_with_default :application_settings, - :gitaly_timeout_fast, - :integer, - default: 10 - end - - def down - remove_column :application_settings, :gitaly_timeout_default - remove_column :application_settings, :gitaly_timeout_medium - remove_column :application_settings, :gitaly_timeout_fast - end -end diff --git a/db/migrate/20171103000000_set_uploads_path_size_for_mysql.rb b/db/migrate/20171103000000_set_uploads_path_size_for_mysql.rb deleted file mode 100644 index 93cec87f999..00000000000 --- a/db/migrate/20171103000000_set_uploads_path_size_for_mysql.rb +++ /dev/null @@ -1,25 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class SetUploadsPathSizeForMysql < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - # We need at least 297 at the moment. For more detail on that number, see: - # https://gitlab.com/gitlab-org/gitlab-ce/issues/40168#what-is-the-expected-correct-behavior - # - # Rails + PostgreSQL `string` is equivalent to a `text` field, but - # Rails + MySQL `string` is `varchar(255)` by default. Also, note that we - # have an upper limit because with a unique index, MySQL has a max key - # length of 3072 bytes which seems to correspond to `varchar(1024)`. - change_column :uploads, :path, :string, limit: 511 - end - - def down - # It was unspecified, which is varchar(255) by default in Rails for MySQL. - change_column :uploads, :path, :string - end -end diff --git a/db/migrate/20171106101200_create_clusters_kubernetes_ingress_apps.rb b/db/migrate/20171106101200_create_clusters_kubernetes_ingress_apps.rb deleted file mode 100644 index 770cb94ee18..00000000000 --- a/db/migrate/20171106101200_create_clusters_kubernetes_ingress_apps.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateClustersKubernetesIngressApps < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :clusters_applications_ingress do |t| - t.references :cluster, null: false, unique: true, foreign_key: { on_delete: :cascade } - - t.datetime_with_timezone :created_at, null: false - t.datetime_with_timezone :updated_at, null: false - - t.integer :status, null: false - t.integer :ingress_type, null: false - - t.string :version, null: false - t.string :cluster_ip - t.text :status_reason - end - end -end diff --git a/db/migrate/20171106132212_issues_confidential_not_null.rb b/db/migrate/20171106132212_issues_confidential_not_null.rb deleted file mode 100644 index 444a38c2dc5..00000000000 --- a/db/migrate/20171106132212_issues_confidential_not_null.rb +++ /dev/null @@ -1,23 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IssuesConfidentialNotNull < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - class Issue < ActiveRecord::Base - self.table_name = 'issues' - end - - def up - Issue.where('confidential IS NULL').update_all(confidential: false) - - change_column_null :issues, :confidential, false - end - - def down - # There's no way / point to revert this. - end -end diff --git a/db/migrate/20171106133143_rename_application_settings_password_authentication_enabled_to_password_authentication_enabled_for_web.rb b/db/migrate/20171106133143_rename_application_settings_password_authentication_enabled_to_password_authentication_enabled_for_web.rb deleted file mode 100644 index 58762a4f852..00000000000 --- a/db/migrate/20171106133143_rename_application_settings_password_authentication_enabled_to_password_authentication_enabled_for_web.rb +++ /dev/null @@ -1,15 +0,0 @@ -class RenameApplicationSettingsPasswordAuthenticationEnabledToPasswordAuthenticationEnabledForWeb < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - rename_column_concurrently :application_settings, :password_authentication_enabled, :password_authentication_enabled_for_web - end - - def down - cleanup_concurrent_column_rename :application_settings, :password_authentication_enabled_for_web, :password_authentication_enabled - end -end diff --git a/db/migrate/20171106133911_add_password_authentication_enabled_for_git_to_application_settings.rb b/db/migrate/20171106133911_add_password_authentication_enabled_for_git_to_application_settings.rb deleted file mode 100644 index 1f96a0426a1..00000000000 --- a/db/migrate/20171106133911_add_password_authentication_enabled_for_git_to_application_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddPasswordAuthenticationEnabledForGitToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :application_settings, :password_authentication_enabled_for_git, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20171106135924_issues_milestone_id_foreign_key.rb b/db/migrate/20171106135924_issues_milestone_id_foreign_key.rb deleted file mode 100644 index 1de7d5e768e..00000000000 --- a/db/migrate/20171106135924_issues_milestone_id_foreign_key.rb +++ /dev/null @@ -1,39 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IssuesMilestoneIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - include EachBatch - - self.table_name = 'issues' - - def self.with_orphaned_milestones - where('NOT EXISTS (SELECT true FROM milestones WHERE milestones.id = issues.milestone_id)') - .where('milestone_id IS NOT NULL') - end - end - - def up - Issue.with_orphaned_milestones.each_batch(of: 100) do |batch| - batch.update_all(milestone_id: nil) - end - - add_concurrent_foreign_key( - :issues, - :milestones, - column: :milestone_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:issues, column: :milestone_id) - end -end diff --git a/db/migrate/20171106150657_issues_updated_by_id_foreign_key.rb b/db/migrate/20171106150657_issues_updated_by_id_foreign_key.rb deleted file mode 100644 index b2992b1ff5d..00000000000 --- a/db/migrate/20171106150657_issues_updated_by_id_foreign_key.rb +++ /dev/null @@ -1,45 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IssuesUpdatedByIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - include EachBatch - - self.table_name = 'issues' - - def self.with_orphaned_updaters - where('NOT EXISTS (SELECT true FROM users WHERE users.id = issues.updated_by_id)') - .where('updated_by_id IS NOT NULL') - end - end - - def up - Issue.with_orphaned_updaters.each_batch(of: 100) do |batch| - batch.update_all(updated_by_id: nil) - end - - # This index is only used for foreign keys, and those in turn will always - # specify a value. As such we can add a WHERE condition to make the index - # smaller. - add_concurrent_index(:issues, :updated_by_id, where: 'updated_by_id IS NOT NULL') - - add_concurrent_foreign_key( - :issues, - :users, - column: :updated_by_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:issues, column: :updated_by_id) - remove_concurrent_index(:issues, :updated_by_id) - end -end diff --git a/db/migrate/20171106151218_issues_moved_to_id_foreign_key.rb b/db/migrate/20171106151218_issues_moved_to_id_foreign_key.rb deleted file mode 100644 index 66bfb5718dc..00000000000 --- a/db/migrate/20171106151218_issues_moved_to_id_foreign_key.rb +++ /dev/null @@ -1,56 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class IssuesMovedToIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - include EachBatch - - self.table_name = 'issues' - - def self.with_orphaned_moved_to_issues - if Gitlab::Database.postgresql? - # Be careful to use a second table here for comparison otherwise we'll null - # out all rows that don't have id == moved.to_id! - where('NOT EXISTS (SELECT true FROM issues B WHERE issues.moved_to_id = B.id)') - .where('moved_to_id IS NOT NULL') - else - # MySQL doesn't allow modification of the same table in a subquery, - # and using a temporary table isn't automatically guaranteed to work - # due to the MySQL query optimizer. See - # https://dev.mysql.com/doc/refman/5.7/en/update.html for more - # details. - joins('LEFT JOIN issues AS b ON issues.moved_to_id = b.id') - .where('issues.moved_to_id IS NOT NULL AND b.id IS NULL') - end - end - end - - def up - Issue.with_orphaned_moved_to_issues.each_batch(of: 100) do |batch| - batch.update_all(moved_to_id: nil) - end - - add_concurrent_foreign_key( - :issues, - :issues, - column: :moved_to_id, - on_delete: :nullify - ) - - # We're using a partial index here so we only index the data we actually - # care about. - add_concurrent_index(:issues, :moved_to_id, where: 'moved_to_id IS NOT NULL') - end - - def down - remove_foreign_key_without_error(:issues, column: :moved_to_id) - remove_concurrent_index(:issues, :moved_to_id) - end -end diff --git a/db/migrate/20171106155656_turn_issues_due_date_index_to_partial_index.rb b/db/migrate/20171106155656_turn_issues_due_date_index_to_partial_index.rb deleted file mode 100644 index 58392de5e6b..00000000000 --- a/db/migrate/20171106155656_turn_issues_due_date_index_to_partial_index.rb +++ /dev/null @@ -1,35 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class TurnIssuesDueDateIndexToPartialIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - NEW_INDEX_NAME = 'idx_issues_on_project_id_and_due_date_and_id_and_state_partial' - OLD_INDEX_NAME = 'index_issues_on_project_id_and_due_date_and_id_and_state' - - disable_ddl_transaction! - - def up - add_concurrent_index( - :issues, - [:project_id, :due_date, :id, :state], - where: 'due_date IS NOT NULL', - name: NEW_INDEX_NAME - ) - - remove_concurrent_index_by_name(:issues, OLD_INDEX_NAME) - end - - def down - add_concurrent_index( - :issues, - [:project_id, :due_date, :id, :state], - name: OLD_INDEX_NAME - ) - - remove_concurrent_index_by_name(:issues, NEW_INDEX_NAME) - end -end diff --git a/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb b/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb deleted file mode 100644 index c6edc1af6cb..00000000000 --- a/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb +++ /dev/null @@ -1,20 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddTimezoneToIssuesClosedAt < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - # rubocop:disable Migration/UpdateLargeTable - change_column_type_concurrently(:issues, :closed_at, :datetime_with_timezone) - end - - def down - cleanup_concurrent_column_type_change(:issues, :closed_at) - end -end diff --git a/db/migrate/20171114150259_merge_requests_author_id_foreign_key.rb b/db/migrate/20171114150259_merge_requests_author_id_foreign_key.rb deleted file mode 100644 index 4ebb6fad059..00000000000 --- a/db/migrate/20171114150259_merge_requests_author_id_foreign_key.rb +++ /dev/null @@ -1,43 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsAuthorIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_authors - where('NOT EXISTS (SELECT true FROM users WHERE merge_requests.author_id = users.id)') - .where('author_id IS NOT NULL') - end - end - - def up - # Replacing the ghost user ID logic would be too complex, hence we don't - # redefine the User model here. - ghost_id = User.select(:id).ghost.id - - MergeRequest.with_orphaned_authors.each_batch(of: 100) do |batch| - batch.update_all(author_id: ghost_id) - end - - add_concurrent_foreign_key( - :merge_requests, - :users, - column: :author_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key(:merge_requests, column: :author_id) - end -end diff --git a/db/migrate/20171114160005_merge_requests_assignee_id_foreign_key.rb b/db/migrate/20171114160005_merge_requests_assignee_id_foreign_key.rb deleted file mode 100644 index 73c177c44f9..00000000000 --- a/db/migrate/20171114160005_merge_requests_assignee_id_foreign_key.rb +++ /dev/null @@ -1,39 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsAssigneeIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_assignees - where('NOT EXISTS (SELECT true FROM users WHERE merge_requests.assignee_id = users.id)') - .where('assignee_id IS NOT NULL') - end - end - - def up - MergeRequest.with_orphaned_assignees.each_batch(of: 100) do |batch| - batch.update_all(assignee_id: nil) - end - - add_concurrent_foreign_key( - :merge_requests, - :users, - column: :assignee_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key(:merge_requests, column: :assignee_id) - end -end diff --git a/db/migrate/20171114160904_merge_requests_updated_by_id_foreign_key.rb b/db/migrate/20171114160904_merge_requests_updated_by_id_foreign_key.rb deleted file mode 100644 index 69f9c181c10..00000000000 --- a/db/migrate/20171114160904_merge_requests_updated_by_id_foreign_key.rb +++ /dev/null @@ -1,46 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsUpdatedByIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_updaters - where('NOT EXISTS (SELECT true FROM users WHERE merge_requests.updated_by_id = users.id)') - .where('updated_by_id IS NOT NULL') - end - end - - def up - MergeRequest.with_orphaned_updaters.each_batch(of: 100) do |batch| - batch.update_all(updated_by_id: nil) - end - - add_concurrent_index( - :merge_requests, - :updated_by_id, - where: 'updated_by_id IS NOT NULL' - ) - - add_concurrent_foreign_key( - :merge_requests, - :users, - column: :updated_by_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:merge_requests, column: :updated_by_id) - remove_concurrent_index(:merge_requests, :updated_by_id) - end -end diff --git a/db/migrate/20171114161720_merge_requests_merge_user_id_foreign_key.rb b/db/migrate/20171114161720_merge_requests_merge_user_id_foreign_key.rb deleted file mode 100644 index ccd275d5bb4..00000000000 --- a/db/migrate/20171114161720_merge_requests_merge_user_id_foreign_key.rb +++ /dev/null @@ -1,46 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsMergeUserIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_mergers - where('NOT EXISTS (SELECT true FROM users WHERE merge_requests.merge_user_id = users.id)') - .where('merge_user_id IS NOT NULL') - end - end - - def up - MergeRequest.with_orphaned_mergers.each_batch(of: 100) do |batch| - batch.update_all(merge_user_id: nil) - end - - add_concurrent_index( - :merge_requests, - :merge_user_id, - where: 'merge_user_id IS NOT NULL' - ) - - add_concurrent_foreign_key( - :merge_requests, - :users, - column: :merge_user_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:merge_requests, column: :merge_user_id) - remove_concurrent_index(:merge_requests, :merge_user_id) - end -end diff --git a/db/migrate/20171114161914_merge_requests_source_project_id_foreign_key.rb b/db/migrate/20171114161914_merge_requests_source_project_id_foreign_key.rb deleted file mode 100644 index 250928a6551..00000000000 --- a/db/migrate/20171114161914_merge_requests_source_project_id_foreign_key.rb +++ /dev/null @@ -1,45 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsSourceProjectIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_source_projects - where('NOT EXISTS (SELECT true FROM projects WHERE merge_requests.source_project_id = projects.id)') - .where('source_project_id IS NOT NULL') - end - end - - def up - # We need to allow NULL values so we can nullify the column when the source - # project is removed. We _don't_ want to remove the merge request, instead - # the application will keep them but close them. - change_column_null(:merge_requests, :source_project_id, true) - - MergeRequest.with_orphaned_source_projects.each_batch(of: 100) do |batch| - batch.update_all(source_project_id: nil) - end - - add_concurrent_foreign_key( - :merge_requests, - :projects, - column: :source_project_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:merge_requests, column: :source_project_id) - change_column_null(:merge_requests, :source_project_id, false) - end -end diff --git a/db/migrate/20171114162227_merge_requests_milestone_id_foreign_key.rb b/db/migrate/20171114162227_merge_requests_milestone_id_foreign_key.rb deleted file mode 100644 index cafe0ce0853..00000000000 --- a/db/migrate/20171114162227_merge_requests_milestone_id_foreign_key.rb +++ /dev/null @@ -1,39 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeRequestsMilestoneIdForeignKey < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - - def self.with_orphaned_milestones - where('NOT EXISTS (SELECT true FROM milestones WHERE merge_requests.milestone_id = milestones.id)') - .where('milestone_id IS NOT NULL') - end - end - - def up - MergeRequest.with_orphaned_milestones.each_batch(of: 100) do |batch| - batch.update_all(milestone_id: nil) - end - - add_concurrent_foreign_key( - :merge_requests, - :milestones, - column: :milestone_id, - on_delete: :nullify - ) - end - - def down - remove_foreign_key_without_error(:merge_requests, column: :milestone_id) - end -end diff --git a/db/migrate/20171115164540_populate_merge_requests_latest_merge_request_diff_id_take_two.rb b/db/migrate/20171115164540_populate_merge_requests_latest_merge_request_diff_id_take_two.rb deleted file mode 100644 index 935092ce46a..00000000000 --- a/db/migrate/20171115164540_populate_merge_requests_latest_merge_request_diff_id_take_two.rb +++ /dev/null @@ -1,30 +0,0 @@ -# This is identical to the stolen background migration, which already has specs. -class PopulateMergeRequestsLatestMergeRequestDiffIdTakeTwo < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - BATCH_SIZE = 1_000 - - class MergeRequest < ActiveRecord::Base - self.table_name = 'merge_requests' - - include ::EachBatch - end - - disable_ddl_transaction! - - def up - Gitlab::BackgroundMigration.steal('PopulateMergeRequestsLatestMergeRequestDiffId') - - update = ' - latest_merge_request_diff_id = ( - SELECT MAX(id) - FROM merge_request_diffs - WHERE merge_requests.id = merge_request_diffs.merge_request_id - )'.squish - - MergeRequest.where(latest_merge_request_diff_id: nil).each_batch(of: BATCH_SIZE) do |relation| - relation.update_all(update) - end - end -end diff --git a/db/migrate/20171116135628_add_environment_scope_to_clusters.rb b/db/migrate/20171116135628_add_environment_scope_to_clusters.rb deleted file mode 100644 index 39bb8759cc0..00000000000 --- a/db/migrate/20171116135628_add_environment_scope_to_clusters.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddEnvironmentScopeToClusters < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default(:clusters, :environment_scope, :string, default: '*') - end - - def down - remove_column(:clusters, :environment_scope) - end -end diff --git a/db/migrate/20171121144800_ci_pipelines_index_on_project_id_ref_status_id.rb b/db/migrate/20171121144800_ci_pipelines_index_on_project_id_ref_status_id.rb deleted file mode 100644 index a1dcfc70650..00000000000 --- a/db/migrate/20171121144800_ci_pipelines_index_on_project_id_ref_status_id.rb +++ /dev/null @@ -1,35 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CiPipelinesIndexOnProjectIdRefStatusId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - TABLE = :ci_pipelines - OLD_COLUMNS = %i[project_id ref status].freeze - NEW_COLUMNS = %i[project_id ref status id].freeze - - def up - unless index_exists?(TABLE, NEW_COLUMNS) - add_concurrent_index(TABLE, NEW_COLUMNS) - end - - if index_exists?(TABLE, OLD_COLUMNS) - remove_concurrent_index(TABLE, OLD_COLUMNS) - end - end - - def down - unless index_exists?(TABLE, OLD_COLUMNS) - add_concurrent_index(TABLE, OLD_COLUMNS) - end - - if index_exists?(TABLE, NEW_COLUMNS) - remove_concurrent_index(TABLE, NEW_COLUMNS) - end - end -end diff --git a/db/migrate/20171122131600_add_new_project_guidelines_to_appearances.rb b/db/migrate/20171122131600_add_new_project_guidelines_to_appearances.rb deleted file mode 100644 index cbcbb5d988a..00000000000 --- a/db/migrate/20171122131600_add_new_project_guidelines_to_appearances.rb +++ /dev/null @@ -1,18 +0,0 @@ -class AddNewProjectGuidelinesToAppearances < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - # Clears the current Appearance cache otherwise it breaks since - # new_project_guidelines_html would be missing. See - # https://gitlab.com/gitlab-org/gitlab-ce/issues/41041 - # We're not using Appearance#flush_redis_cache on purpose here. - Rails.cache.delete('current_appearance') - - change_table :appearances do |t| - t.text :new_project_guidelines - t.text :new_project_guidelines_html - end - end -end diff --git a/db/migrate/20171123094802_add_circuitbreaker_check_interval_to_application_settings.rb b/db/migrate/20171123094802_add_circuitbreaker_check_interval_to_application_settings.rb deleted file mode 100644 index 94360c64926..00000000000 --- a/db/migrate/20171123094802_add_circuitbreaker_check_interval_to_application_settings.rb +++ /dev/null @@ -1,20 +0,0 @@ -class AddCircuitbreakerCheckIntervalToApplicationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, - :circuitbreaker_check_interval, - :integer, - default: 1 - end - - def down - remove_column :application_settings, - :circuitbreaker_check_interval - end -end diff --git a/db/migrate/20171124125042_add_default_values_to_merge_request_states.rb b/db/migrate/20171124125042_add_default_values_to_merge_request_states.rb deleted file mode 100644 index d0d06863777..00000000000 --- a/db/migrate/20171124125042_add_default_values_to_merge_request_states.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddDefaultValuesToMergeRequestStates < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - change_column_default :merge_requests, :state, :opened - change_column_default :merge_requests, :merge_status, :unchecked - end - - def down - change_column_default :merge_requests, :state, nil - change_column_default :merge_requests, :merge_status, nil - end -end diff --git a/db/migrate/20171124125748_populate_missing_merge_request_statuses.rb b/db/migrate/20171124125748_populate_missing_merge_request_statuses.rb deleted file mode 100644 index 67444f36e24..00000000000 --- a/db/migrate/20171124125748_populate_missing_merge_request_statuses.rb +++ /dev/null @@ -1,50 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PopulateMissingMergeRequestStatuses < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - include EachBatch - - self.table_name = 'merge_requests' - end - - def up - say 'Populating missing merge_requests.state values' - - # GitLab.com has no rows where "state" is NULL, and technically this should - # never happen. However it doesn't hurt to be 100% certain. - MergeRequest.where(state: nil).each_batch do |batch| - batch.update_all(state: 'opened') - end - - say 'Populating missing merge_requests.merge_status values. ' \ - 'This will take a few minutes...' - - # GitLab.com has 66 880 rows where "merge_status" is NULL, dating back all - # the way to 2011. - MergeRequest.where(merge_status: nil).each_batch(of: 10_000) do |batch| - batch.update_all(merge_status: 'unchecked') - - # We want to give PostgreSQL some time to vacuum any dead tuples. In - # production we see it takes roughly 1 minute for a vacuuming run to clear - # out 10-20k dead tuples, so we'll wait for 90 seconds between every - # batch. - sleep(90) if sleep? - end - end - - def down - # Reverting this makes no sense. - end - - def sleep? - Rails.env.staging? || Rails.env.production? - end -end diff --git a/db/migrate/20171124132536_make_merge_request_statuses_not_null.rb b/db/migrate/20171124132536_make_merge_request_statuses_not_null.rb deleted file mode 100644 index 49b693c5950..00000000000 --- a/db/migrate/20171124132536_make_merge_request_statuses_not_null.rb +++ /dev/null @@ -1,14 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MakeMergeRequestStatusesNotNull < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - change_column_null :merge_requests, :state, false - change_column_null :merge_requests, :merge_status, false - end -end diff --git a/db/migrate/20171127151038_add_events_related_columns_to_merge_request_metrics.rb b/db/migrate/20171127151038_add_events_related_columns_to_merge_request_metrics.rb deleted file mode 100644 index 385de9dd73d..00000000000 --- a/db/migrate/20171127151038_add_events_related_columns_to_merge_request_metrics.rb +++ /dev/null @@ -1,37 +0,0 @@ -class AddEventsRelatedColumnsToMergeRequestMetrics < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - change_table :merge_request_metrics do |t| - t.references :merged_by, references: :users - t.references :latest_closed_by, references: :users - end - - add_column :merge_request_metrics, :latest_closed_at, :datetime_with_timezone - - add_concurrent_foreign_key :merge_request_metrics, :users, - column: :merged_by_id, - on_delete: :nullify - - add_concurrent_foreign_key :merge_request_metrics, :users, - column: :latest_closed_by_id, - on_delete: :nullify - end - - def down - if foreign_keys_for(:merge_request_metrics, :merged_by_id).any? - remove_foreign_key :merge_request_metrics, column: :merged_by_id - end - - if foreign_keys_for(:merge_request_metrics, :latest_closed_by_id).any? - remove_foreign_key :merge_request_metrics, column: :latest_closed_by_id - end - - remove_columns :merge_request_metrics, - :merged_by_id, :latest_closed_by_id, :latest_closed_at - end -end diff --git a/db/migrate/20171204204233_add_permanent_to_redirect_route.rb b/db/migrate/20171204204233_add_permanent_to_redirect_route.rb deleted file mode 100644 index bc0658035d6..00000000000 --- a/db/migrate/20171204204233_add_permanent_to_redirect_route.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPermanentToRedirectRoute < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def up - add_column(:redirect_routes, :permanent, :boolean) - end - - def down - remove_column(:redirect_routes, :permanent) - end -end diff --git a/db/migrate/20171206221519_add_permanent_index_to_redirect_route.rb b/db/migrate/20171206221519_add_permanent_index_to_redirect_route.rb deleted file mode 100644 index ba924c4eecc..00000000000 --- a/db/migrate/20171206221519_add_permanent_index_to_redirect_route.rb +++ /dev/null @@ -1,19 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddPermanentIndexToRedirectRoute < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:redirect_routes, :permanent) - end - - def down - remove_concurrent_index(:redirect_routes, :permanent) if index_exists?(:redirect_routes, :permanent) - end -end diff --git a/db/migrate/20171207185153_add_merge_request_state_index.rb b/db/migrate/20171207185153_add_merge_request_state_index.rb deleted file mode 100644 index 167470cf7fe..00000000000 --- a/db/migrate/20171207185153_add_merge_request_state_index.rb +++ /dev/null @@ -1,18 +0,0 @@ -class AddMergeRequestStateIndex < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index :merge_requests, [:source_project_id, :source_branch], - where: "state = 'opened'", - name: 'index_merge_requests_on_source_project_and_branch_state_opened' - end - - def down - remove_concurrent_index_by_name :merge_requests, - 'index_merge_requests_on_source_project_and_branch_state_opened' - end -end diff --git a/db/migrate/20171211131502_add_external_classification_authorization_settings_to_appliction_settings.rb b/db/migrate/20171211131502_add_external_classification_authorization_settings_to_appliction_settings.rb deleted file mode 100644 index a7dec8732fb..00000000000 --- a/db/migrate/20171211131502_add_external_classification_authorization_settings_to_appliction_settings.rb +++ /dev/null @@ -1,29 +0,0 @@ -class AddExternalClassificationAuthorizationSettingsToApplictionSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column_with_default :application_settings, - :external_authorization_service_enabled, - :boolean, - default: false - add_column :application_settings, - :external_authorization_service_url, - :string - add_column :application_settings, - :external_authorization_service_default_label, - :string - end - - def down - remove_column :application_settings, - :external_authorization_service_default_label - remove_column :application_settings, - :external_authorization_service_url - remove_column :application_settings, - :external_authorization_service_enabled - end -end diff --git a/db/migrate/20171211145425_add_can_push_to_deploy_keys_projects.rb b/db/migrate/20171211145425_add_can_push_to_deploy_keys_projects.rb deleted file mode 100644 index 63e86b23aad..00000000000 --- a/db/migrate/20171211145425_add_can_push_to_deploy_keys_projects.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddCanPushToDeployKeysProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - disable_ddl_transaction! - - def up - add_column_with_default :deploy_keys_projects, :can_push, :boolean, default: false, allow_null: false - end - - def down - remove_column :deploy_keys_projects, :can_push - end -end diff --git a/db/migrate/20171212203433_create_clusters_applications_prometheus.rb b/db/migrate/20171212203433_create_clusters_applications_prometheus.rb deleted file mode 100644 index 6eb9fec609e..00000000000 --- a/db/migrate/20171212203433_create_clusters_applications_prometheus.rb +++ /dev/null @@ -1,18 +0,0 @@ -class CreateClustersApplicationsPrometheus < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - create_table :clusters_applications_prometheus do |t| - t.references :cluster, null: false, unique: true, foreign_key: { on_delete: :cascade } - - t.integer :status, null: false - t.string :version, null: false - - t.text :status_reason - - t.timestamps_with_timezone null: false - end - end -end diff --git a/db/migrate/20171214144320_add_store_column_to_uploads.rb b/db/migrate/20171214144320_add_store_column_to_uploads.rb deleted file mode 100644 index 11b3951a3fa..00000000000 --- a/db/migrate/20171214144320_add_store_column_to_uploads.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddStoreColumnToUploads < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column(:uploads, :store, :integer) - end -end diff --git a/db/migrate/20171215113714_populate_can_push_from_deploy_keys_projects.rb b/db/migrate/20171215113714_populate_can_push_from_deploy_keys_projects.rb deleted file mode 100644 index e2d7879b140..00000000000 --- a/db/migrate/20171215113714_populate_can_push_from_deploy_keys_projects.rb +++ /dev/null @@ -1,64 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PopulateCanPushFromDeployKeysProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - DATABASE_NAME = Gitlab::Database.database_name - - disable_ddl_transaction! - - class DeploysKeyProject < ActiveRecord::Base - include EachBatch - - self.table_name = 'deploy_keys_projects' - end - - def up - DeploysKeyProject.each_batch(of: 10_000) do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects, #{DATABASE_NAME}.keys - SET deploy_keys_projects.can_push = #{DATABASE_NAME}.keys.can_push - WHERE deploy_keys_projects.deploy_key_id = #{DATABASE_NAME}.keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - else - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects - SET can_push = keys.can_push - FROM keys - WHERE deploy_key_id = keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - end - - def down - DeploysKeyProject.each_batch(of: 10_000) do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects, #{DATABASE_NAME}.keys - SET #{DATABASE_NAME}.keys.can_push = deploy_keys_projects.can_push - WHERE deploy_keys_projects.deploy_key_id = #{DATABASE_NAME}.keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - else - execute <<-EOF.strip_heredoc - UPDATE keys - SET can_push = deploy_keys_projects.can_push - FROM deploy_keys_projects - WHERE deploy_keys_projects.deploy_key_id = keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - end -end diff --git a/db/migrate/20171216112339_add_foreign_key_for_members.rb b/db/migrate/20171216112339_add_foreign_key_for_members.rb deleted file mode 100644 index 06c2c5068da..00000000000 --- a/db/migrate/20171216112339_add_foreign_key_for_members.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddForeignKeyForMembers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_foreign_key(:members, - :users, - column: :user_id) - end - - def down - remove_foreign_key(:members, column: :user_id) - end -end diff --git a/db/migrate/20171218140451_add_external_authorization_service_classification_label_to_projects.rb b/db/migrate/20171218140451_add_external_authorization_service_classification_label_to_projects.rb deleted file mode 100644 index 7b83580f025..00000000000 --- a/db/migrate/20171218140451_add_external_authorization_service_classification_label_to_projects.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddExternalAuthorizationServiceClassificationLabelToProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - add_column :projects, - :external_authorization_classification_label, - :string - end -end diff --git a/db/migrate/20171220191323_add_index_on_namespaces_lower_name.rb b/db/migrate/20171220191323_add_index_on_namespaces_lower_name.rb deleted file mode 100644 index 7543e435941..00000000000 --- a/db/migrate/20171220191323_add_index_on_namespaces_lower_name.rb +++ /dev/null @@ -1,32 +0,0 @@ -class AddIndexOnNamespacesLowerName < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - INDEX_NAME = 'index_on_namespaces_lower_name' - - disable_ddl_transaction! - - def up - return unless Gitlab::Database.postgresql? - - disable_statement_timeout do - if Gitlab::Database.version.to_f >= 9.5 - # Allow us to hot-patch the index manually ahead of the migration - execute "CREATE INDEX CONCURRENTLY IF NOT EXISTS #{INDEX_NAME} ON namespaces (lower(name));" - else - execute "CREATE INDEX CONCURRENTLY #{INDEX_NAME} ON namespaces (lower(name));" - end - end - end - - def down - return unless Gitlab::Database.postgresql? - - disable_statement_timeout do - if Gitlab::Database.version.to_f >= 9.2 - execute "DROP INDEX CONCURRENTLY IF EXISTS #{INDEX_NAME};" - else - execute "DROP INDEX IF EXISTS #{INDEX_NAME};" - end - end - end -end diff --git a/db/migrate/20171222115326_add_confidential_note_events_to_web_hooks.rb b/db/migrate/20171222115326_add_confidential_note_events_to_web_hooks.rb deleted file mode 100644 index 788a842a3ad..00000000000 --- a/db/migrate/20171222115326_add_confidential_note_events_to_web_hooks.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddConfidentialNoteEventsToWebHooks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_column :web_hooks, :confidential_note_events, :boolean - end - - def down - remove_column :web_hooks, :confidential_note_events - end -end diff --git a/db/migrate/20171222183504_add_jobs_cache_index_to_project.rb b/db/migrate/20171222183504_add_jobs_cache_index_to_project.rb deleted file mode 100644 index 78a195c351c..00000000000 --- a/db/migrate/20171222183504_add_jobs_cache_index_to_project.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddJobsCacheIndexToProject < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - add_column :projects, :jobs_cache_index, :integer - end -end diff --git a/db/migrate/20171229225929_change_user_project_limit_not_null_and_remove_default.rb b/db/migrate/20171229225929_change_user_project_limit_not_null_and_remove_default.rb deleted file mode 100644 index b9efdb8bb8f..00000000000 --- a/db/migrate/20171229225929_change_user_project_limit_not_null_and_remove_default.rb +++ /dev/null @@ -1,38 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ChangeUserProjectLimitNotNullAndRemoveDefault < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - # Set Users#projects_limit to NOT NULL and remove the default value - change_column_null :users, :projects_limit, false - change_column_default :users, :projects_limit, nil - end - - def down - change_column_null :users, :projects_limit, true - change_column_default :users, :projects_limit, 10 - end -end diff --git a/db/migrate/20171230123729_add_rebase_commit_sha_to_merge_requests_ce.rb b/db/migrate/20171230123729_add_rebase_commit_sha_to_merge_requests_ce.rb deleted file mode 100644 index 4e1107e1ff5..00000000000 --- a/db/migrate/20171230123729_add_rebase_commit_sha_to_merge_requests_ce.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddRebaseCommitShaToMergeRequestsCe < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - unless column_exists?(:merge_requests, :rebase_commit_sha) - add_column :merge_requests, :rebase_commit_sha, :string - end - end - - def down - if column_exists?(:merge_requests, :rebase_commit_sha) - remove_column :merge_requests, :rebase_commit_sha - end - end -end diff --git a/db/migrate/20171230123729_init_schema.rb b/db/migrate/20171230123729_init_schema.rb new file mode 100644 index 00000000000..ae7541f2475 --- /dev/null +++ b/db/migrate/20171230123729_init_schema.rb @@ -0,0 +1,1854 @@ +# frozen_string_literal: true + +# rubocop:disable Layout/SpaceInsideHashLiteralBraces +# rubocop:disable Layout/SpaceAroundOperators +# rubocop:disable Metrics/AbcSize +# rubocop:disable Migration/AddConcurrentForeignKey +# rubocop:disable Style/WordArray + +class InitSchema < ActiveRecord::Migration[4.2] + DOWNTIME = false + + def up + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + enable_extension "pg_trgm" + create_table "abuse_reports", id: :serial do |t| + t.integer "reporter_id" + t.integer "user_id" + t.text "message" + t.datetime "created_at" + t.datetime "updated_at" + t.text "message_html" + t.integer "cached_markdown_version" + end + create_table "appearances", id: :serial do |t| + t.string "title", null: false + t.text "description", null: false + t.string "header_logo" + t.string "logo" + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.text "description_html" + t.integer "cached_markdown_version" + t.string "favicon" + t.text "new_project_guidelines" + t.text "new_project_guidelines_html" + end + create_table "application_settings", id: :serial do |t| + t.integer "default_projects_limit" + t.boolean "signup_enabled" + t.boolean "gravatar_enabled" + t.text "sign_in_text" + t.datetime "created_at" + t.datetime "updated_at" + t.string "home_page_url" + t.integer "default_branch_protection", default: 2 + t.text "restricted_visibility_levels" + t.boolean "version_check_enabled", default: true + t.integer "max_attachment_size", default: 10, null: false + t.integer "default_project_visibility" + t.integer "default_snippet_visibility" + t.text "domain_whitelist" + t.boolean "user_oauth_applications", default: true + t.string "after_sign_out_path" + t.integer "session_expire_delay", default: 10080, null: false + t.text "import_sources" + t.text "help_page_text" + t.string "admin_notification_email" + t.boolean "shared_runners_enabled", default: true, null: false + t.integer "max_artifacts_size", default: 100, null: false + t.string "runners_registration_token" + t.integer "max_pages_size", default: 100, null: false + t.boolean "require_two_factor_authentication", default: false + t.integer "two_factor_grace_period", default: 48 + t.boolean "metrics_enabled", default: false + t.string "metrics_host", default: "localhost" + t.integer "metrics_pool_size", default: 16 + t.integer "metrics_timeout", default: 10 + t.integer "metrics_method_call_threshold", default: 10 + t.boolean "recaptcha_enabled", default: false + t.string "recaptcha_site_key" + t.string "recaptcha_private_key" + t.integer "metrics_port", default: 8089 + t.boolean "akismet_enabled", default: false + t.string "akismet_api_key" + t.integer "metrics_sample_interval", default: 15 + t.boolean "sentry_enabled", default: false + t.string "sentry_dsn" + t.boolean "email_author_in_body", default: false + t.integer "default_group_visibility" + t.boolean "repository_checks_enabled", default: false + t.text "shared_runners_text" + t.integer "metrics_packet_size", default: 1 + t.text "disabled_oauth_sign_in_sources" + t.string "health_check_access_token" + t.boolean "send_user_confirmation_email", default: false + t.integer "container_registry_token_expire_delay", default: 5 + t.text "after_sign_up_text" + t.boolean "user_default_external", default: false, null: false + t.string "repository_storages", default: "default" + t.string "enabled_git_access_protocol" + t.boolean "domain_blacklist_enabled", default: false + t.text "domain_blacklist" + t.boolean "usage_ping_enabled", default: true, null: false + t.boolean "koding_enabled" + t.string "koding_url" + t.text "sign_in_text_html" + t.text "help_page_text_html" + t.text "shared_runners_text_html" + t.text "after_sign_up_text_html" + t.integer "rsa_key_restriction", default: 0, null: false + t.integer "dsa_key_restriction", default: 0, null: false + t.integer "ecdsa_key_restriction", default: 0, null: false + t.integer "ed25519_key_restriction", default: 0, null: false + t.boolean "housekeeping_enabled", default: true, null: false + t.boolean "housekeeping_bitmaps_enabled", default: true, null: false + t.integer "housekeeping_incremental_repack_period", default: 10, null: false + t.integer "housekeeping_full_repack_period", default: 50, null: false + t.integer "housekeeping_gc_period", default: 200, null: false + t.boolean "sidekiq_throttling_enabled", default: false + t.string "sidekiq_throttling_queues" + t.decimal "sidekiq_throttling_factor" + t.boolean "html_emails_enabled", default: true + t.string "plantuml_url" + t.boolean "plantuml_enabled" + t.integer "terminal_max_session_time", default: 0, null: false + t.integer "unique_ips_limit_per_user" + t.integer "unique_ips_limit_time_window" + t.boolean "unique_ips_limit_enabled", default: false, null: false + t.string "default_artifacts_expire_in", default: "0", null: false + t.string "uuid" + t.decimal "polling_interval_multiplier", default: "1.0", null: false + t.integer "cached_markdown_version" + t.boolean "clientside_sentry_enabled", default: false, null: false + t.string "clientside_sentry_dsn" + t.boolean "prometheus_metrics_enabled", default: false, null: false + t.boolean "authorized_keys_enabled", default: true, null: false + t.boolean "help_page_hide_commercial_content", default: false + t.string "help_page_support_url" + t.integer "performance_bar_allowed_group_id" + t.boolean "hashed_storage_enabled", default: false, null: false + t.boolean "project_export_enabled", default: true, null: false + t.boolean "auto_devops_enabled", default: false, null: false + t.boolean "throttle_unauthenticated_enabled", default: false, null: false + t.integer "throttle_unauthenticated_requests_per_period", default: 3600, null: false + t.integer "throttle_unauthenticated_period_in_seconds", default: 3600, null: false + t.boolean "throttle_authenticated_api_enabled", default: false, null: false + t.integer "throttle_authenticated_api_requests_per_period", default: 7200, null: false + t.integer "throttle_authenticated_api_period_in_seconds", default: 3600, null: false + t.boolean "throttle_authenticated_web_enabled", default: false, null: false + t.integer "throttle_authenticated_web_requests_per_period", default: 7200, null: false + t.integer "throttle_authenticated_web_period_in_seconds", default: 3600, null: false + t.integer "circuitbreaker_failure_count_threshold", default: 3 + t.integer "circuitbreaker_failure_reset_time", default: 1800 + t.integer "circuitbreaker_storage_timeout", default: 15 + t.integer "circuitbreaker_access_retries", default: 3 + t.integer "gitaly_timeout_default", default: 55, null: false + t.integer "gitaly_timeout_medium", default: 30, null: false + t.integer "gitaly_timeout_fast", default: 10, null: false + t.boolean "password_authentication_enabled_for_web" + t.boolean "password_authentication_enabled_for_git", default: true, null: false + t.integer "circuitbreaker_check_interval", default: 1, null: false + t.boolean "external_authorization_service_enabled", default: false, null: false + t.string "external_authorization_service_url" + t.string "external_authorization_service_default_label" + end + create_table "audit_events", id: :serial do |t| + t.integer "author_id", null: false + t.string "type", null: false + t.integer "entity_id", null: false + t.string "entity_type", null: false + t.text "details" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["entity_id", "entity_type"], name: "index_audit_events_on_entity_id_and_entity_type", using: :btree + end + create_table "award_emoji", id: :serial do |t| + t.string "name" + t.integer "user_id" + t.string "awardable_type" + t.integer "awardable_id" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["awardable_type", "awardable_id"], name: "index_award_emoji_on_awardable_type_and_awardable_id", using: :btree + t.index ["user_id", "name"], name: "index_award_emoji_on_user_id_and_name", using: :btree + end + create_table "boards", id: :serial do |t| + t.integer "project_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["project_id"], name: "index_boards_on_project_id", using: :btree + end + create_table "broadcast_messages", id: :serial do |t| + t.text "message", null: false + t.datetime "starts_at", null: false + t.datetime "ends_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "color" + t.string "font" + t.text "message_html", null: false + t.integer "cached_markdown_version" + t.index ["starts_at", "ends_at", "id"], name: "index_broadcast_messages_on_starts_at_and_ends_at_and_id", using: :btree + end + create_table "chat_names", id: :serial do |t| + t.integer "user_id", null: false + t.integer "service_id", null: false + t.string "team_id", null: false + t.string "team_domain" + t.string "chat_id", null: false + t.string "chat_name" + t.datetime "last_used_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["service_id", "team_id", "chat_id"], name: "index_chat_names_on_service_id_and_team_id_and_chat_id", unique: true, using: :btree + t.index ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree + end + create_table "chat_teams", id: :serial do |t| + t.integer "namespace_id", null: false + t.string "team_id" + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["namespace_id"], name: "index_chat_teams_on_namespace_id", unique: true, using: :btree + end + create_table "ci_build_trace_section_names", id: :serial do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.index ["project_id", "name"], name: "index_ci_build_trace_section_names_on_project_id_and_name", unique: true, using: :btree + end + create_table "ci_build_trace_sections", id: :serial do |t| + t.integer "project_id", null: false + t.datetime_with_timezone "date_start", null: false + t.datetime_with_timezone "date_end", null: false + t.bigint "byte_start", null: false + t.bigint "byte_end", null: false + t.integer "build_id", null: false + t.integer "section_name_id", null: false + t.index ["build_id", "section_name_id"], name: "index_ci_build_trace_sections_on_build_id_and_section_name_id", unique: true, using: :btree + t.index ["project_id"], name: "index_ci_build_trace_sections_on_project_id", using: :btree + end + create_table "ci_builds", id: :serial do |t| + t.string "status" + t.datetime "finished_at" + t.text "trace" + t.datetime "created_at" + t.datetime "updated_at" + t.datetime "started_at" + t.integer "runner_id" + t.float "coverage" + t.integer "commit_id" + t.text "commands" + t.string "name" + t.text "options" + t.boolean "allow_failure", default: false, null: false + t.string "stage" + t.integer "trigger_request_id" + t.integer "stage_idx" + t.boolean "tag" + t.string "ref" + t.integer "user_id" + t.string "type" + t.string "target_url" + t.string "description" + t.text "artifacts_file" + t.integer "project_id" + t.text "artifacts_metadata" + t.integer "erased_by_id" + t.datetime "erased_at" + t.datetime "artifacts_expire_at" + t.string "environment" + t.bigint "artifacts_size" + t.string "when" + t.text "yaml_variables" + t.datetime "queued_at" + t.string "token" + t.integer "lock_version" + t.string "coverage_regex" + t.integer "auto_canceled_by_id" + t.boolean "retried" + t.integer "stage_id" + t.integer "artifacts_file_store" + t.integer "artifacts_metadata_store" + t.boolean "protected" + t.integer "failure_reason" + t.index ["auto_canceled_by_id"], name: "index_ci_builds_on_auto_canceled_by_id", using: :btree + t.index ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at", using: :btree + t.index ["commit_id", "status", "type"], name: "index_ci_builds_on_commit_id_and_status_and_type", using: :btree + t.index ["commit_id", "type", "name", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_name_and_ref", using: :btree + t.index ["commit_id", "type", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_ref", using: :btree + t.index ["project_id", "id"], name: "index_ci_builds_on_project_id_and_id", using: :btree + t.index ["protected"], name: "index_ci_builds_on_protected", using: :btree + t.index ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree + t.index ["stage_id"], name: "index_ci_builds_on_stage_id", using: :btree + t.index ["status", "type", "runner_id"], name: "index_ci_builds_on_status_and_type_and_runner_id", using: :btree + t.index ["status"], name: "index_ci_builds_on_status", using: :btree + t.index ["token"], name: "index_ci_builds_on_token", unique: true, using: :btree + t.index ["updated_at"], name: "index_ci_builds_on_updated_at", using: :btree + t.index ["user_id"], name: "index_ci_builds_on_user_id", using: :btree + end + create_table "ci_group_variables", id: :serial do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + t.integer "group_id", null: false + t.boolean "protected", default: false, null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.index ["group_id", "key"], name: "index_ci_group_variables_on_group_id_and_key", unique: true, using: :btree + end + create_table "ci_job_artifacts", id: :serial do |t| + t.integer "project_id", null: false + t.integer "job_id", null: false + t.integer "file_type", null: false + t.bigint "size" + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.datetime_with_timezone "expire_at" + t.string "file" + t.integer "file_store" + t.index ["job_id", "file_type"], name: "index_ci_job_artifacts_on_job_id_and_file_type", unique: true, using: :btree + t.index ["project_id"], name: "index_ci_job_artifacts_on_project_id", using: :btree + end + create_table "ci_pipeline_schedule_variables", id: :serial do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + t.integer "pipeline_schedule_id", null: false + t.datetime_with_timezone "created_at" + t.datetime_with_timezone "updated_at" + t.index ["pipeline_schedule_id", "key"], name: "index_ci_pipeline_schedule_variables_on_schedule_id_and_key", unique: true, using: :btree + end + create_table "ci_pipeline_schedules", id: :serial do |t| + t.string "description" + t.string "ref" + t.string "cron" + t.string "cron_timezone" + t.datetime "next_run_at" + t.integer "project_id" + t.integer "owner_id" + t.boolean "active", default: true + t.datetime "created_at" + t.datetime "updated_at" + t.index ["next_run_at", "active"], name: "index_ci_pipeline_schedules_on_next_run_at_and_active", using: :btree + t.index ["project_id"], name: "index_ci_pipeline_schedules_on_project_id", using: :btree + end + create_table "ci_pipeline_variables", id: :serial do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + t.integer "pipeline_id", null: false + t.index ["pipeline_id", "key"], name: "index_ci_pipeline_variables_on_pipeline_id_and_key", unique: true, using: :btree + end + create_table "ci_pipelines", id: :serial do |t| + t.string "ref" + t.string "sha" + t.string "before_sha" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "tag", default: false + t.text "yaml_errors" + t.datetime "committed_at" + t.integer "project_id" + t.string "status" + t.datetime "started_at" + t.datetime "finished_at" + t.integer "duration" + t.integer "user_id" + t.integer "lock_version" + t.integer "auto_canceled_by_id" + t.integer "pipeline_schedule_id" + t.integer "source" + t.boolean "protected" + t.integer "config_source" + t.integer "failure_reason" + t.index ["auto_canceled_by_id"], name: "index_ci_pipelines_on_auto_canceled_by_id", using: :btree + t.index ["pipeline_schedule_id"], name: "index_ci_pipelines_on_pipeline_schedule_id", using: :btree + t.index ["project_id", "ref", "status", "id"], name: "index_ci_pipelines_on_project_id_and_ref_and_status_and_id", using: :btree + t.index ["project_id", "sha"], name: "index_ci_pipelines_on_project_id_and_sha", using: :btree + t.index ["project_id"], name: "index_ci_pipelines_on_project_id", using: :btree + t.index ["status"], name: "index_ci_pipelines_on_status", using: :btree + t.index ["user_id"], name: "index_ci_pipelines_on_user_id", using: :btree + end + create_table "ci_runner_namespaces", id: :serial do |t| + t.integer "runner_id" + t.integer "namespace_id" + t.index ["namespace_id"], name: "index_ci_runner_namespaces_on_namespace_id", using: :btree + t.index ["runner_id", "namespace_id"], name: "index_ci_runner_namespaces_on_runner_id_and_namespace_id", unique: true, using: :btree + end + create_table "ci_runner_projects", id: :serial do |t| + t.integer "runner_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "project_id" + t.index ["project_id"], name: "index_ci_runner_projects_on_project_id", using: :btree + t.index ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree + end + create_table "ci_runners", id: :serial do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" + t.string "description" + t.datetime "contacted_at" + t.boolean "active", default: true, null: false + t.boolean "is_shared", default: false + t.string "name" + t.string "version" + t.string "revision" + t.string "platform" + t.string "architecture" + t.boolean "run_untagged", default: true, null: false + t.boolean "locked", default: false, null: false + t.integer "access_level", default: 0, null: false + t.index ["contacted_at"], name: "index_ci_runners_on_contacted_at", using: :btree + t.index ["is_shared"], name: "index_ci_runners_on_is_shared", using: :btree + t.index ["locked"], name: "index_ci_runners_on_locked", using: :btree + t.index ["token"], name: "index_ci_runners_on_token", using: :btree + end + create_table "ci_stages", id: :serial do |t| + t.integer "project_id" + t.integer "pipeline_id" + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.integer "status" + t.integer "lock_version" + t.index ["pipeline_id", "name"], name: "index_ci_stages_on_pipeline_id_and_name", using: :btree + t.index ["pipeline_id"], name: "index_ci_stages_on_pipeline_id", using: :btree + t.index ["project_id"], name: "index_ci_stages_on_project_id", using: :btree + end + create_table "ci_trigger_requests", id: :serial do |t| + t.integer "trigger_id", null: false + t.text "variables" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "commit_id" + t.index ["commit_id"], name: "index_ci_trigger_requests_on_commit_id", using: :btree + end + create_table "ci_triggers", id: :serial do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "project_id" + t.integer "owner_id" + t.string "description" + t.string "ref" + t.index ["project_id"], name: "index_ci_triggers_on_project_id", using: :btree + end + create_table "ci_variables", id: :serial do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + t.integer "project_id", null: false + t.boolean "protected", default: false, null: false + t.string "environment_scope", default: "*", null: false + t.index ["project_id", "key", "environment_scope"], name: "index_ci_variables_on_project_id_and_key_and_environment_scope", unique: true, using: :btree + end + create_table "cluster_platforms_kubernetes", id: :serial do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.text "api_url" + t.text "ca_cert" + t.string "namespace" + t.string "username" + t.text "encrypted_password" + t.string "encrypted_password_iv" + t.text "encrypted_token" + t.string "encrypted_token_iv" + t.index ["cluster_id"], name: "index_cluster_platforms_kubernetes_on_cluster_id", unique: true, using: :btree + end + create_table "cluster_projects", id: :serial do |t| + t.integer "project_id", null: false + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.index ["cluster_id"], name: "index_cluster_projects_on_cluster_id", using: :btree + t.index ["project_id"], name: "index_cluster_projects_on_project_id", using: :btree + end + create_table "cluster_providers_gcp", id: :serial do |t| + t.integer "cluster_id", null: false + t.integer "status" + t.integer "num_nodes", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.text "status_reason" + t.string "gcp_project_id", null: false + t.string "zone", null: false + t.string "machine_type" + t.string "operation_id" + t.string "endpoint" + t.text "encrypted_access_token" + t.string "encrypted_access_token_iv" + t.index ["cluster_id"], name: "index_cluster_providers_gcp_on_cluster_id", unique: true, using: :btree + end + create_table "clusters", id: :serial do |t| + t.integer "user_id" + t.integer "provider_type" + t.integer "platform_type" + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.boolean "enabled", default: true + t.string "name", null: false + t.string "environment_scope", default: "*", null: false + t.index ["enabled"], name: "index_clusters_on_enabled", using: :btree + t.index ["user_id"], name: "index_clusters_on_user_id", using: :btree + end + create_table "clusters_applications_helm", id: :serial do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "status", null: false + t.string "version", null: false + t.text "status_reason" + end + create_table "clusters_applications_ingress", id: :serial do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "status", null: false + t.integer "ingress_type", null: false + t.string "version", null: false + t.string "cluster_ip" + t.text "status_reason" + end + create_table "clusters_applications_prometheus", id: :serial do |t| + t.integer "cluster_id", null: false + t.integer "status", null: false + t.string "version", null: false + t.text "status_reason" + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + end + create_table "container_repositories", id: :serial do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["project_id", "name"], name: "index_container_repositories_on_project_id_and_name", unique: true, using: :btree + t.index ["project_id"], name: "index_container_repositories_on_project_id", using: :btree + end + create_table "conversational_development_index_metrics", id: :serial do |t| + t.float "leader_issues", null: false + t.float "instance_issues", null: false + t.float "leader_notes", null: false + t.float "instance_notes", null: false + t.float "leader_milestones", null: false + t.float "instance_milestones", null: false + t.float "leader_boards", null: false + t.float "instance_boards", null: false + t.float "leader_merge_requests", null: false + t.float "instance_merge_requests", null: false + t.float "leader_ci_pipelines", null: false + t.float "instance_ci_pipelines", null: false + t.float "leader_environments", null: false + t.float "instance_environments", null: false + t.float "leader_deployments", null: false + t.float "instance_deployments", null: false + t.float "leader_projects_prometheus_active", null: false + t.float "instance_projects_prometheus_active", null: false + t.float "leader_service_desk_issues", null: false + t.float "instance_service_desk_issues", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.float "percentage_boards", default: 0.0, null: false + t.float "percentage_ci_pipelines", default: 0.0, null: false + t.float "percentage_deployments", default: 0.0, null: false + t.float "percentage_environments", default: 0.0, null: false + t.float "percentage_issues", default: 0.0, null: false + t.float "percentage_merge_requests", default: 0.0, null: false + t.float "percentage_milestones", default: 0.0, null: false + t.float "percentage_notes", default: 0.0, null: false + t.float "percentage_projects_prometheus_active", default: 0.0, null: false + t.float "percentage_service_desk_issues", default: 0.0, null: false + end + create_table "deploy_keys_projects", id: :serial do |t| + t.integer "deploy_key_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "can_push", default: false, null: false + t.index ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree + end + create_table "deployments", id: :serial do |t| + t.integer "iid", null: false + t.integer "project_id", null: false + t.integer "environment_id", null: false + t.string "ref", null: false + t.boolean "tag", null: false + t.string "sha", null: false + t.integer "user_id" + t.integer "deployable_id" + t.string "deployable_type" + t.datetime "created_at" + t.datetime "updated_at" + t.string "on_stop" + t.index ["created_at"], name: "index_deployments_on_created_at", using: :btree + t.index ["environment_id", "id"], name: "index_deployments_on_environment_id_and_id", using: :btree + t.index ["environment_id", "iid", "project_id"], name: "index_deployments_on_environment_id_and_iid_and_project_id", using: :btree + t.index ["project_id", "iid"], name: "index_deployments_on_project_id_and_iid", unique: true, using: :btree + end + create_table "emails", id: :serial do |t| + t.integer "user_id", null: false + t.string "email", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "confirmation_token" + t.datetime_with_timezone "confirmed_at" + t.datetime_with_timezone "confirmation_sent_at" + t.index ["confirmation_token"], name: "index_emails_on_confirmation_token", unique: true, using: :btree + t.index ["email"], name: "index_emails_on_email", unique: true, using: :btree + t.index ["user_id"], name: "index_emails_on_user_id", using: :btree + end + create_table "environments", id: :serial do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "external_url" + t.string "environment_type" + t.string "state", default: "available", null: false + t.string "slug", null: false + t.index ["project_id", "name"], name: "index_environments_on_project_id_and_name", unique: true, using: :btree + t.index ["project_id", "slug"], name: "index_environments_on_project_id_and_slug", unique: true, using: :btree + end + create_table "events", id: :serial do |t| + t.integer "project_id" + t.integer "author_id", null: false + t.integer "target_id" + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "action", limit: 2, null: false + t.string "target_type" + t.index ["action"], name: "index_events_on_action", using: :btree + t.index ["author_id"], name: "index_events_on_author_id", using: :btree + t.index ["project_id", "id"], name: "index_events_on_project_id_and_id", using: :btree + t.index ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id", using: :btree + end + create_table "feature_gates", id: :serial do |t| + t.string "feature_key", null: false + t.string "key", null: false + t.string "value" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["feature_key", "key", "value"], name: "index_feature_gates_on_feature_key_and_key_and_value", unique: true, using: :btree + end + create_table "features", id: :serial do |t| + t.string "key", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["key"], name: "index_features_on_key", unique: true, using: :btree + end + create_table "fork_network_members", id: :serial do |t| + t.integer "fork_network_id", null: false + t.integer "project_id", null: false + t.integer "forked_from_project_id" + t.index ["fork_network_id"], name: "index_fork_network_members_on_fork_network_id", using: :btree + t.index ["project_id"], name: "index_fork_network_members_on_project_id", unique: true, using: :btree + end + create_table "fork_networks", id: :serial do |t| + t.integer "root_project_id" + t.string "deleted_root_project_name" + t.index ["root_project_id"], name: "index_fork_networks_on_root_project_id", unique: true, using: :btree + end + create_table "forked_project_links", id: :serial do |t| + t.integer "forked_to_project_id", null: false + t.integer "forked_from_project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.index ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree + end + create_table "gcp_clusters", id: :serial do |t| + t.integer "project_id", null: false + t.integer "user_id" + t.integer "service_id" + t.integer "status" + t.integer "gcp_cluster_size", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.boolean "enabled", default: true + t.text "status_reason" + t.string "project_namespace" + t.string "endpoint" + t.text "ca_cert" + t.text "encrypted_kubernetes_token" + t.string "encrypted_kubernetes_token_iv" + t.string "username" + t.text "encrypted_password" + t.string "encrypted_password_iv" + t.string "gcp_project_id", null: false + t.string "gcp_cluster_zone", null: false + t.string "gcp_cluster_name", null: false + t.string "gcp_machine_type" + t.string "gcp_operation_id" + t.text "encrypted_gcp_token" + t.string "encrypted_gcp_token_iv" + t.index ["project_id"], name: "index_gcp_clusters_on_project_id", unique: true, using: :btree + end + create_table "gpg_key_subkeys", id: :serial do |t| + t.integer "gpg_key_id", null: false + t.binary "keyid" + t.binary "fingerprint" + t.index ["fingerprint"], name: "index_gpg_key_subkeys_on_fingerprint", unique: true, using: :btree + t.index ["gpg_key_id"], name: "index_gpg_key_subkeys_on_gpg_key_id", using: :btree + t.index ["keyid"], name: "index_gpg_key_subkeys_on_keyid", unique: true, using: :btree + end + create_table "gpg_keys", id: :serial do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id" + t.binary "primary_keyid" + t.binary "fingerprint" + t.text "key" + t.index ["fingerprint"], name: "index_gpg_keys_on_fingerprint", unique: true, using: :btree + t.index ["primary_keyid"], name: "index_gpg_keys_on_primary_keyid", unique: true, using: :btree + t.index ["user_id"], name: "index_gpg_keys_on_user_id", using: :btree + end + create_table "gpg_signatures", id: :serial do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "project_id" + t.integer "gpg_key_id" + t.binary "commit_sha" + t.binary "gpg_key_primary_keyid" + t.text "gpg_key_user_name" + t.text "gpg_key_user_email" + t.integer "verification_status", limit: 2, default: 0, null: false + t.integer "gpg_key_subkey_id" + t.index ["commit_sha"], name: "index_gpg_signatures_on_commit_sha", unique: true, using: :btree + t.index ["gpg_key_id"], name: "index_gpg_signatures_on_gpg_key_id", using: :btree + t.index ["gpg_key_primary_keyid"], name: "index_gpg_signatures_on_gpg_key_primary_keyid", using: :btree + t.index ["gpg_key_subkey_id"], name: "index_gpg_signatures_on_gpg_key_subkey_id", using: :btree + t.index ["project_id"], name: "index_gpg_signatures_on_project_id", using: :btree + end + create_table "group_custom_attributes", id: :serial do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "group_id", null: false + t.string "key", null: false + t.string "value", null: false + t.index ["group_id", "key"], name: "index_group_custom_attributes_on_group_id_and_key", unique: true, using: :btree + t.index ["key", "value"], name: "index_group_custom_attributes_on_key_and_value", using: :btree + end + create_table "identities", id: :serial do |t| + t.string "extern_uid" + t.string "provider" + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["user_id"], name: "index_identities_on_user_id", using: :btree + end + create_table "issue_assignees", id: false do |t| + t.integer "user_id", null: false + t.integer "issue_id", null: false + t.index ["issue_id", "user_id"], name: "index_issue_assignees_on_issue_id_and_user_id", unique: true, using: :btree + t.index ["user_id"], name: "index_issue_assignees_on_user_id", using: :btree + end + create_table "issue_metrics", id: :serial do |t| + t.integer "issue_id", null: false + t.datetime "first_mentioned_in_commit_at" + t.datetime "first_associated_with_milestone_at" + t.datetime "first_added_to_board_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["issue_id"], name: "index_issue_metrics", using: :btree + end + create_table "issues", id: :serial do |t| + t.string "title" + t.integer "author_id" + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.text "description" + t.integer "milestone_id" + t.string "state" + t.integer "iid" + t.integer "updated_by_id" + t.boolean "confidential", default: false, null: false + t.date "due_date" + t.integer "moved_to_id" + t.integer "lock_version" + t.text "title_html" + t.text "description_html" + t.integer "time_estimate" + t.integer "relative_position" + t.integer "cached_markdown_version" + t.datetime "last_edited_at" + t.integer "last_edited_by_id" + t.boolean "discussion_locked" + t.datetime_with_timezone "closed_at" + t.index ["author_id"], name: "index_issues_on_author_id", using: :btree + t.index ["confidential"], name: "index_issues_on_confidential", using: :btree + t.index ["description"], name: "index_issues_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} + t.index ["milestone_id"], name: "index_issues_on_milestone_id", using: :btree + t.index ["moved_to_id"], name: "index_issues_on_moved_to_id", where: "(moved_to_id IS NOT NULL)", using: :btree + t.index ["project_id", "created_at", "id", "state"], name: "index_issues_on_project_id_and_created_at_and_id_and_state", using: :btree + t.index ["project_id", "due_date", "id", "state"], name: "idx_issues_on_project_id_and_due_date_and_id_and_state_partial", where: "(due_date IS NOT NULL)", using: :btree + t.index ["project_id", "iid"], name: "index_issues_on_project_id_and_iid", unique: true, using: :btree + t.index ["project_id", "updated_at", "id", "state"], name: "index_issues_on_project_id_and_updated_at_and_id_and_state", using: :btree + t.index ["relative_position"], name: "index_issues_on_relative_position", using: :btree + t.index ["state"], name: "index_issues_on_state", using: :btree + t.index ["title"], name: "index_issues_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} + t.index ["updated_by_id"], name: "index_issues_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree + end + create_table "keys", id: :serial do |t| + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" + t.text "key" + t.string "title" + t.string "type" + t.string "fingerprint" + t.boolean "public", default: false, null: false + t.datetime "last_used_at" + t.index ["fingerprint"], name: "index_keys_on_fingerprint", unique: true, using: :btree + t.index ["user_id"], name: "index_keys_on_user_id", using: :btree + end + create_table "label_links", id: :serial do |t| + t.integer "label_id" + t.integer "target_id" + t.string "target_type" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["label_id"], name: "index_label_links_on_label_id", using: :btree + t.index ["target_id", "target_type"], name: "index_label_links_on_target_id_and_target_type", using: :btree + end + create_table "label_priorities", id: :serial do |t| + t.integer "project_id", null: false + t.integer "label_id", null: false + t.integer "priority", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["priority"], name: "index_label_priorities_on_priority", using: :btree + t.index ["project_id", "label_id"], name: "index_label_priorities_on_project_id_and_label_id", unique: true, using: :btree + end + create_table "labels", id: :serial do |t| + t.string "title" + t.string "color" + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "template", default: false + t.string "description" + t.text "description_html" + t.string "type" + t.integer "group_id" + t.integer "cached_markdown_version" + t.index ["group_id", "project_id", "title"], name: "index_labels_on_group_id_and_project_id_and_title", unique: true, using: :btree + t.index ["project_id"], name: "index_labels_on_project_id", using: :btree + t.index ["template"], name: "index_labels_on_template", where: "template", using: :btree + t.index ["title"], name: "index_labels_on_title", using: :btree + t.index ["type", "project_id"], name: "index_labels_on_type_and_project_id", using: :btree + end + create_table "lfs_objects", id: :serial do |t| + t.string "oid", null: false + t.bigint "size", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "file" + t.integer "file_store" + t.index ["oid"], name: "index_lfs_objects_on_oid", unique: true, using: :btree + end + create_table "lfs_objects_projects", id: :serial do |t| + t.integer "lfs_object_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.index ["project_id"], name: "index_lfs_objects_projects_on_project_id", using: :btree + end + create_table "lists", id: :serial do |t| + t.integer "board_id", null: false + t.integer "label_id" + t.integer "list_type", default: 1, null: false + t.integer "position" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["board_id", "label_id"], name: "index_lists_on_board_id_and_label_id", unique: true, using: :btree + t.index ["label_id"], name: "index_lists_on_label_id", using: :btree + end + create_table "members", id: :serial do |t| + t.integer "access_level", null: false + t.integer "source_id", null: false + t.string "source_type", null: false + t.integer "user_id" + t.integer "notification_level", null: false + t.string "type" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "created_by_id" + t.string "invite_email" + t.string "invite_token" + t.datetime "invite_accepted_at" + t.datetime "requested_at" + t.date "expires_at" + t.index ["access_level"], name: "index_members_on_access_level", using: :btree + t.index ["invite_token"], name: "index_members_on_invite_token", unique: true, using: :btree + t.index ["requested_at"], name: "index_members_on_requested_at", using: :btree + t.index ["source_id", "source_type"], name: "index_members_on_source_id_and_source_type", using: :btree + t.index ["user_id"], name: "index_members_on_user_id", using: :btree + end + create_table "merge_request_diff_commits", id: false do |t| + t.datetime_with_timezone "authored_date" + t.datetime_with_timezone "committed_date" + t.integer "merge_request_diff_id", null: false + t.integer "relative_order", null: false + t.binary "sha", null: false + t.text "author_name" + t.text "author_email" + t.text "committer_name" + t.text "committer_email" + t.text "message" + t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_commits_on_mr_diff_id_and_order", unique: true, using: :btree + t.index ["sha"], name: "index_merge_request_diff_commits_on_sha", using: :btree + end + create_table "merge_request_diff_files", id: false do |t| + t.integer "merge_request_diff_id", null: false + t.integer "relative_order", null: false + t.boolean "new_file", null: false + t.boolean "renamed_file", null: false + t.boolean "deleted_file", null: false + t.boolean "too_large", null: false + t.string "a_mode", null: false + t.string "b_mode", null: false + t.text "new_path", null: false + t.text "old_path", null: false + t.text "diff", null: false + t.boolean "binary" + t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_files_on_mr_diff_id_and_order", unique: true, using: :btree + end + create_table "merge_request_diffs", id: :serial do |t| + t.string "state" + t.integer "merge_request_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "base_commit_sha" + t.string "real_size" + t.string "head_commit_sha" + t.string "start_commit_sha" + t.index ["merge_request_id", "id"], name: "index_merge_request_diffs_on_merge_request_id_and_id", using: :btree + end + create_table "merge_request_metrics", id: :serial do |t| + t.integer "merge_request_id", null: false + t.datetime "latest_build_started_at" + t.datetime "latest_build_finished_at" + t.datetime "first_deployed_to_production_at" + t.datetime "merged_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "pipeline_id" + t.integer "merged_by_id" + t.integer "latest_closed_by_id" + t.datetime_with_timezone "latest_closed_at" + t.index ["first_deployed_to_production_at"], name: "index_merge_request_metrics_on_first_deployed_to_production_at", using: :btree + t.index ["merge_request_id"], name: "index_merge_request_metrics", using: :btree + t.index ["pipeline_id"], name: "index_merge_request_metrics_on_pipeline_id", using: :btree + end + create_table "merge_requests", id: :serial do |t| + t.string "target_branch", null: false + t.string "source_branch", null: false + t.integer "source_project_id" + t.integer "author_id" + t.integer "assignee_id" + t.string "title" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "milestone_id" + t.string "state", default: "opened", null: false + t.string "merge_status", default: "unchecked", null: false + t.integer "target_project_id", null: false + t.integer "iid" + t.text "description" + t.integer "updated_by_id" + t.text "merge_error" + t.text "merge_params" + t.boolean "merge_when_pipeline_succeeds", default: false, null: false + t.integer "merge_user_id" + t.string "merge_commit_sha" + t.string "rebase_commit_sha" + t.string "in_progress_merge_commit_sha" + t.integer "lock_version" + t.text "title_html" + t.text "description_html" + t.integer "time_estimate" + t.integer "cached_markdown_version" + t.datetime "last_edited_at" + t.integer "last_edited_by_id" + t.integer "head_pipeline_id" + t.string "merge_jid" + t.boolean "discussion_locked" + t.integer "latest_merge_request_diff_id" + t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree + t.index ["author_id"], name: "index_merge_requests_on_author_id", using: :btree + t.index ["created_at"], name: "index_merge_requests_on_created_at", using: :btree + t.index ["description"], name: "index_merge_requests_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} + t.index ["head_pipeline_id"], name: "index_merge_requests_on_head_pipeline_id", using: :btree + t.index ["latest_merge_request_diff_id"], name: "index_merge_requests_on_latest_merge_request_diff_id", using: :btree + t.index ["merge_user_id"], name: "index_merge_requests_on_merge_user_id", where: "(merge_user_id IS NOT NULL)", using: :btree + t.index ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree + t.index ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree + t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_and_branch_state_opened", where: "((state)::text = 'opened'::text)", using: :btree + t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_id_and_source_branch", using: :btree + t.index ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree + t.index ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid", unique: true, using: :btree + t.index ["target_project_id", "merge_commit_sha", "id"], name: "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id", using: :btree + t.index ["title"], name: "index_merge_requests_on_title", using: :btree + t.index ["title"], name: "index_merge_requests_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} + t.index ["updated_by_id"], name: "index_merge_requests_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree + end + create_table "merge_requests_closing_issues", id: :serial do |t| + t.integer "merge_request_id", null: false + t.integer "issue_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["issue_id"], name: "index_merge_requests_closing_issues_on_issue_id", using: :btree + t.index ["merge_request_id"], name: "index_merge_requests_closing_issues_on_merge_request_id", using: :btree + end + create_table "milestones", id: :serial do |t| + t.string "title", null: false + t.integer "project_id" + t.text "description" + t.date "due_date" + t.datetime "created_at" + t.datetime "updated_at" + t.string "state" + t.integer "iid" + t.text "title_html" + t.text "description_html" + t.date "start_date" + t.integer "cached_markdown_version" + t.integer "group_id" + t.index ["description"], name: "index_milestones_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} + t.index ["due_date"], name: "index_milestones_on_due_date", using: :btree + t.index ["group_id"], name: "index_milestones_on_group_id", using: :btree + t.index ["project_id", "iid"], name: "index_milestones_on_project_id_and_iid", unique: true, using: :btree + t.index ["title"], name: "index_milestones_on_title", using: :btree + t.index ["title"], name: "index_milestones_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} + end + create_table "namespaces", id: :serial do |t| + t.string "name", null: false + t.string "path", null: false + t.integer "owner_id" + t.datetime "created_at" + t.datetime "updated_at" + t.string "type" + t.string "description", default: "", null: false + t.string "avatar" + t.boolean "share_with_group_lock", default: false + t.integer "visibility_level", default: 20, null: false + t.boolean "request_access_enabled", default: false, null: false + t.text "description_html" + t.boolean "lfs_enabled" + t.integer "parent_id" + t.boolean "require_two_factor_authentication", default: false, null: false + t.integer "two_factor_grace_period", default: 48, null: false + t.integer "cached_markdown_version" + t.string "runners_token" + t.index ["created_at"], name: "index_namespaces_on_created_at", using: :btree + t.index ["name", "parent_id"], name: "index_namespaces_on_name_and_parent_id", unique: true, using: :btree + t.index ["name"], name: "index_namespaces_on_name_trigram", using: :gin, opclasses: {"name"=>"gin_trgm_ops"} + t.index ["owner_id"], name: "index_namespaces_on_owner_id", using: :btree + t.index ["parent_id", "id"], name: "index_namespaces_on_parent_id_and_id", unique: true, using: :btree + t.index ["path"], name: "index_namespaces_on_path", using: :btree + t.index ["path"], name: "index_namespaces_on_path_trigram", using: :gin, opclasses: {"path"=>"gin_trgm_ops"} + t.index ["require_two_factor_authentication"], name: "index_namespaces_on_require_two_factor_authentication", using: :btree + t.index ["type"], name: "index_namespaces_on_type", using: :btree + end + create_table "notes", id: :serial do |t| + t.text "note" + t.string "noteable_type" + t.integer "author_id" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "project_id" + t.string "attachment" + t.string "line_code" + t.string "commit_id" + t.integer "noteable_id" + t.boolean "system", default: false, null: false + t.text "st_diff" + t.integer "updated_by_id" + t.string "type" + t.text "position" + t.text "original_position" + t.datetime "resolved_at" + t.integer "resolved_by_id" + t.string "discussion_id" + t.text "note_html" + t.integer "cached_markdown_version" + t.text "change_position" + t.boolean "resolved_by_push" + t.index ["author_id"], name: "index_notes_on_author_id", using: :btree + t.index ["commit_id"], name: "index_notes_on_commit_id", using: :btree + t.index ["created_at"], name: "index_notes_on_created_at", using: :btree + t.index ["discussion_id"], name: "index_notes_on_discussion_id", using: :btree + t.index ["line_code"], name: "index_notes_on_line_code", using: :btree + t.index ["note"], name: "index_notes_on_note_trigram", using: :gin, opclasses: {"note"=>"gin_trgm_ops"} + t.index ["noteable_id", "noteable_type"], name: "index_notes_on_noteable_id_and_noteable_type", using: :btree + t.index ["noteable_type"], name: "index_notes_on_noteable_type", using: :btree + t.index ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type", using: :btree + t.index ["updated_at"], name: "index_notes_on_updated_at", using: :btree + end + create_table "notification_settings", id: :serial do |t| + t.integer "user_id", null: false + t.string "source_type" + t.integer "source_id" + t.integer "level", default: 0, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "new_note" + t.boolean "new_issue" + t.boolean "reopen_issue" + t.boolean "close_issue" + t.boolean "reassign_issue" + t.boolean "new_merge_request" + t.boolean "reopen_merge_request" + t.boolean "close_merge_request" + t.boolean "reassign_merge_request" + t.boolean "merge_merge_request" + t.boolean "failed_pipeline" + t.boolean "success_pipeline" + t.index ["source_id", "source_type"], name: "index_notification_settings_on_source_id_and_source_type", using: :btree + t.index ["user_id", "source_id", "source_type"], name: "index_notifications_on_user_id_and_source_id_and_source_type", unique: true, using: :btree + t.index ["user_id"], name: "index_notification_settings_on_user_id", using: :btree + end + create_table "oauth_access_grants", id: :serial do |t| + t.integer "resource_owner_id", null: false + t.integer "application_id", null: false + t.string "token", null: false + t.integer "expires_in", null: false + t.text "redirect_uri", null: false + t.datetime "created_at", null: false + t.datetime "revoked_at" + t.string "scopes" + t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true, using: :btree + end + create_table "oauth_access_tokens", id: :serial do |t| + t.integer "resource_owner_id" + t.integer "application_id" + t.string "token", null: false + t.string "refresh_token" + t.integer "expires_in" + t.datetime "revoked_at" + t.datetime "created_at", null: false + t.string "scopes" + t.index ["refresh_token"], name: "index_oauth_access_tokens_on_refresh_token", unique: true, using: :btree + t.index ["resource_owner_id"], name: "index_oauth_access_tokens_on_resource_owner_id", using: :btree + t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true, using: :btree + end + create_table "oauth_applications", id: :serial do |t| + t.string "name", null: false + t.string "uid", null: false + t.string "secret", null: false + t.text "redirect_uri", null: false + t.string "scopes", default: "", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "owner_id" + t.string "owner_type" + t.boolean "trusted", default: false, null: false + t.index ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type", using: :btree + t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree + end + create_table "oauth_openid_requests", id: :serial do |t| + t.integer "access_grant_id", null: false + t.string "nonce", null: false + end + create_table "pages_domains", id: :serial do |t| + t.integer "project_id" + t.text "certificate" + t.text "encrypted_key" + t.string "encrypted_key_iv" + t.string "encrypted_key_salt" + t.string "domain" + t.index ["domain"], name: "index_pages_domains_on_domain", unique: true, using: :btree + t.index ["project_id"], name: "index_pages_domains_on_project_id", using: :btree + end + create_table "personal_access_tokens", id: :serial do |t| + t.integer "user_id", null: false + t.string "token", null: false + t.string "name", null: false + t.boolean "revoked", default: false + t.date "expires_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "scopes", default: "--- []\n", null: false + t.boolean "impersonation", default: false, null: false + t.index ["token"], name: "index_personal_access_tokens_on_token", unique: true, using: :btree + t.index ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree + end + create_table "project_authorizations", id: false do |t| + t.integer "user_id" + t.integer "project_id" + t.integer "access_level" + t.index ["project_id"], name: "index_project_authorizations_on_project_id", using: :btree + t.index ["user_id", "project_id", "access_level"], name: "index_project_authorizations_on_user_id_project_id_access_level", unique: true, using: :btree + end + create_table "project_auto_devops", id: :serial do |t| + t.integer "project_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.boolean "enabled" + t.string "domain" + t.index ["project_id"], name: "index_project_auto_devops_on_project_id", unique: true, using: :btree + end + create_table "project_custom_attributes", id: :serial do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "project_id", null: false + t.string "key", null: false + t.string "value", null: false + t.index ["key", "value"], name: "index_project_custom_attributes_on_key_and_value", using: :btree + t.index ["project_id", "key"], name: "index_project_custom_attributes_on_project_id_and_key", unique: true, using: :btree + end + create_table "project_features", id: :serial do |t| + t.integer "project_id" + t.integer "merge_requests_access_level" + t.integer "issues_access_level" + t.integer "wiki_access_level" + t.integer "snippets_access_level" + t.integer "builds_access_level" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "repository_access_level", default: 20, null: false + t.index ["project_id"], name: "index_project_features_on_project_id", using: :btree + end + create_table "project_group_links", id: :serial do |t| + t.integer "project_id", null: false + t.integer "group_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "group_access", default: 30, null: false + t.date "expires_at" + t.index ["group_id"], name: "index_project_group_links_on_group_id", using: :btree + t.index ["project_id"], name: "index_project_group_links_on_project_id", using: :btree + end + create_table "project_import_data", id: :serial do |t| + t.integer "project_id" + t.text "data" + t.text "encrypted_credentials" + t.string "encrypted_credentials_iv" + t.string "encrypted_credentials_salt" + t.index ["project_id"], name: "index_project_import_data_on_project_id", using: :btree + end + create_table "project_statistics", id: :serial do |t| + t.integer "project_id", null: false + t.integer "namespace_id", null: false + t.bigint "commit_count", default: 0, null: false + t.bigint "storage_size", default: 0, null: false + t.bigint "repository_size", default: 0, null: false + t.bigint "lfs_objects_size", default: 0, null: false + t.bigint "build_artifacts_size", default: 0, null: false + t.index ["namespace_id"], name: "index_project_statistics_on_namespace_id", using: :btree + t.index ["project_id"], name: "index_project_statistics_on_project_id", unique: true, using: :btree + end + create_table "projects", id: :serial do |t| + t.string "name" + t.string "path" + t.text "description" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "creator_id" + t.integer "namespace_id" + t.datetime "last_activity_at" + t.string "import_url" + t.integer "visibility_level", default: 0, null: false + t.boolean "archived", default: false, null: false + t.string "avatar" + t.string "import_status" + t.integer "star_count", default: 0, null: false + t.boolean "merge_requests_rebase_enabled", default: false, null: false + t.string "import_type" + t.string "import_source" + t.boolean "merge_requests_ff_only_enabled", default: false, null: false + t.text "import_error" + t.integer "ci_id" + t.boolean "shared_runners_enabled", default: true, null: false + t.string "runners_token" + t.string "build_coverage_regex" + t.boolean "build_allow_git_fetch", default: true, null: false + t.integer "build_timeout", default: 3600, null: false + t.boolean "pending_delete", default: false + t.boolean "public_builds", default: true, null: false + t.boolean "last_repository_check_failed" + t.datetime "last_repository_check_at" + t.boolean "container_registry_enabled" + t.boolean "only_allow_merge_if_pipeline_succeeds", default: false, null: false + t.boolean "has_external_issue_tracker" + t.string "repository_storage", default: "default", null: false + t.boolean "repository_read_only" + t.boolean "request_access_enabled", default: false, null: false + t.boolean "has_external_wiki" + t.string "ci_config_path" + t.boolean "lfs_enabled" + t.text "description_html" + t.boolean "only_allow_merge_if_all_discussions_are_resolved" + t.boolean "printing_merge_request_link_enabled", default: true, null: false + t.integer "auto_cancel_pending_pipelines", default: 1, null: false + t.string "import_jid" + t.integer "cached_markdown_version" + t.text "delete_error" + t.datetime "last_repository_updated_at" + t.integer "storage_version", limit: 2 + t.boolean "resolve_outdated_diff_discussions" + t.string "external_authorization_classification_label" + t.integer "jobs_cache_index" + t.index ["ci_id"], name: "index_projects_on_ci_id", using: :btree + t.index ["created_at"], name: "index_projects_on_created_at", using: :btree + t.index ["creator_id"], name: "index_projects_on_creator_id", using: :btree + t.index ["description"], name: "index_projects_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} + t.index ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree + t.index ["last_repository_check_failed"], name: "index_projects_on_last_repository_check_failed", using: :btree + t.index ["last_repository_updated_at"], name: "index_projects_on_last_repository_updated_at", using: :btree + t.index ["name"], name: "index_projects_on_name_trigram", using: :gin, opclasses: {"name"=>"gin_trgm_ops"} + t.index ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree + t.index ["path"], name: "index_projects_on_path", using: :btree + t.index ["path"], name: "index_projects_on_path_trigram", using: :gin, opclasses: {"path"=>"gin_trgm_ops"} + t.index ["pending_delete"], name: "index_projects_on_pending_delete", using: :btree + t.index ["repository_storage"], name: "index_projects_on_repository_storage", using: :btree + t.index ["runners_token"], name: "index_projects_on_runners_token", using: :btree + t.index ["star_count"], name: "index_projects_on_star_count", using: :btree + t.index ["visibility_level"], name: "index_projects_on_visibility_level", using: :btree + end + create_table "protected_branch_merge_access_levels", id: :serial do |t| + t.integer "protected_branch_id", null: false + t.integer "access_level", default: 40, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["protected_branch_id"], name: "index_protected_branch_merge_access", using: :btree + end + create_table "protected_branch_push_access_levels", id: :serial do |t| + t.integer "protected_branch_id", null: false + t.integer "access_level", default: 40, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["protected_branch_id"], name: "index_protected_branch_push_access", using: :btree + end + create_table "protected_branches", id: :serial do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.index ["project_id"], name: "index_protected_branches_on_project_id", using: :btree + end + create_table "protected_tag_create_access_levels", id: :serial do |t| + t.integer "protected_tag_id", null: false + t.integer "access_level", default: 40 + t.integer "user_id" + t.integer "group_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["protected_tag_id"], name: "index_protected_tag_create_access", using: :btree + t.index ["user_id"], name: "index_protected_tag_create_access_levels_on_user_id", using: :btree + end + create_table "protected_tags", id: :serial do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["project_id"], name: "index_protected_tags_on_project_id", using: :btree + end + create_table "push_event_payloads", id: false do |t| + t.bigint "commit_count", null: false + t.integer "event_id", null: false + t.integer "action", limit: 2, null: false + t.integer "ref_type", limit: 2, null: false + t.binary "commit_from" + t.binary "commit_to" + t.text "ref" + t.string "commit_title", limit: 70 + t.index ["event_id"], name: "index_push_event_payloads_on_event_id", unique: true, using: :btree + end + create_table "redirect_routes", id: :serial do |t| + t.integer "source_id", null: false + t.string "source_type", null: false + t.string "path", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "permanent" + t.index ["path"], name: "index_redirect_routes_on_path", unique: true, using: :btree + t.index ["path"], name: "index_redirect_routes_on_path_text_pattern_ops", using: :btree, opclasses: {"path"=>"varchar_pattern_ops"} + t.index ["permanent"], name: "index_redirect_routes_on_permanent", using: :btree + t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id", using: :btree + end + create_table "releases", id: :serial do |t| + t.string "tag" + t.text "description" + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.text "description_html" + t.integer "cached_markdown_version" + t.index ["project_id", "tag"], name: "index_releases_on_project_id_and_tag", using: :btree + t.index ["project_id"], name: "index_releases_on_project_id", using: :btree + end + create_table "routes", id: :serial do |t| + t.integer "source_id", null: false + t.string "source_type", null: false + t.string "path", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.index ["path"], name: "index_routes_on_path", unique: true, using: :btree + t.index ["path"], name: "index_routes_on_path_text_pattern_ops", using: :btree, opclasses: {"path"=>"varchar_pattern_ops"} + t.index ["source_type", "source_id"], name: "index_routes_on_source_type_and_source_id", unique: true, using: :btree + end + create_table "sent_notifications", id: :serial do |t| + t.integer "project_id" + t.string "noteable_type" + t.integer "noteable_id" + t.integer "recipient_id" + t.string "commit_id" + t.string "reply_key", null: false + t.string "line_code" + t.string "note_type" + t.text "position" + t.string "in_reply_to_discussion_id" + t.index ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true, using: :btree + end + create_table "services", id: :serial do |t| + t.string "type" + t.string "title" + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "active", default: false, null: false + t.text "properties" + t.boolean "template", default: false + t.boolean "push_events", default: true + t.boolean "issues_events", default: true + t.boolean "merge_requests_events", default: true + t.boolean "tag_push_events", default: true + t.boolean "note_events", default: true, null: false + t.string "category", default: "common", null: false + t.boolean "default", default: false + t.boolean "wiki_page_events", default: true + t.boolean "pipeline_events", default: false, null: false + t.boolean "confidential_issues_events", default: true, null: false + t.boolean "commit_events", default: true, null: false + t.boolean "job_events", default: false, null: false + t.index ["project_id"], name: "index_services_on_project_id", using: :btree + t.index ["template"], name: "index_services_on_template", using: :btree + end + create_table "snippets", id: :serial do |t| + t.string "title" + t.text "content" + t.integer "author_id", null: false + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.string "file_name" + t.string "type" + t.integer "visibility_level", default: 0, null: false + t.text "title_html" + t.text "content_html" + t.integer "cached_markdown_version" + t.text "description" + t.text "description_html" + t.index ["author_id"], name: "index_snippets_on_author_id", using: :btree + t.index ["file_name"], name: "index_snippets_on_file_name_trigram", using: :gin, opclasses: {"file_name"=>"gin_trgm_ops"} + t.index ["project_id"], name: "index_snippets_on_project_id", using: :btree + t.index ["title"], name: "index_snippets_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} + t.index ["updated_at"], name: "index_snippets_on_updated_at", using: :btree + t.index ["visibility_level"], name: "index_snippets_on_visibility_level", using: :btree + end + create_table "spam_logs", id: :serial do |t| + t.integer "user_id" + t.string "source_ip" + t.string "user_agent" + t.boolean "via_api" + t.string "noteable_type" + t.string "title" + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "submitted_as_ham", default: false, null: false + t.boolean "recaptcha_verified", default: false, null: false + end + create_table "subscriptions", id: :serial do |t| + t.integer "user_id" + t.string "subscribable_type" + t.integer "subscribable_id" + t.boolean "subscribed" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "project_id" + t.index ["subscribable_id", "subscribable_type", "user_id", "project_id"], name: "index_subscriptions_on_subscribable_and_user_id_and_project_id", unique: true, using: :btree + end + create_table "system_note_metadata", id: :serial do |t| + t.integer "note_id", null: false + t.integer "commit_count" + t.string "action" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["note_id"], name: "index_system_note_metadata_on_note_id", unique: true, using: :btree + end + create_table "taggings", id: :serial do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context" + t.datetime "created_at" + t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree + t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree + end + create_table "tags", id: :serial do |t| + t.string "name" + t.integer "taggings_count", default: 0 + t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree + end + create_table "timelogs", id: :serial do |t| + t.integer "time_spent", null: false + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "issue_id" + t.integer "merge_request_id" + t.datetime_with_timezone "spent_at" + t.index ["issue_id"], name: "index_timelogs_on_issue_id", using: :btree + t.index ["merge_request_id"], name: "index_timelogs_on_merge_request_id", using: :btree + t.index ["user_id"], name: "index_timelogs_on_user_id", using: :btree + end + create_table "todos", id: :serial do |t| + t.integer "user_id", null: false + t.integer "project_id", null: false + t.string "target_type", null: false + t.integer "target_id" + t.integer "author_id" + t.integer "action", null: false + t.string "state", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "note_id" + t.string "commit_id" + t.index ["author_id"], name: "index_todos_on_author_id", using: :btree + t.index ["commit_id"], name: "index_todos_on_commit_id", using: :btree + t.index ["note_id"], name: "index_todos_on_note_id", using: :btree + t.index ["project_id"], name: "index_todos_on_project_id", using: :btree + t.index ["target_type", "target_id"], name: "index_todos_on_target_type_and_target_id", using: :btree + t.index ["user_id"], name: "index_todos_on_user_id", using: :btree + end + create_table "trending_projects", id: :serial do |t| + t.integer "project_id", null: false + t.index ["project_id"], name: "index_trending_projects_on_project_id", using: :btree + end + create_table "u2f_registrations", id: :serial do |t| + t.text "certificate" + t.string "key_handle" + t.string "public_key" + t.integer "counter" + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "name" + t.index ["key_handle"], name: "index_u2f_registrations_on_key_handle", using: :btree + t.index ["user_id"], name: "index_u2f_registrations_on_user_id", using: :btree + end + create_table "uploads", id: :serial do |t| + t.bigint "size", null: false + t.string "path", limit: 511, null: false + t.string "checksum", limit: 64 + t.string "model_type" + t.integer "model_id" + t.string "uploader", null: false + t.datetime "created_at", null: false + t.integer "store" + t.index ["checksum"], name: "index_uploads_on_checksum", using: :btree + t.index ["model_id", "model_type"], name: "index_uploads_on_model_id_and_model_type", using: :btree + t.index ["path"], name: "index_uploads_on_path", using: :btree + end + create_table "user_agent_details", id: :serial do |t| + t.string "user_agent", null: false + t.string "ip_address", null: false + t.integer "subject_id", null: false + t.string "subject_type", null: false + t.boolean "submitted", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type", using: :btree + end + create_table "user_custom_attributes", id: :serial do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id", null: false + t.string "key", null: false + t.string "value", null: false + t.index ["key", "value"], name: "index_user_custom_attributes_on_key_and_value", using: :btree + t.index ["user_id", "key"], name: "index_user_custom_attributes_on_user_id_and_key", unique: true, using: :btree + end + create_table "user_synced_attributes_metadata", id: :serial do |t| + t.boolean "name_synced", default: false + t.boolean "email_synced", default: false + t.boolean "location_synced", default: false + t.integer "user_id", null: false + t.string "provider" + t.index ["user_id"], name: "index_user_synced_attributes_metadata_on_user_id", unique: true, using: :btree + end + create_table "users", id: :serial do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", default: 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.boolean "admin", default: false, null: false + t.integer "projects_limit", null: false + t.string "skype", default: "", null: false + t.string "linkedin", default: "", null: false + t.string "twitter", default: "", null: false + t.string "bio" + t.integer "failed_attempts", default: 0 + t.datetime "locked_at" + t.string "username" + t.boolean "can_create_group", default: true, null: false + t.boolean "can_create_team", default: true, null: false + t.string "state" + t.integer "color_scheme_id", default: 1, null: false + t.datetime "password_expires_at" + t.integer "created_by_id" + t.datetime "last_credential_check_at" + t.string "avatar" + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" + t.string "unconfirmed_email" + t.boolean "hide_no_ssh_key", default: false + t.string "website_url", default: "", null: false + t.string "notification_email" + t.boolean "hide_no_password", default: false + t.boolean "password_automatically_set", default: false + t.string "location" + t.string "encrypted_otp_secret" + t.string "encrypted_otp_secret_iv" + t.string "encrypted_otp_secret_salt" + t.boolean "otp_required_for_login", default: false, null: false + t.text "otp_backup_codes" + t.string "public_email", default: "", null: false + t.integer "dashboard", default: 0 + t.integer "project_view", default: 0 + t.integer "consumed_timestep" + t.integer "layout", default: 0 + t.boolean "hide_project_limit", default: false + t.string "unlock_token" + t.datetime "otp_grace_period_started_at" + t.boolean "external", default: false + t.string "incoming_email_token" + t.string "organization" + t.boolean "require_two_factor_authentication_from_group", default: false, null: false + t.integer "two_factor_grace_period", default: 48, null: false + t.boolean "ghost" + t.date "last_activity_on" + t.boolean "notified_of_own_activity" + t.string "preferred_language" + t.string "rss_token" + t.integer "theme_id", limit: 2 + t.index ["admin"], name: "index_users_on_admin", using: :btree + t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree + t.index ["created_at"], name: "index_users_on_created_at", using: :btree + t.index ["email"], name: "index_users_on_email", unique: true, using: :btree + t.index ["email"], name: "index_users_on_email_trigram", using: :gin, opclasses: {"email"=>"gin_trgm_ops"} + t.index ["ghost"], name: "index_users_on_ghost", using: :btree + t.index ["incoming_email_token"], name: "index_users_on_incoming_email_token", using: :btree + t.index ["name"], name: "index_users_on_name", using: :btree + t.index ["name"], name: "index_users_on_name_trigram", using: :gin, opclasses: {"name"=>"gin_trgm_ops"} + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + t.index ["rss_token"], name: "index_users_on_rss_token", using: :btree + t.index ["state"], name: "index_users_on_state", using: :btree + t.index ["username"], name: "index_users_on_username", using: :btree + t.index ["username"], name: "index_users_on_username_trigram", using: :gin, opclasses: {"username"=>"gin_trgm_ops"} + end + create_table "users_star_projects", id: :serial do |t| + t.integer "project_id", null: false + t.integer "user_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.index ["project_id"], name: "index_users_star_projects_on_project_id", using: :btree + t.index ["user_id", "project_id"], name: "index_users_star_projects_on_user_id_and_project_id", unique: true, using: :btree + end + create_table "web_hook_logs", id: :serial do |t| + t.integer "web_hook_id", null: false + t.string "trigger" + t.string "url" + t.text "request_headers" + t.text "request_data" + t.text "response_headers" + t.text "response_body" + t.string "response_status" + t.float "execution_duration" + t.string "internal_error_message" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["web_hook_id"], name: "index_web_hook_logs_on_web_hook_id", using: :btree + end + create_table "web_hooks", id: :serial do |t| + t.string "url", limit: 2000 + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.string "type", default: "ProjectHook" + t.integer "service_id" + t.boolean "push_events", default: true, null: false + t.boolean "issues_events", default: false, null: false + t.boolean "merge_requests_events", default: false, null: false + t.boolean "tag_push_events", default: false + t.boolean "note_events", default: false, null: false + t.boolean "enable_ssl_verification", default: true + t.boolean "wiki_page_events", default: false, null: false + t.string "token" + t.boolean "pipeline_events", default: false, null: false + t.boolean "confidential_issues_events", default: false, null: false + t.boolean "repository_update_events", default: false, null: false + t.boolean "job_events", default: false, null: false + t.boolean "confidential_note_events" + t.index ["project_id"], name: "index_web_hooks_on_project_id", using: :btree + t.index ["type"], name: "index_web_hooks_on_type", using: :btree + end + add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade + add_foreign_key "chat_teams", "namespaces", on_delete: :cascade + add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade + add_foreign_key "ci_build_trace_sections", "ci_build_trace_section_names", column: "section_name_id", name: "fk_264e112c66", on_delete: :cascade + add_foreign_key "ci_build_trace_sections", "ci_builds", column: "build_id", name: "fk_4ebe41f502", on_delete: :cascade + add_foreign_key "ci_build_trace_sections", "projects", on_delete: :cascade + add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify + add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade + add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade + add_foreign_key "ci_group_variables", "namespaces", column: "group_id", name: "fk_33ae4d58d8", on_delete: :cascade + add_foreign_key "ci_job_artifacts", "ci_builds", column: "job_id", on_delete: :cascade + add_foreign_key "ci_job_artifacts", "projects", on_delete: :cascade + add_foreign_key "ci_pipeline_schedule_variables", "ci_pipeline_schedules", column: "pipeline_schedule_id", name: "fk_41c35fda51", on_delete: :cascade + add_foreign_key "ci_pipeline_schedules", "projects", name: "fk_8ead60fcc4", on_delete: :cascade + add_foreign_key "ci_pipeline_schedules", "users", column: "owner_id", name: "fk_9ea99f58d2", on_delete: :nullify + add_foreign_key "ci_pipeline_variables", "ci_pipelines", column: "pipeline_id", name: "fk_f29c5f4380", on_delete: :cascade + add_foreign_key "ci_pipelines", "ci_pipeline_schedules", column: "pipeline_schedule_id", name: "fk_3d34ab2e06", on_delete: :nullify + add_foreign_key "ci_pipelines", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_262d4c2d19", on_delete: :nullify + add_foreign_key "ci_pipelines", "projects", name: "fk_86635dbd80", on_delete: :cascade + add_foreign_key "ci_runner_namespaces", "ci_runners", column: "runner_id", on_delete: :cascade + add_foreign_key "ci_runner_namespaces", "namespaces", on_delete: :cascade + add_foreign_key "ci_runner_projects", "projects", name: "fk_4478a6f1e4", on_delete: :cascade + add_foreign_key "ci_stages", "ci_pipelines", column: "pipeline_id", name: "fk_fb57e6cc56", on_delete: :cascade + add_foreign_key "ci_stages", "projects", name: "fk_2360681d1d", on_delete: :cascade + add_foreign_key "ci_trigger_requests", "ci_triggers", column: "trigger_id", name: "fk_b8ec8b7245", on_delete: :cascade + add_foreign_key "ci_triggers", "projects", name: "fk_e3e63f966e", on_delete: :cascade + add_foreign_key "ci_triggers", "users", column: "owner_id", name: "fk_e8e10d1964", on_delete: :cascade + add_foreign_key "ci_variables", "projects", name: "fk_ada5eb64b3", on_delete: :cascade + add_foreign_key "cluster_platforms_kubernetes", "clusters", on_delete: :cascade + add_foreign_key "cluster_projects", "clusters", on_delete: :cascade + add_foreign_key "cluster_projects", "projects", on_delete: :cascade + add_foreign_key "cluster_providers_gcp", "clusters", on_delete: :cascade + add_foreign_key "clusters", "users", on_delete: :nullify + add_foreign_key "clusters_applications_helm", "clusters", on_delete: :cascade + add_foreign_key "clusters_applications_ingress", "clusters", on_delete: :cascade + add_foreign_key "clusters_applications_prometheus", "clusters", on_delete: :cascade + add_foreign_key "container_repositories", "projects" + add_foreign_key "deploy_keys_projects", "projects", name: "fk_58a901ca7e", on_delete: :cascade + add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade + add_foreign_key "environments", "projects", name: "fk_d1c8c1da6a", on_delete: :cascade + add_foreign_key "events", "projects", on_delete: :cascade + add_foreign_key "events", "users", column: "author_id", name: "fk_edfd187b6f", on_delete: :cascade + add_foreign_key "fork_network_members", "fork_networks", on_delete: :cascade + add_foreign_key "fork_network_members", "projects", column: "forked_from_project_id", name: "fk_b01280dae4", on_delete: :nullify + add_foreign_key "fork_network_members", "projects", on_delete: :cascade + add_foreign_key "fork_networks", "projects", column: "root_project_id", name: "fk_e7b436b2b5", on_delete: :nullify + add_foreign_key "forked_project_links", "projects", column: "forked_to_project_id", name: "fk_434510edb0", on_delete: :cascade + add_foreign_key "gcp_clusters", "projects", on_delete: :cascade + add_foreign_key "gcp_clusters", "services", on_delete: :nullify + add_foreign_key "gcp_clusters", "users", on_delete: :nullify + add_foreign_key "gpg_key_subkeys", "gpg_keys", on_delete: :cascade + add_foreign_key "gpg_keys", "users", on_delete: :cascade + add_foreign_key "gpg_signatures", "gpg_key_subkeys", on_delete: :nullify + add_foreign_key "gpg_signatures", "gpg_keys", on_delete: :nullify + add_foreign_key "gpg_signatures", "projects", on_delete: :cascade + add_foreign_key "group_custom_attributes", "namespaces", column: "group_id", on_delete: :cascade + add_foreign_key "issue_assignees", "issues", name: "fk_b7d881734a", on_delete: :cascade + add_foreign_key "issue_assignees", "users", name: "fk_5e0c8d9154", on_delete: :cascade + add_foreign_key "issue_metrics", "issues", on_delete: :cascade + add_foreign_key "issues", "issues", column: "moved_to_id", name: "fk_a194299be1", on_delete: :nullify + add_foreign_key "issues", "milestones", name: "fk_96b1dd429c", on_delete: :nullify + add_foreign_key "issues", "projects", name: "fk_899c8f3231", on_delete: :cascade + add_foreign_key "issues", "users", column: "author_id", name: "fk_05f1e72feb", on_delete: :nullify + add_foreign_key "issues", "users", column: "updated_by_id", name: "fk_ffed080f01", on_delete: :nullify + add_foreign_key "label_priorities", "labels", on_delete: :cascade + add_foreign_key "label_priorities", "projects", on_delete: :cascade + add_foreign_key "labels", "namespaces", column: "group_id", on_delete: :cascade + add_foreign_key "labels", "projects", name: "fk_7de4989a69", on_delete: :cascade + add_foreign_key "lists", "boards", name: "fk_0d3f677137", on_delete: :cascade + add_foreign_key "lists", "labels", name: "fk_7a5553d60f", on_delete: :cascade + add_foreign_key "members", "users", name: "fk_2e88fb7ce9", on_delete: :cascade + add_foreign_key "merge_request_diff_commits", "merge_request_diffs", on_delete: :cascade + add_foreign_key "merge_request_diff_files", "merge_request_diffs", on_delete: :cascade + add_foreign_key "merge_request_diffs", "merge_requests", name: "fk_8483f3258f", on_delete: :cascade + add_foreign_key "merge_request_metrics", "ci_pipelines", column: "pipeline_id", on_delete: :cascade + add_foreign_key "merge_request_metrics", "merge_requests", on_delete: :cascade + add_foreign_key "merge_request_metrics", "users", column: "latest_closed_by_id", name: "fk_ae440388cc", on_delete: :nullify + add_foreign_key "merge_request_metrics", "users", column: "merged_by_id", name: "fk_7f28d925f3", on_delete: :nullify + add_foreign_key "merge_requests", "ci_pipelines", column: "head_pipeline_id", name: "fk_fd82eae0b9", on_delete: :nullify + add_foreign_key "merge_requests", "merge_request_diffs", column: "latest_merge_request_diff_id", name: "fk_06067f5644", on_delete: :nullify + add_foreign_key "merge_requests", "milestones", name: "fk_6a5165a692", on_delete: :nullify + add_foreign_key "merge_requests", "projects", column: "source_project_id", name: "fk_3308fe130c", on_delete: :nullify + add_foreign_key "merge_requests", "projects", column: "target_project_id", name: "fk_a6963e8447", on_delete: :cascade + add_foreign_key "merge_requests", "users", column: "assignee_id", name: "fk_6149611a04", on_delete: :nullify + add_foreign_key "merge_requests", "users", column: "author_id", name: "fk_e719a85f8a", on_delete: :nullify + add_foreign_key "merge_requests", "users", column: "merge_user_id", name: "fk_ad525e1f87", on_delete: :nullify + add_foreign_key "merge_requests", "users", column: "updated_by_id", name: "fk_641731faff", on_delete: :nullify + add_foreign_key "merge_requests_closing_issues", "issues", on_delete: :cascade + add_foreign_key "merge_requests_closing_issues", "merge_requests", on_delete: :cascade + add_foreign_key "milestones", "namespaces", column: "group_id", name: "fk_95650a40d4", on_delete: :cascade + add_foreign_key "milestones", "projects", name: "fk_9bd0a0c791", on_delete: :cascade + add_foreign_key "notes", "projects", name: "fk_99e097b079", on_delete: :cascade + add_foreign_key "oauth_openid_requests", "oauth_access_grants", column: "access_grant_id", name: "fk_oauth_openid_requests_oauth_access_grants_access_grant_id" + add_foreign_key "pages_domains", "projects", name: "fk_ea2f6dfc6f", on_delete: :cascade + add_foreign_key "personal_access_tokens", "users" + add_foreign_key "project_authorizations", "projects", on_delete: :cascade + add_foreign_key "project_authorizations", "users", on_delete: :cascade + add_foreign_key "project_auto_devops", "projects", on_delete: :cascade + add_foreign_key "project_custom_attributes", "projects", on_delete: :cascade + add_foreign_key "project_features", "projects", name: "fk_18513d9b92", on_delete: :cascade + add_foreign_key "project_group_links", "projects", name: "fk_daa8cee94c", on_delete: :cascade + add_foreign_key "project_import_data", "projects", name: "fk_ffb9ee3a10", on_delete: :cascade + add_foreign_key "project_statistics", "projects", on_delete: :cascade + add_foreign_key "protected_branch_merge_access_levels", "protected_branches", name: "fk_8a3072ccb3", on_delete: :cascade + add_foreign_key "protected_branch_push_access_levels", "protected_branches", name: "fk_9ffc86a3d9", on_delete: :cascade + add_foreign_key "protected_branches", "projects", name: "fk_7a9c6d93e7", on_delete: :cascade + add_foreign_key "protected_tag_create_access_levels", "namespaces", column: "group_id" + add_foreign_key "protected_tag_create_access_levels", "protected_tags", name: "fk_f7dfda8c51", on_delete: :cascade + add_foreign_key "protected_tag_create_access_levels", "users" + add_foreign_key "protected_tags", "projects", name: "fk_8e4af87648", on_delete: :cascade + add_foreign_key "push_event_payloads", "events", name: "fk_36c74129da", on_delete: :cascade + add_foreign_key "releases", "projects", name: "fk_47fe2a0596", on_delete: :cascade + add_foreign_key "services", "projects", name: "fk_71cce407f9", on_delete: :cascade + add_foreign_key "snippets", "projects", name: "fk_be41fd4bb7", on_delete: :cascade + add_foreign_key "subscriptions", "projects", on_delete: :cascade + add_foreign_key "system_note_metadata", "notes", name: "fk_d83a918cb1", on_delete: :cascade + add_foreign_key "timelogs", "issues", name: "fk_timelogs_issues_issue_id", on_delete: :cascade + add_foreign_key "timelogs", "merge_requests", name: "fk_timelogs_merge_requests_merge_request_id", on_delete: :cascade + add_foreign_key "todos", "projects", name: "fk_45054f9c45", on_delete: :cascade + add_foreign_key "trending_projects", "projects", on_delete: :cascade + add_foreign_key "u2f_registrations", "users" + add_foreign_key "user_custom_attributes", "users", on_delete: :cascade + add_foreign_key "user_synced_attributes_metadata", "users", on_delete: :cascade + add_foreign_key "users_star_projects", "projects", name: "fk_22cd27ddfc", on_delete: :cascade + add_foreign_key "web_hook_logs", "web_hooks", on_delete: :cascade + add_foreign_key "web_hooks", "projects", name: "fk_0c8ca6d9d1", on_delete: :cascade + end + + def down + raise ActiveRecord::IrreversibleMigration, "The initial migration is not revertable" + end +end diff --git a/db/migrate/20190613044655_add_username_to_deploy_tokens.rb b/db/migrate/20190613044655_add_username_to_deploy_tokens.rb new file mode 100644 index 00000000000..793553afe35 --- /dev/null +++ b/db/migrate/20190613044655_add_username_to_deploy_tokens.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddUsernameToDeployTokens < ActiveRecord::Migration[5.1] + DOWNTIME = false + + def change + add_column :deploy_tokens, :username, :string + end +end diff --git a/db/migrate/20161115173905_add_start_date_to_milestones.rb b/db/migrate/20190625115224_add_description_to_services.rb index 847c4f0bebb..d5ef3900462 100644 --- a/db/migrate/20161115173905_add_start_date_to_milestones.rb +++ b/db/migrate/20190625115224_add_description_to_services.rb @@ -1,12 +1,14 @@ +# frozen_string_literal: true + # See http://doc.gitlab.com/ce/development/migration_style_guide.html # for more information on how to write migrations for GitLab. -class AddStartDateToMilestones < ActiveRecord::Migration[4.2] +class AddDescriptionToServices < ActiveRecord::Migration[5.1] include Gitlab::Database::MigrationHelpers DOWNTIME = false def change - add_column :milestones, :start_date, :date + add_column :services, :description, :string, limit: 500 end end diff --git a/db/migrate/20190628185000_add_released_at_to_releases_table.rb b/db/migrate/20190628185000_add_released_at_to_releases_table.rb new file mode 100644 index 00000000000..ae55aa434d9 --- /dev/null +++ b/db/migrate/20190628185000_add_released_at_to_releases_table.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddReleasedAtToReleasesTable < ActiveRecord::Migration[5.1] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def change + add_column(:releases, :released_at, :datetime_with_timezone) + end +end diff --git a/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb b/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb new file mode 100644 index 00000000000..1e5d3e8f235 --- /dev/null +++ b/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class BackfillAndAddNotNullConstraintToReleasedAtColumnOnReleasesTable < ActiveRecord::Migration[5.1] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + update_column_in_batches(:releases, :released_at, Arel.sql('created_at')) + change_column_null(:releases, :released_at, false) + end + + def down + change_column_null(:releases, :released_at, true) + end +end diff --git a/db/post_migrate/20160824121037_change_personal_access_tokens_default_back_to_empty_array.rb b/db/post_migrate/20160824121037_change_personal_access_tokens_default_back_to_empty_array.rb deleted file mode 100644 index 099814d7556..00000000000 --- a/db/post_migrate/20160824121037_change_personal_access_tokens_default_back_to_empty_array.rb +++ /dev/null @@ -1,19 +0,0 @@ -# The default needs to be `[]`, but all existing access tokens need to have `scopes` set to `['api']`. -# It's easier to achieve this by adding the column with the `['api']` default (regular migration), and -# then changing the default to `[]` (in this post-migration). -# -# Details: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5951#note_19721973 - -class ChangePersonalAccessTokensDefaultBackToEmptyArray < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - change_column_default :personal_access_tokens, :scopes, [].to_yaml - end - - def down - change_column_default :personal_access_tokens, :scopes, ['api'].to_yaml - end -end diff --git a/db/post_migrate/20161011222551_remove_inactive_jira_service_properties.rb b/db/post_migrate/20161011222551_remove_inactive_jira_service_properties.rb deleted file mode 100644 index bf3aee99418..00000000000 --- a/db/post_migrate/20161011222551_remove_inactive_jira_service_properties.rb +++ /dev/null @@ -1,10 +0,0 @@ -class RemoveInactiveJiraServiceProperties < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = "Removes all inactive jira_service properties" - - def up - execute("UPDATE services SET properties = '{}' WHERE services.type = 'JiraService' and services.active = false") - end -end diff --git a/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb b/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb deleted file mode 100644 index 6d9c7e4ed72..00000000000 --- a/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb +++ /dev/null @@ -1,49 +0,0 @@ -class FixProjectRecordsWithInvalidVisibility < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - BATCH_SIZE = 500 - DOWNTIME = false - - # This migration is idempotent and there's no sense in throwing away the - # partial result if it's interrupted - disable_ddl_transaction! - - def up - projects = Arel::Table.new(:projects) - namespaces = Arel::Table.new(:namespaces) - - finder_sql = - projects - .join(namespaces, Arel::Nodes::InnerJoin) - .on(projects[:namespace_id].eq(namespaces[:id])) - .where(projects[:visibility_level].gt(namespaces[:visibility_level])) - .project(projects[:id], namespaces[:visibility_level]) - .take(BATCH_SIZE) - .to_sql - - # Update matching rows in batches. Each batch can cause up to 3 UPDATE - # statements, in addition to the SELECT: one per visibility_level - loop do - to_update = connection.exec_query(finder_sql) - break if to_update.rows.count == 0 - - # row[0] is projects.id, row[1] is namespaces.visibility_level - updates = to_update.rows.each_with_object(Hash.new {|h, k| h[k] = [] }) do |row, obj| - obj[row[1]] << row[0] - end - - updates.each do |visibility_level, project_ids| - updater = Arel::UpdateManager.new - .table(projects) - .set(projects[:visibility_level] => visibility_level) - .where(projects[:id].in(project_ids)) - - ActiveRecord::Base.connection.exec_update(updater.to_sql, self.class.name, []) - end - end - end - - def down - # no-op - end -end diff --git a/db/post_migrate/20161128170531_drop_user_activities_table.rb b/db/post_migrate/20161128170531_drop_user_activities_table.rb deleted file mode 100644 index d8b1e0731f3..00000000000 --- a/db/post_migrate/20161128170531_drop_user_activities_table.rb +++ /dev/null @@ -1,33 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -class DropUserActivitiesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - drop_table :user_activities if table_exists?(:user_activities) - end - - def down - unless table_exists?(:user_activities) - create_table "user_activities", force: :cascade do |t| - t.integer "user_id" - t.datetime "last_activity_at", null: false - end - - add_index "user_activities", ["user_id"], name: "index_user_activities_on_user_id", unique: true, using: :btree - end - end -end diff --git a/db/post_migrate/20161221140236_remove_unneeded_services.rb b/db/post_migrate/20161221140236_remove_unneeded_services.rb deleted file mode 100644 index 31f24263877..00000000000 --- a/db/post_migrate/20161221140236_remove_unneeded_services.rb +++ /dev/null @@ -1,15 +0,0 @@ -class RemoveUnneededServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - disable_statement_timeout - - execute("DELETE FROM services WHERE active = false AND properties = '{}';") - end - - def down - # noop - end -end diff --git a/db/post_migrate/20161221153951_rename_reserved_project_names.rb b/db/post_migrate/20161221153951_rename_reserved_project_names.rb deleted file mode 100644 index 32579256299..00000000000 --- a/db/post_migrate/20161221153951_rename_reserved_project_names.rb +++ /dev/null @@ -1,137 +0,0 @@ -class RenameReservedProjectNames < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - THREAD_COUNT = 8 - - KNOWN_PATHS = %w(.well-known - all - blame - blob - commits - create - create_dir - edit - files - find_file - groups - hooks - issues - logs_tree - merge_requests - new - preview - projects - raw - repository - robots.txt - s - snippets - teams - tree - u - unsubscribes - update - users - wikis).freeze - - def up - queues = Array.new(THREAD_COUNT) { Queue.new } - start = false - - threads = Array.new(THREAD_COUNT) do |index| - Thread.new do - queue = queues[index] - - # Wait until we have input to process. - until start; end - - rename_projects(queue.pop) until queue.empty? - end - end - - enum = queues.each - - reserved_projects.each_slice(100) do |slice| - begin - queue = enum.next - rescue StopIteration - enum.rewind - retry - end - - queue << slice - end - - start = true - - threads.each(&:join) - end - - def down - # nothing to do here - end - - private - - def reserved_projects - Project.unscoped - .includes(:namespace) - .where('EXISTS (SELECT 1 FROM namespaces WHERE projects.namespace_id = namespaces.id)') - .where('projects.path' => KNOWN_PATHS) - end - - def route_exists?(full_path) - quoted_path = ActiveRecord::Base.connection.quote_string(full_path) - - ActiveRecord::Base.connection - .select_all("SELECT id, path FROM routes WHERE path = '#{quoted_path}'").present? - end - - # Adds number to the end of the path that is not taken by other route - def rename_path(namespace_path, path_was) - counter = 0 - path = "#{path_was}#{counter}" - - while route_exists?("#{namespace_path}/#{path}") - counter += 1 - path = "#{path_was}#{counter}" - end - - path - end - - def rename_projects(projects) - projects.each do |project| - id = project.id - path_was = project.path - namespace_path = project.namespace.path - path = rename_path(namespace_path, path_was) - - begin - # Because project path update is quite complex operation we can't safely - # copy-paste all code from GitLab. As exception we use Rails code here - if rename_project_row(project, path) - after_rename_service(project, path_was, namespace_path).execute - end - rescue Exception => e # rubocop: disable Lint/RescueException - Rails.logger.error "Exception when renaming project #{id}: #{e.message}" - end - end - end - - def rename_project_row(project, path) - project.respond_to?(:update_attributes) && - project.update(path: path) && - defined?(Projects::AfterRenameService) - end - - def after_rename_service(project, path_was, namespace_path) - AfterRenameService.new( - project, - path_before: path_was, - full_path_before: "#{namespace_path}/#{path_was}" - ).execute - end -end diff --git a/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb b/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb deleted file mode 100644 index f567accb051..00000000000 --- a/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb +++ /dev/null @@ -1,49 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RequeuePendingDeleteProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - admin = User.find_by(admin: true) - return unless admin - - @offset = 0 - - loop do - ids = pending_delete_batch - - break if ids.rows.count.zero? - - args = ids.map { |id| [id['id'], admin.id, {}] } - - Sidekiq::Client.push_bulk('class' => "ProjectDestroyWorker", 'args' => args) - - @offset += 1 - end - end - - def down - # noop - end - - private - - def pending_delete_batch - connection.exec_query(find_batch) - end - - BATCH_SIZE = 5000 - - def find_batch - projects = Arel::Table.new(:projects) - projects.project(projects[:id]) - .where(projects[:pending_delete].eq(true)) - .where(projects[:namespace_id].not_eq(nil)) - .skip(@offset * BATCH_SIZE) - .take(BATCH_SIZE) - .to_sql - end -end diff --git a/db/post_migrate/20170106142508_fill_authorized_projects.rb b/db/post_migrate/20170106142508_fill_authorized_projects.rb deleted file mode 100644 index 1f1dd0f47f0..00000000000 --- a/db/post_migrate/20170106142508_fill_authorized_projects.rb +++ /dev/null @@ -1,30 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class FillAuthorizedProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - class User < ActiveRecord::Base - self.table_name = 'users' - end - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # We're not inserting any data so we don't need to start a transaction. - disable_ddl_transaction! - - def up - relation = User.select(:id) - .where('authorized_projects_populated IS NOT TRUE') - - relation.find_in_batches(batch_size: 1_000) do |rows| - args = rows.map { |row| [row.id] } - - Sidekiq::Client.push_bulk('class' => 'AuthorizedProjectsWorker', 'args' => args) - end - end - - def down - end -end diff --git a/db/post_migrate/20170106172224_remove_project_authorizations_id_column.rb b/db/post_migrate/20170106172224_remove_project_authorizations_id_column.rb deleted file mode 100644 index 893af23465a..00000000000 --- a/db/post_migrate/20170106172224_remove_project_authorizations_id_column.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveProjectAuthorizationsIdColumn < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :project_authorizations, :id, :primary_key - end -end diff --git a/db/post_migrate/20170131214021_reset_users_authorized_projects_populated.rb b/db/post_migrate/20170131214021_reset_users_authorized_projects_populated.rb deleted file mode 100644 index 055a14ad729..00000000000 --- a/db/post_migrate/20170131214021_reset_users_authorized_projects_populated.rb +++ /dev/null @@ -1,18 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class ResetUsersAuthorizedProjectsPopulated < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # This ensures we don't lock all users for the duration of the migration. - update_column_in_batches(:users, :authorized_projects_populated, nil) - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb deleted file mode 100644 index f221dac8e20..00000000000 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ /dev/null @@ -1,41 +0,0 @@ -class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - Gitlab::Database.with_connection_pool(2) do |pool| - threads = [] - - threads << Thread.new do - pool.with_connection do |connection| - connection.execute <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'BuildsEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_builds":true}'; - SQL - end - end - - threads << Thread.new do - pool.with_connection do |connection| - connection.execute <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'PipelinesEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_pipelines":true}'; - SQL - end - end - - threads.each(&:join) - end - end - - def down - # Nothing can be done to restore the records - end -end diff --git a/db/post_migrate/20170206101007_remove_trackable_columns_from_timelogs.rb b/db/post_migrate/20170206101007_remove_trackable_columns_from_timelogs.rb deleted file mode 100644 index 14f5d0d4add..00000000000 --- a/db/post_migrate/20170206101007_remove_trackable_columns_from_timelogs.rb +++ /dev/null @@ -1,24 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveTrackableColumnsFromTimelogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - remove_column :timelogs, :trackable_id, :integer - remove_column :timelogs, :trackable_type, :string - end -end diff --git a/db/post_migrate/20170206101030_validate_foreign_keys_on_timelogs.rb b/db/post_migrate/20170206101030_validate_foreign_keys_on_timelogs.rb deleted file mode 100644 index b5a5c0f06c7..00000000000 --- a/db/post_migrate/20170206101030_validate_foreign_keys_on_timelogs.rb +++ /dev/null @@ -1,32 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ValidateForeignKeysOnTimelogs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - if Gitlab::Database.postgresql? - execute <<-EOF - ALTER TABLE timelogs VALIDATE CONSTRAINT "fk_timelogs_issues_issue_id"; - ALTER TABLE timelogs VALIDATE CONSTRAINT "fk_timelogs_merge_requests_merge_request_id"; - EOF - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170209140523_validate_foreign_keys_on_oauth_openid_requests.rb b/db/post_migrate/20170209140523_validate_foreign_keys_on_oauth_openid_requests.rb deleted file mode 100644 index 81ac4cf1373..00000000000 --- a/db/post_migrate/20170209140523_validate_foreign_keys_on_oauth_openid_requests.rb +++ /dev/null @@ -1,20 +0,0 @@ -class ValidateForeignKeysOnOauthOpenidRequests < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if Gitlab::Database.postgresql? - execute %q{ - ALTER TABLE "oauth_openid_requests" - VALIDATE CONSTRAINT "fk_oauth_openid_requests_oauth_access_grants_access_grant_id"; - } - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170211073944_disable_invalid_service_templates.rb b/db/post_migrate/20170211073944_disable_invalid_service_templates.rb deleted file mode 100644 index 31234e5b086..00000000000 --- a/db/post_migrate/20170211073944_disable_invalid_service_templates.rb +++ /dev/null @@ -1,13 +0,0 @@ -class DisableInvalidServiceTemplates < ActiveRecord::Migration[4.2] - DOWNTIME = false - - class Service < ActiveRecord::Base - self.inheritance_column = nil - end - - def up - Service.where(template: true, active: true).each do |template| - template.update(active: false) unless template.valid? - end - end -end diff --git a/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb b/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb deleted file mode 100644 index c273060f8b0..00000000000 --- a/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb +++ /dev/null @@ -1,15 +0,0 @@ -class DeleteDeprecatedGitlabCiService < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - disable_statement_timeout - - execute("DELETE FROM services WHERE type = 'GitlabCiService';") - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170215200045_remove_theme_id_from_users.rb b/db/post_migrate/20170215200045_remove_theme_id_from_users.rb deleted file mode 100644 index 937fe3f57af..00000000000 --- a/db/post_migrate/20170215200045_remove_theme_id_from_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveThemeIdFromUsers < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :users, :theme_id, :integer - end -end diff --git a/db/post_migrate/20170301205640_migrate_build_events_to_pipeline_events.rb b/db/post_migrate/20170301205640_migrate_build_events_to_pipeline_events.rb deleted file mode 100644 index c2d28d79491..00000000000 --- a/db/post_migrate/20170301205640_migrate_build_events_to_pipeline_events.rb +++ /dev/null @@ -1,86 +0,0 @@ -class MigrateBuildEventsToPipelineEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - Gitlab::Database.with_connection_pool(2) do |pool| - threads = [] - - threads << Thread.new do - pool.with_connection do |connection| - Thread.current[:foreign_key_connection] = connection - - execute(<<-SQL.strip_heredoc) - UPDATE services - SET properties = replace(properties, - 'notify_only_broken_builds', - 'notify_only_broken_pipelines') - , pipeline_events = #{true_value} - , build_events = #{false_value} - WHERE type IN - ('SlackService', 'MattermostService', 'HipchatService') - AND build_events = #{true_value}; - SQL - end - end - - threads << Thread.new do - pool.with_connection do |connection| - Thread.current[:foreign_key_connection] = connection - - execute(update_pipeline_services_sql) - end - end - - threads.each(&:join) - end - end - - def down - # Don't bother to migrate the data back - end - - def connection - # Rails memoizes connection objects, but this causes them to be shared - # amongst threads; we don't want that. - Thread.current[:foreign_key_connection] || ActiveRecord::Base.connection - end - - private - - def update_pipeline_services_sql - if Gitlab::Database.postgresql? - <<-SQL - UPDATE services - SET type = 'PipelinesEmailService' - , properties = replace(properties, - 'notify_only_broken_builds', - 'notify_only_broken_pipelines') - , pipeline_events = #{true_value} - , build_events = #{false_value} - WHERE type = 'BuildsEmailService' - AND - (SELECT 1 FROM services pipeline_services - WHERE pipeline_services.project_id = services.project_id - AND pipeline_services.type = 'PipelinesEmailService' LIMIT 1) - IS NULL; - SQL - else - <<-SQL - UPDATE services build_services - LEFT OUTER JOIN services pipeline_services - ON build_services.project_id = pipeline_services.project_id - AND pipeline_services.type = 'PipelinesEmailService' - SET build_services.type = 'PipelinesEmailService' - , build_services.properties = replace(build_services.properties, - 'notify_only_broken_builds', - 'notify_only_broken_pipelines') - , build_services.pipeline_events = #{true_value} - , build_services.build_events = #{false_value} - WHERE build_services.type = 'BuildsEmailService' - AND pipeline_services.id IS NULL; - SQL - end.strip_heredoc - end -end diff --git a/db/post_migrate/20170306170512_migrate_legacy_manual_actions.rb b/db/post_migrate/20170306170512_migrate_legacy_manual_actions.rb deleted file mode 100644 index aa12e8ac3da..00000000000 --- a/db/post_migrate/20170306170512_migrate_legacy_manual_actions.rb +++ /dev/null @@ -1,23 +0,0 @@ -class MigrateLegacyManualActions < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - disable_statement_timeout - - execute <<-EOS - UPDATE ci_builds SET status = 'manual', allow_failure = true - WHERE ci_builds.when = 'manual' AND ci_builds.status = 'skipped'; - EOS - end - - def down - disable_statement_timeout - - execute <<-EOS - UPDATE ci_builds SET status = 'skipped', allow_failure = false - WHERE ci_builds.when = 'manual' AND ci_builds.status = 'manual'; - EOS - end -end diff --git a/db/post_migrate/20170309171644_reset_relative_position_for_issue.rb b/db/post_migrate/20170309171644_reset_relative_position_for_issue.rb deleted file mode 100644 index 2cf4cf61d8f..00000000000 --- a/db/post_migrate/20170309171644_reset_relative_position_for_issue.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class ResetRelativePositionForIssue < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:issues, :relative_position, nil) do |table, query| - query.where(table[:relative_position].not_eq(nil)) - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb b/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb deleted file mode 100644 index 85c97e3687e..00000000000 --- a/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb +++ /dev/null @@ -1,79 +0,0 @@ -class RenameMoreReservedProjectNames < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - KNOWN_PATHS = %w(artifacts graphs refs badges).freeze - - def up - reserved_projects.each_slice(100) do |slice| - rename_projects(slice) - end - end - - def down - # nothing to do here - end - - private - - def reserved_projects - Project.unscoped - .includes(:namespace) - .where('EXISTS (SELECT 1 FROM namespaces WHERE projects.namespace_id = namespaces.id)') - .where('projects.path' => KNOWN_PATHS) - end - - def route_exists?(full_path) - quoted_path = ActiveRecord::Base.connection.quote_string(full_path) - - ActiveRecord::Base.connection - .select_all("SELECT id, path FROM routes WHERE path = '#{quoted_path}'").present? - end - - # Adds number to the end of the path that is not taken by other route - def rename_path(namespace_path, path_was) - counter = 0 - path = "#{path_was}#{counter}" - - while route_exists?("#{namespace_path}/#{path}") - counter += 1 - path = "#{path_was}#{counter}" - end - - path - end - - def rename_projects(projects) - projects.each do |project| - id = project.id - path_was = project.path - namespace_path = project.namespace.path - path = rename_path(namespace_path, path_was) - - begin - # Because project path update is quite complex operation we can't safely - # copy-paste all code from GitLab. As exception we use Rails code here - if rename_project_row(project, path) - after_rename_service(project, path_was, namespace_path).execute - end - rescue Exception => e # rubocop: disable Lint/RescueException - Rails.logger.error "Exception when renaming project #{id}: #{e.message}" - end - end - end - - def rename_project_row(project, path) - project.respond_to?(:update_attributes) && - project.update(path: path) && - defined?(Projects::AfterRenameService) - end - - def after_rename_service(project, path_was, namespace_path) - AfterRenameService.new( - project, - path_before: path_was, - full_path_before: "#{namespace_path}/#{path_was}" - ).execute - end -end diff --git a/db/post_migrate/20170317162059_update_upload_paths_to_system.rb b/db/post_migrate/20170317162059_update_upload_paths_to_system.rb deleted file mode 100644 index 99cdca465e2..00000000000 --- a/db/post_migrate/20170317162059_update_upload_paths_to_system.rb +++ /dev/null @@ -1,57 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class UpdateUploadPathsToSystem < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - AFFECTED_MODELS = %w(User Project Note Namespace Appearance) - - disable_ddl_transaction! - - def up - update_column_in_batches(:uploads, :path, replace_sql(arel_table[:path], base_directory, new_upload_dir)) do |_table, query| - query.where(uploads_to_switch_to_new_path) - end - end - - def down - update_column_in_batches(:uploads, :path, replace_sql(arel_table[:path], new_upload_dir, base_directory)) do |_table, query| - query.where(uploads_to_switch_to_old_path) - end - end - - # "SELECT \"uploads\".* FROM \"uploads\" WHERE \"uploads\".\"model_type\" IN ('User', 'Project', 'Note', 'Namespace', 'Appearance') AND (\"uploads\".\"path\" ILIKE 'uploads/%' AND NOT (\"uploads\".\"path\" ILIKE 'uploads/system/%'))" - def uploads_to_switch_to_new_path - affected_uploads.and(starting_with_base_directory).and(starting_with_new_upload_directory.not) - end - - # "SELECT \"uploads\".* FROM \"uploads\" WHERE \"uploads\".\"model_type\" IN ('User', 'Project', 'Note', 'Namespace', 'Appearance') AND (\"uploads\".\"path\" ILIKE 'uploads/%' AND \"uploads\".\"path\" ILIKE 'uploads/system/%')" - def uploads_to_switch_to_old_path - affected_uploads.and(starting_with_new_upload_directory) - end - - def starting_with_base_directory - arel_table[:path].matches("#{base_directory}/%") - end - - def starting_with_new_upload_directory - arel_table[:path].matches("#{new_upload_dir}/%") - end - - def affected_uploads - arel_table[:model_type].in(AFFECTED_MODELS) - end - - def base_directory - "uploads" - end - - def new_upload_dir - File.join(base_directory, "-", "system") - end - - def arel_table - Arel::Table.new(:uploads) - end -end diff --git a/db/post_migrate/20170324160416_migrate_user_activities_to_users_last_activity_on.rb b/db/post_migrate/20170324160416_migrate_user_activities_to_users_last_activity_on.rb deleted file mode 100644 index 61a5c364b2f..00000000000 --- a/db/post_migrate/20170324160416_migrate_user_activities_to_users_last_activity_on.rb +++ /dev/null @@ -1,88 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class MigrateUserActivitiesToUsersLastActivityOn < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - USER_ACTIVITY_SET_KEY = 'user/activities'.freeze - ACTIVITIES_PER_PAGE = 100 - TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED = Time.utc(2016, 12, 1) - - def up - return if activities_count(TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED, Time.now).zero? - - day = Time.at(activities(TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED, Time.now).first.second) - - transaction do - while day <= Time.now.utc.tomorrow - persist_last_activity_on(day: day) - day = day.tomorrow - end - end - end - - def down - # This ensures we don't lock all users for the duration of the migration. - update_column_in_batches(:users, :last_activity_on, nil) do |table, query| - query.where(table[:last_activity_on].not_eq(nil)) - end - end - - private - - def persist_last_activity_on(day:, page: 1) - activities_count = activities_count(day.at_beginning_of_day, day.at_end_of_day) - - return if activities_count.zero? - - activities = activities(day.at_beginning_of_day, day.at_end_of_day, page: page) - - update_sql = - Arel::UpdateManager.new - .table(users_table) - .set(users_table[:last_activity_on] => day.to_date) - .where(users_table[:username].in(activities.map(&:first))) - .to_sql - - connection.exec_update(update_sql, self.class.name, []) - - unless last_page?(page, activities_count) - persist_last_activity_on(day: day, page: page + 1) - end - end - - def users_table - @users_table ||= Arel::Table.new(:users) - end - - def activities(from, to, page: 1) - Gitlab::Redis::SharedState.with do |redis| - redis.zrangebyscore(USER_ACTIVITY_SET_KEY, from.to_i, to.to_i, - with_scores: true, - limit: limit(page)) - end - end - - def activities_count(from, to) - Gitlab::Redis::SharedState.with do |redis| - redis.zcount(USER_ACTIVITY_SET_KEY, from.to_i, to.to_i) - end - end - - def limit(page) - [offset(page), ACTIVITIES_PER_PAGE] - end - - def total_pages(count) - (count.to_f / ACTIVITIES_PER_PAGE).ceil - end - - def last_page?(page, count) - page >= total_pages(count) - end - - def offset(page) - (page - 1) * ACTIVITIES_PER_PAGE - end -end diff --git a/db/post_migrate/20170404170532_remove_notes_original_discussion_id.rb b/db/post_migrate/20170404170532_remove_notes_original_discussion_id.rb deleted file mode 100644 index 334742f04e4..00000000000 --- a/db/post_migrate/20170404170532_remove_notes_original_discussion_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveNotesOriginalDiscussionId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def change - remove_column :notes, :original_discussion_id, :string - end -end diff --git a/db/post_migrate/20170406111121_clean_upload_symlinks.rb b/db/post_migrate/20170406111121_clean_upload_symlinks.rb deleted file mode 100644 index 5fec00aa198..00000000000 --- a/db/post_migrate/20170406111121_clean_upload_symlinks.rb +++ /dev/null @@ -1,53 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanUploadSymlinks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - DIRECTORIES_TO_MOVE = %w(user project note group appearance) - - def up - return unless file_storage? - - DIRECTORIES_TO_MOVE.each do |dir| - symlink_location = File.join(old_upload_dir, dir) - next unless File.symlink?(symlink_location) - - say "removing symlink: #{symlink_location}" - FileUtils.rm(symlink_location) - end - end - - def down - return unless file_storage? - - DIRECTORIES_TO_MOVE.each do |dir| - symlink = File.join(old_upload_dir, dir) - destination = File.join(new_upload_dir, dir) - - next if File.directory?(symlink) - next unless File.directory?(destination) - - say "Creating symlink #{symlink} -> #{destination}" - FileUtils.ln_s(destination, symlink) - end - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end - - def base_directory - Rails.root - end - - def old_upload_dir - File.join(base_directory, "public", "uploads") - end - - def new_upload_dir - File.join(base_directory, "public", "uploads", "-", "system") - end -end diff --git a/db/post_migrate/20170406142253_migrate_user_project_view.rb b/db/post_migrate/20170406142253_migrate_user_project_view.rb deleted file mode 100644 index 3601baba787..00000000000 --- a/db/post_migrate/20170406142253_migrate_user_project_view.rb +++ /dev/null @@ -1,22 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateUserProjectView < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:users, :project_view, 2) do |table, query| - query.where(table[:project_view].eq(0)) - end - end - - def down - # Nothing can be done to restore old values - end -end diff --git a/db/post_migrate/20170408033905_remove_old_cache_directories.rb b/db/post_migrate/20170408033905_remove_old_cache_directories.rb deleted file mode 100644 index 22bc5b9db7b..00000000000 --- a/db/post_migrate/20170408033905_remove_old_cache_directories.rb +++ /dev/null @@ -1,23 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -# Remove all files from old custom carrierwave's cache directories. -# See https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9466 - -class RemoveOldCacheDirectories < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # FileUploader cache. - FileUtils.rm_rf(Dir[Rails.root.join('public', 'uploads', 'tmp', '*')]) - end - - def down - # Old cache is not supposed to be recoverable. - # So the down method is empty. - end -end diff --git a/db/post_migrate/20170412174900_rename_reserved_dynamic_paths.rb b/db/post_migrate/20170412174900_rename_reserved_dynamic_paths.rb deleted file mode 100644 index c9ff91b0401..00000000000 --- a/db/post_migrate/20170412174900_rename_reserved_dynamic_paths.rb +++ /dev/null @@ -1,62 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameReservedDynamicPaths < ActiveRecord::Migration[4.2] - include Gitlab::Database::RenameReservedPathsMigration::V1 - - DOWNTIME = false - - disable_ddl_transaction! - - DISALLOWED_ROOT_PATHS = %w[ - - - abuse_reports - api - autocomplete - explore - health_check - import - invites - jwt - koding - member - notification_settings - oauth - sent_notifications - unicorn_test - uploads - users - ] - - DISALLOWED_WILDCARD_PATHS = %w[ - environments/folders - gitlab-lfs/objects - info/lfs/objects - ] - - DISSALLOWED_GROUP_PATHS = %w[ - activity - analytics - audit_events - avatar - group_members - hooks - labels - ldap - ldap_group_links - milestones - notification_setting - pipeline_quota - subgroups - ] - - def up - rename_root_paths(DISALLOWED_ROOT_PATHS) - rename_wildcard_paths(DISALLOWED_WILDCARD_PATHS) - rename_child_paths(DISSALLOWED_GROUP_PATHS) - end - - def down - # nothing to do - end -end diff --git a/db/post_migrate/20170425121605_migrate_trigger_schedules_to_pipeline_schedules.rb b/db/post_migrate/20170425121605_migrate_trigger_schedules_to_pipeline_schedules.rb deleted file mode 100644 index 99ded277277..00000000000 --- a/db/post_migrate/20170425121605_migrate_trigger_schedules_to_pipeline_schedules.rb +++ /dev/null @@ -1,48 +0,0 @@ -class MigrateTriggerSchedulesToPipelineSchedules < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - connection.execute <<~SQL - DELETE FROM ci_trigger_schedules WHERE NOT EXISTS - (SELECT true FROM projects - WHERE ci_trigger_schedules.project_id = projects.id - ) - SQL - - connection.execute <<-SQL - INSERT INTO ci_pipeline_schedules ( - project_id, - created_at, - updated_at, - deleted_at, - cron, - cron_timezone, - next_run_at, - ref, - active, - owner_id, - description - ) - SELECT - ci_trigger_schedules.project_id, - ci_trigger_schedules.created_at, - ci_trigger_schedules.updated_at, - ci_trigger_schedules.deleted_at, - ci_trigger_schedules.cron, - ci_trigger_schedules.cron_timezone, - ci_trigger_schedules.next_run_at, - ci_trigger_schedules.ref, - ci_trigger_schedules.active, - ci_triggers.owner_id, - ci_triggers.description - FROM ci_trigger_schedules - INNER JOIN ci_triggers ON ci_trigger_schedules.trigger_id=ci_triggers.id; - SQL - end - - def down - # no op as the data has been removed - end -end diff --git a/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb b/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb deleted file mode 100644 index 9d515aca8b4..00000000000 --- a/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb +++ /dev/null @@ -1,32 +0,0 @@ -class DropCiTriggerSchedulesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - drop_table :ci_trigger_schedules - end - - def down - create_table "ci_trigger_schedules", force: :cascade do |t| - t.integer "project_id" - t.integer "trigger_id", null: false - t.datetime "deleted_at" - t.datetime "created_at" - t.datetime "updated_at" - t.string "cron" - t.string "cron_timezone" - t.datetime "next_run_at" - t.string "ref" - t.boolean "active" - end - - add_index "ci_trigger_schedules", %w(active next_run_at), name: "index_ci_trigger_schedules_on_active_and_next_run_at", using: :btree - add_index "ci_trigger_schedules", ["project_id"], name: "index_ci_trigger_schedules_on_project_id", using: :btree - add_index "ci_trigger_schedules", ["next_run_at"], name: "index_ci_trigger_schedules_on_next_run_at" - - add_concurrent_foreign_key "ci_trigger_schedules", "ci_triggers", column: :trigger_id, on_delete: :cascade - end -end diff --git a/db/post_migrate/20170502070007_enable_auto_cancel_pending_pipelines_for_all.rb b/db/post_migrate/20170502070007_enable_auto_cancel_pending_pipelines_for_all.rb deleted file mode 100644 index 4d091d7f275..00000000000 --- a/db/post_migrate/20170502070007_enable_auto_cancel_pending_pipelines_for_all.rb +++ /dev/null @@ -1,19 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# rubocop:disable Migration/UpdateColumnInBatches -class EnableAutoCancelPendingPipelinesForAll < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - - def up - disable_statement_timeout do - update_column_in_batches(:projects, :auto_cancel_pending_pipelines, 1) - end - end - - def down - # Nothing we can do! - end -end diff --git a/db/post_migrate/20170503004427_update_retried_for_ci_build.rb b/db/post_migrate/20170503004427_update_retried_for_ci_build.rb deleted file mode 100644 index 596f8593308..00000000000 --- a/db/post_migrate/20170503004427_update_retried_for_ci_build.rb +++ /dev/null @@ -1,69 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class UpdateRetriedForCiBuild < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if Gitlab::Database.mysql? - up_mysql - else - disable_statement_timeout do - up_postgres - end - end - end - - def down - end - - private - - def up_mysql - # This is a trick to overcome MySQL limitation: - # Mysql2::Error: Table 'ci_builds' is specified twice, both as a target for 'UPDATE' and as a separate source for data - # However, this leads to create a temporary table from `max(ci_builds.id)` which is slow and do full database update - execute <<-SQL.strip_heredoc - UPDATE ci_builds SET retried= - (id NOT IN ( - SELECT * FROM (SELECT MAX(ci_builds.id) FROM ci_builds GROUP BY commit_id, name) AS latest_jobs - )) - WHERE retried IS NULL - SQL - end - - def up_postgres - with_temporary_partial_index do - latest_id = <<-SQL.strip_heredoc - SELECT MAX(ci_builds2.id) - FROM ci_builds ci_builds2 - WHERE ci_builds.commit_id=ci_builds2.commit_id - AND ci_builds.name=ci_builds2.name - SQL - - # This is slow update as it does single-row query - # This is designed to be run as idle, or a post deployment migration - is_retried = Arel.sql("((#{latest_id}) != ci_builds.id)") - - update_column_in_batches(:ci_builds, :retried, is_retried) do |table, query| - query.where(table[:retried].eq(nil)) - end - end - end - - def with_temporary_partial_index - if Gitlab::Database.postgresql? - unless index_exists?(:ci_builds, :id, name: :index_for_ci_builds_retried_migration) - execute 'CREATE INDEX CONCURRENTLY index_for_ci_builds_retried_migration ON ci_builds (id) WHERE retried IS NULL;' - end - end - - yield - - if Gitlab::Database.postgresql? && index_exists?(:ci_builds, :id, name: :index_for_ci_builds_retried_migration) - execute 'DROP INDEX CONCURRENTLY index_for_ci_builds_retried_migration' - end - end -end diff --git a/db/post_migrate/20170503120310_remove_users_authorized_projects_populated.rb b/db/post_migrate/20170503120310_remove_users_authorized_projects_populated.rb deleted file mode 100644 index 891ce44f60a..00000000000 --- a/db/post_migrate/20170503120310_remove_users_authorized_projects_populated.rb +++ /dev/null @@ -1,15 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveUsersAuthorizedProjectsPopulated < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - disable_ddl_transaction! - - def change - remove_column :users, :authorized_projects_populated, :boolean - end -end diff --git a/db/post_migrate/20170508170547_add_head_pipeline_for_each_merge_request.rb b/db/post_migrate/20170508170547_add_head_pipeline_for_each_merge_request.rb deleted file mode 100644 index 6e7365f4c56..00000000000 --- a/db/post_migrate/20170508170547_add_head_pipeline_for_each_merge_request.rb +++ /dev/null @@ -1,28 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class AddHeadPipelineForEachMergeRequest < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - pipelines = Arel::Table.new(:ci_pipelines) - merge_requests = Arel::Table.new(:merge_requests) - - disable_statement_timeout do - head_id = pipelines - .project(Arel::Nodes::NamedFunction.new('max', [pipelines[:id]])) - .from(pipelines) - .where(pipelines[:ref].eq(merge_requests[:source_branch])) - .where(pipelines[:project_id].eq(merge_requests[:source_project_id])) - - sub_query = Arel::Nodes::SqlLiteral.new(Arel::Nodes::Grouping.new(head_id).to_sql) - - update_column_in_batches(:merge_requests, :head_pipeline_id, sub_query) - end - end - - def down - end -end diff --git a/db/post_migrate/20170510101043_add_foreign_key_on_pipeline_schedule_owner.rb b/db/post_migrate/20170510101043_add_foreign_key_on_pipeline_schedule_owner.rb deleted file mode 100644 index 85586aecd54..00000000000 --- a/db/post_migrate/20170510101043_add_foreign_key_on_pipeline_schedule_owner.rb +++ /dev/null @@ -1,35 +0,0 @@ -class AddForeignKeyOnPipelineScheduleOwner < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - execute <<-SQL - UPDATE ci_pipeline_schedules - SET owner_id = NULL - WHERE NOT EXISTS ( - SELECT true - FROM users - WHERE ci_pipeline_schedules.owner_id = users.id - ) - SQL - - add_concurrent_foreign_key(:ci_pipeline_schedules, :users, column: :owner_id, on_delete: on_delete) - end - - def down - remove_foreign_key(:ci_pipeline_schedules, column: :owner_id) - end - - private - - def on_delete - if Gitlab::Database.mysql? - :nullify - else - 'SET NULL' - end - end -end diff --git a/db/post_migrate/20170511100900_cleanup_rename_web_hooks_build_events_to_job_events.rb b/db/post_migrate/20170511100900_cleanup_rename_web_hooks_build_events_to_job_events.rb deleted file mode 100644 index b4a3db65607..00000000000 --- a/db/post_migrate/20170511100900_cleanup_rename_web_hooks_build_events_to_job_events.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupRenameWebHooksBuildEventsToJobEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_rename :web_hooks, :build_events, :job_events - end - - def down - rename_column_concurrently :web_hooks, :job_events, :build_events - end -end diff --git a/db/post_migrate/20170511101000_cleanup_rename_services_build_events_to_job_events.rb b/db/post_migrate/20170511101000_cleanup_rename_services_build_events_to_job_events.rb deleted file mode 100644 index 65342747321..00000000000 --- a/db/post_migrate/20170511101000_cleanup_rename_services_build_events_to_job_events.rb +++ /dev/null @@ -1,18 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupRenameServicesBuildEventsToJobEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_rename :services, :build_events, :job_events - end - - def down - rename_column_concurrently :services, :job_events, :build_events - end -end diff --git a/db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb b/db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb deleted file mode 100644 index affeba52250..00000000000 --- a/db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb +++ /dev/null @@ -1,39 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupTriggerForIssues < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - def up - if Gitlab::Database.postgresql? - execute <<-EOF - DROP TRIGGER IF EXISTS replicate_assignee_id ON issues; - DROP FUNCTION IF EXISTS replicate_assignee_id(); - EOF - end - end - - def down - end -end diff --git a/db/post_migrate/20170516181025_add_constraints_to_issue_assignees_table.rb b/db/post_migrate/20170516181025_add_constraints_to_issue_assignees_table.rb deleted file mode 100644 index 03456a31b0d..00000000000 --- a/db/post_migrate/20170516181025_add_constraints_to_issue_assignees_table.rb +++ /dev/null @@ -1,37 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class AddConstraintsToIssueAssigneesTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - - def up - change_column_null :issue_assignees, :issue_id, false - change_column_null :issue_assignees, :user_id, false - end - - def down - change_column_null :issue_assignees, :issue_id, true - change_column_null :issue_assignees, :user_id, true - end -end diff --git a/db/post_migrate/20170518200835_rename_users_with_renamed_namespace.rb b/db/post_migrate/20170518200835_rename_users_with_renamed_namespace.rb deleted file mode 100644 index 4ba78727cc3..00000000000 --- a/db/post_migrate/20170518200835_rename_users_with_renamed_namespace.rb +++ /dev/null @@ -1,51 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameUsersWithRenamedNamespace < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - DISALLOWED_ROOT_PATHS = %w[ - abuse_reports - api - autocomplete - explore - health_check - import - invites - jwt - koding - member - notification_settings - oauth - sent_notifications - unicorn_test - uploads - users - ] - - def up - DISALLOWED_ROOT_PATHS.each do |path| - users = Arel::Table.new(:users) - namespaces = Arel::Table.new(:namespaces) - predicate = namespaces[:owner_id].eq(users[:id]) - .and(namespaces[:type].eq(nil)) - .and(users[:username].matches(path)) - - update_sql = if Gitlab::Database.postgresql? - "UPDATE users SET username = namespaces.path "\ - "FROM namespaces WHERE #{predicate.to_sql}" - else - "UPDATE users INNER JOIN namespaces "\ - "ON namespaces.owner_id = users.id "\ - "SET username = namespaces.path "\ - "WHERE #{predicate.to_sql}" - end - - connection.execute(update_sql) - end - end - - def down - end -end diff --git a/db/post_migrate/20170518231126_fix_wrongly_renamed_routes.rb b/db/post_migrate/20170518231126_fix_wrongly_renamed_routes.rb deleted file mode 100644 index 28a2a2e01bf..00000000000 --- a/db/post_migrate/20170518231126_fix_wrongly_renamed_routes.rb +++ /dev/null @@ -1,105 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class FixWronglyRenamedRoutes < ActiveRecord::Migration[4.2] - include Gitlab::Database::RenameReservedPathsMigration::V1 - - DOWNTIME = false - - disable_ddl_transaction! - - DISALLOWED_ROOT_PATHS = %w[ - - - abuse_reports - api - autocomplete - explore - health_check - import - invites - jwt - koding - member - notification_settings - oauth - sent_notifications - unicorn_test - uploads - users - ] - - FIXED_PATHS = DISALLOWED_ROOT_PATHS.map { |p| "#{p}0" } - - class Route < Gitlab::Database::RenameReservedPathsMigration::V1::MigrationClasses::Route - self.table_name = 'routes' - end - - def routes - @routes ||= Route.arel_table - end - - def namespaces - @namespaces ||= Arel::Table.new(:namespaces) - end - - def wildcard_collection(collection) - collection.map { |word| "#{word}%" } - end - - # The routes that got incorrectly renamed before, still have a namespace that - # contains the correct path. - # This query fetches all rows from the `routes` table that meet the following - # conditions using `api` as an example: - # - route.path ILIKE `api0%` - # - route.source_type = `Namespace` - # - namespace.parent_id IS NULL - # - namespace.path ILIKE `api%` - # - NOT(namespace.path ILIKE `api0%`) - # This gives us all root-routes, that were renamed, but their namespace was not. - # - def wrongly_renamed - Route.joins("INNER JOIN namespaces ON routes.source_id = namespaces.id") - .where( - routes[:source_type].eq('Namespace') - .and(namespaces[:parent_id].eq(nil)) - ) - .where(namespaces[:path].matches_any(wildcard_collection(DISALLOWED_ROOT_PATHS))) - .where.not(namespaces[:path].matches_any(wildcard_collection(FIXED_PATHS))) - .where(routes[:path].matches_any(wildcard_collection(FIXED_PATHS))) - end - - # Using the query above, we just fetch the `route.path` & the `namespace.path` - # `route.path` is the part of the route that is now incorrect - # `namespace.path` is what it should be - # We can use `route.path` to find all the namespaces that need to be fixed - # And we can use `namespace.path` to apply the correct name. - # - def paths_and_corrections - connection.select_all( - wrongly_renamed.select(routes[:path], namespaces[:path].as('namespace_path')).to_sql - ) - end - - # This can be used to limit the `update_in_batches` call to all routes for a - # single namespace, note the `/` that's what went wrong in the initial migration. - # - def routes_in_namespace_query(namespace) - routes[:path].matches_any([namespace, "#{namespace}/%"]) - end - - def up - paths_and_corrections.each do |root_namespace| - wrong_path = root_namespace['path'] - correct_path = root_namespace['namespace_path'] - replace_statement = replace_sql(Route.arel_table[:path], wrong_path, correct_path) - - update_column_in_batches(:routes, :path, replace_statement) do |table, query| - query.where(routes_in_namespace_query(wrong_path)) - end - end - end - - def down - end -end diff --git a/db/post_migrate/20170523073948_remove_assignee_id_from_issue.rb b/db/post_migrate/20170523073948_remove_assignee_id_from_issue.rb deleted file mode 100644 index d75bbb2f612..00000000000 --- a/db/post_migrate/20170523073948_remove_assignee_id_from_issue.rb +++ /dev/null @@ -1,48 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveAssigneeIdFromIssue < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index", "remove_concurrent_index" or - # "add_column_with_default" you must disable the use of transactions - # as these methods can not run in an existing transaction. - # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure - # that either of them is the _only_ method called in the migration, - # any other changes should go in a separate migration. - # This ensures that upon failure _only_ the index creation or removing fails - # and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - self.table_name = 'issues' - - include ::EachBatch - end - - def up - remove_column :issues, :assignee_id - end - - def down - add_column :issues, :assignee_id, :integer - add_concurrent_index :issues, :assignee_id - - update_value = Arel.sql('(SELECT user_id FROM issue_assignees WHERE issue_assignees.issue_id = issues.id LIMIT 1)') - - # This is only used in the down step, so we can ignore the RuboCop warning - # about large tables, as this is very unlikely to be run on GitLab.com - update_column_in_batches(:issues, :assignee_id, update_value) # rubocop:disable Migration/UpdateLargeTable - end -end diff --git a/db/post_migrate/20170523083112_migrate_old_artifacts.rb b/db/post_migrate/20170523083112_migrate_old_artifacts.rb deleted file mode 100644 index 55e155c7619..00000000000 --- a/db/post_migrate/20170523083112_migrate_old_artifacts.rb +++ /dev/null @@ -1,72 +0,0 @@ -class MigrateOldArtifacts < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - # This uses special heuristic to find potential candidates for data migration - # Read more about this here: https://gitlab.com/gitlab-org/gitlab-ce/issues/32036#note_30422345 - - def up - builds_with_artifacts.find_each do |build| - build.migrate_artifacts! - end - end - - def down - end - - private - - def builds_with_artifacts - Build.with_artifacts - .joins('JOIN projects ON projects.id = ci_builds.project_id') - .where('ci_builds.id < ?', min_id) - .where('projects.ci_id IS NOT NULL') - .select('id', 'created_at', 'project_id', 'projects.ci_id AS ci_id') - end - - def min_id - Build.joins('JOIN projects ON projects.id = ci_builds.project_id') - .where('projects.ci_id IS NULL') - .pluck('coalesce(min(ci_builds.id), 0)') - .first - end - - class Build < ActiveRecord::Base - self.table_name = 'ci_builds' - - scope :with_artifacts, -> { where.not(artifacts_file: [nil, '']) } - - def migrate_artifacts! - return unless File.exist?(source_artifacts_path) - return if File.exist?(target_artifacts_path) - - ensure_target_path - - FileUtils.move(source_artifacts_path, target_artifacts_path) - end - - private - - def source_artifacts_path - @source_artifacts_path ||= - File.join(Gitlab.config.artifacts.path, - created_at.utc.strftime('%Y_%m'), - ci_id.to_s, id.to_s) - end - - def target_artifacts_path - @target_artifacts_path ||= - File.join(Gitlab.config.artifacts.path, - created_at.utc.strftime('%Y_%m'), - project_id.to_s, id.to_s) - end - - def ensure_target_path - directory = File.dirname(target_artifacts_path) - FileUtils.mkdir_p(directory) unless Dir.exist?(directory) - end - end -end diff --git a/db/post_migrate/20170525140254_rename_all_reserved_paths_again.rb b/db/post_migrate/20170525140254_rename_all_reserved_paths_again.rb deleted file mode 100644 index 59b8daaffdf..00000000000 --- a/db/post_migrate/20170525140254_rename_all_reserved_paths_again.rb +++ /dev/null @@ -1,102 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RenameAllReservedPathsAgain < ActiveRecord::Migration[4.2] - include Gitlab::Database::RenameReservedPathsMigration::V1 - - DOWNTIME = false - - disable_ddl_transaction! - - TOP_LEVEL_ROUTES = %w[ - - - .well-known - abuse_reports - admin - api - assets - autocomplete - ci - dashboard - explore - files - groups - health_check - help - import - invites - jwt - koding - notification_settings - oauth - profile - projects - public - robots.txt - s - search - sent_notifications - snippets - u - unicorn_test - unsubscribes - uploads - users - ].freeze - - PROJECT_WILDCARD_ROUTES = %w[ - badges - blame - blob - builds - commits - create - create_dir - edit - environments/folders - files - find_file - gitlab-lfs/objects - info/lfs/objects - new - preview - raw - refs - tree - update - wikis - ].freeze - - GROUP_ROUTES = %w[ - activity - analytics - audit_events - avatar - edit - group_members - hooks - issues - labels - ldap - ldap_group_links - merge_requests - milestones - notification_setting - pipeline_quota - projects - ].freeze - - def up - disable_statement_timeout do - TOP_LEVEL_ROUTES.each { |route| rename_root_paths(route) } - PROJECT_WILDCARD_ROUTES.each { |route| rename_wildcard_paths(route) } - GROUP_ROUTES.each { |route| rename_child_paths(route) } - end - end - - def down - disable_statement_timeout do - revert_renames - end - end -end diff --git a/db/post_migrate/20170526185842_migrate_pipeline_stages.rb b/db/post_migrate/20170526185842_migrate_pipeline_stages.rb deleted file mode 100644 index 53743fc16e6..00000000000 --- a/db/post_migrate/20170526185842_migrate_pipeline_stages.rb +++ /dev/null @@ -1,22 +0,0 @@ -class MigratePipelineStages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - disable_statement_timeout do - execute <<-SQL.strip_heredoc - INSERT INTO ci_stages (project_id, pipeline_id, name) - SELECT project_id, commit_id, stage FROM ci_builds - WHERE stage IS NOT NULL - AND stage_id IS NULL - AND EXISTS (SELECT 1 FROM projects WHERE projects.id = ci_builds.project_id) - AND EXISTS (SELECT 1 FROM ci_pipelines WHERE ci_pipelines.id = ci_builds.commit_id) - GROUP BY project_id, commit_id, stage - ORDER BY MAX(stage_idx) - SQL - end - end -end diff --git a/db/post_migrate/20170526185858_create_index_in_pipeline_stages.rb b/db/post_migrate/20170526185858_create_index_in_pipeline_stages.rb deleted file mode 100644 index dc7b1d6d026..00000000000 --- a/db/post_migrate/20170526185858_create_index_in_pipeline_stages.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateIndexInPipelineStages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:ci_stages, [:pipeline_id, :name]) - end - - def down - remove_concurrent_index(:ci_stages, [:pipeline_id, :name]) - end -end diff --git a/db/post_migrate/20170526185901_remove_stage_id_index_from_builds.rb b/db/post_migrate/20170526185901_remove_stage_id_index_from_builds.rb deleted file mode 100644 index de473e7bb91..00000000000 --- a/db/post_migrate/20170526185901_remove_stage_id_index_from_builds.rb +++ /dev/null @@ -1,18 +0,0 @@ -class RemoveStageIdIndexFromBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if index_exists?(:ci_builds, :stage_id) - remove_foreign_key(:ci_builds, column: :stage_id) - remove_concurrent_index(:ci_builds, :stage_id) - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170526185921_migrate_build_stage_reference.rb b/db/post_migrate/20170526185921_migrate_build_stage_reference.rb deleted file mode 100644 index a9b392314fa..00000000000 --- a/db/post_migrate/20170526185921_migrate_build_stage_reference.rb +++ /dev/null @@ -1,19 +0,0 @@ -class MigrateBuildStageReference < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - ## - # This is an empty migration, content has been moved to a new one: - # post migrate 20170526190000 MigrateBuildStageReferenceAgain - # - # See gitlab-org/gitlab-ce!12337 for more details. - - def up - # noop - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170526190000_migrate_build_stage_reference_again.rb b/db/post_migrate/20170526190000_migrate_build_stage_reference_again.rb deleted file mode 100644 index 01b6cf3a158..00000000000 --- a/db/post_migrate/20170526190000_migrate_build_stage_reference_again.rb +++ /dev/null @@ -1,28 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class MigrateBuildStageReferenceAgain < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - stage_id = Arel.sql <<-SQL.strip_heredoc - (SELECT id FROM ci_stages - WHERE ci_stages.pipeline_id = ci_builds.commit_id - AND ci_stages.name = ci_builds.stage) - SQL - - disable_statement_timeout do - update_column_in_batches(:ci_builds, :stage_id, stage_id) do |table, query| - query.where(table[:stage_id].eq(nil)) - end - end - end - - def down - disable_statement_timeout do - update_column_in_batches(:ci_builds, :stage_id, nil) - end - end -end diff --git a/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb b/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb deleted file mode 100644 index 3d75c7e3eaf..00000000000 --- a/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CleanupUsersLdapEmailRename < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_rename :users, :ldap_email, :external_email - end - - def down - # rubocop:disable Migration/UpdateLargeTable - rename_column_concurrently :users, :external_email, :ldap_email - end -end diff --git a/db/post_migrate/20170606202615_move_appearance_to_system_dir.rb b/db/post_migrate/20170606202615_move_appearance_to_system_dir.rb deleted file mode 100644 index fb9ac8d6daf..00000000000 --- a/db/post_migrate/20170606202615_move_appearance_to_system_dir.rb +++ /dev/null @@ -1,57 +0,0 @@ -class MoveAppearanceToSystemDir < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - DIRECTORY_TO_MOVE = 'appearance'.freeze - - def up - source = File.join(old_upload_dir, DIRECTORY_TO_MOVE) - destination = File.join(new_upload_dir, DIRECTORY_TO_MOVE) - - move_directory(source, destination) - end - - def down - source = File.join(new_upload_dir, DIRECTORY_TO_MOVE) - destination = File.join(old_upload_dir, DIRECTORY_TO_MOVE) - - move_directory(source, destination) - end - - def move_directory(source, destination) - unless file_storage? - say 'Not using file storage, skipping' - return - end - - unless File.directory?(source) - say "#{source} did not exist, skipping" - return - end - - if File.directory?(destination) - say "#{destination} already existed, skipping" - return - end - - say "Moving #{source} -> #{destination}" - FileUtils.mv(source, destination) - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end - - def base_directory - Rails.root - end - - def old_upload_dir - File.join(base_directory, "public", "uploads") - end - - def new_upload_dir - File.join(base_directory, "public", "uploads", "-", "system") - end -end diff --git a/db/post_migrate/20170607121233_convert_custom_notification_settings_to_columns.rb b/db/post_migrate/20170607121233_convert_custom_notification_settings_to_columns.rb deleted file mode 100644 index 8ff26130cba..00000000000 --- a/db/post_migrate/20170607121233_convert_custom_notification_settings_to_columns.rb +++ /dev/null @@ -1,55 +0,0 @@ -class ConvertCustomNotificationSettingsToColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class NotificationSetting < ActiveRecord::Base - self.table_name = 'notification_settings' - - store :events, coder: JSON - end - - EMAIL_EVENTS = [ - :new_note, - :new_issue, - :reopen_issue, - :close_issue, - :reassign_issue, - :new_merge_request, - :reopen_merge_request, - :close_merge_request, - :reassign_merge_request, - :merge_merge_request, - :failed_pipeline, - :success_pipeline - ] - - # We only need to migrate (up or down) rows where at least one of these - # settings is set. - def up - NotificationSetting.where("events LIKE '%true%'").find_each do |notification_setting| - EMAIL_EVENTS.each do |event| - notification_setting[event] = notification_setting.events[event] - end - - notification_setting[:events] = nil - notification_setting.save! - end - end - - def down - NotificationSetting.where(EMAIL_EVENTS.join(' OR ')).find_each do |notification_setting| - events = {} - - EMAIL_EVENTS.each do |event| - events[event] = !!notification_setting.public_send(event) - notification_setting[event] = nil - end - - notification_setting[:events] = events - notification_setting.save! - end - end -end diff --git a/db/post_migrate/20170609183112_remove_position_from_issuables.rb b/db/post_migrate/20170609183112_remove_position_from_issuables.rb deleted file mode 100644 index edad0a502b4..00000000000 --- a/db/post_migrate/20170609183112_remove_position_from_issuables.rb +++ /dev/null @@ -1,8 +0,0 @@ -class RemovePositionFromIssuables < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def change - remove_column :issues, :position, :integer - remove_column :merge_requests, :position, :integer - end -end diff --git a/db/post_migrate/20170612071012_move_personal_snippets_files.rb b/db/post_migrate/20170612071012_move_personal_snippets_files.rb deleted file mode 100644 index d32d92637fa..00000000000 --- a/db/post_migrate/20170612071012_move_personal_snippets_files.rb +++ /dev/null @@ -1,92 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -class MovePersonalSnippetsFiles < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - return unless file_storage? - - @source_relative_location = File.join('/uploads', 'personal_snippet') - @destination_relative_location = File.join('/uploads', '-', 'system', 'personal_snippet') - - move_personal_snippet_files - end - - def down - return unless file_storage? - - @source_relative_location = File.join('/uploads', '-', 'system', 'personal_snippet') - @destination_relative_location = File.join('/uploads', 'personal_snippet') - - move_personal_snippet_files - end - - def move_personal_snippet_files - query = "SELECT uploads.path, uploads.model_id, snippets.description FROM uploads "\ - "INNER JOIN snippets ON snippets.id = uploads.model_id WHERE uploader = 'PersonalFileUploader'" - select_all(query).each do |upload| - secret = upload['path'].split('/')[0] - file_name = upload['path'].split('/')[1] - - next unless move_file(upload['model_id'], secret, file_name) - - update_markdown(upload['model_id'], secret, file_name, upload['description']) - end - end - - def move_file(snippet_id, secret, file_name) - source_dir = File.join(base_directory, @source_relative_location, snippet_id.to_s, secret) - destination_dir = File.join(base_directory, @destination_relative_location, snippet_id.to_s, secret) - - source_file_path = File.join(source_dir, file_name) - destination_file_path = File.join(destination_dir, file_name) - - unless File.exist?(source_file_path) - say "Source file `#{source_file_path}` doesn't exist. Skipping." - return - end - - say "Moving file #{source_file_path} -> #{destination_file_path}" - - FileUtils.mkdir_p(destination_dir) - FileUtils.move(source_file_path, destination_file_path) - - true - end - - def update_markdown(snippet_id, secret, file_name, description) - source_markdown_path = File.join(@source_relative_location, snippet_id.to_s, secret, file_name) - destination_markdown_path = File.join(@destination_relative_location, snippet_id.to_s, secret, file_name) - - source_markdown = "](#{source_markdown_path})" - destination_markdown = "](#{destination_markdown_path})" - - if description.present? - description = description.gsub(source_markdown, destination_markdown) - quoted_description = quote_string(description) - - execute("UPDATE snippets SET description = '#{quoted_description}', description_html = NULL "\ - "WHERE id = #{snippet_id}") - end - - query = "SELECT id, note FROM notes WHERE noteable_id = #{snippet_id} "\ - "AND noteable_type = 'Snippet' AND note IS NOT NULL" - select_all(query).each do |note| - text = note['note'].gsub(source_markdown, destination_markdown) - quoted_text = quote_string(text) - - execute("UPDATE notes SET note = '#{quoted_text}', note_html = NULL WHERE id = #{note['id']}") - end - end - - def base_directory - File.join(Rails.root, 'public') - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end -end diff --git a/db/post_migrate/20170613111224_clean_appearance_symlinks.rb b/db/post_migrate/20170613111224_clean_appearance_symlinks.rb deleted file mode 100644 index 14511bff3db..00000000000 --- a/db/post_migrate/20170613111224_clean_appearance_symlinks.rb +++ /dev/null @@ -1,53 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanAppearanceSymlinks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - - def up - return unless file_storage? - - symlink_location = File.join(old_upload_dir, dir) - - return unless File.symlink?(symlink_location) - - say "removing symlink: #{symlink_location}" - FileUtils.rm(symlink_location) - end - - def down - return unless file_storage? - - symlink = File.join(old_upload_dir, dir) - destination = File.join(new_upload_dir, dir) - - return if File.directory?(symlink) - return unless File.directory?(destination) - - say "Creating symlink #{symlink} -> #{destination}" - FileUtils.ln_s(destination, symlink) - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end - - def dir - 'appearance' - end - - def base_directory - Rails.root - end - - def old_upload_dir - File.join(base_directory, "public", "uploads") - end - - def new_upload_dir - File.join(base_directory, "public", "uploads", "system") - end -end diff --git a/db/post_migrate/20170621102400_add_stage_id_index_to_builds.rb b/db/post_migrate/20170621102400_add_stage_id_index_to_builds.rb deleted file mode 100644 index cca9b488547..00000000000 --- a/db/post_migrate/20170621102400_add_stage_id_index_to_builds.rb +++ /dev/null @@ -1,17 +0,0 @@ -class AddStageIdIndexToBuilds < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - ## - # Improved in 20170703102400_add_stage_id_foreign_key_to_builds.rb - # - - def up - # noop - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170627101016_schedule_event_migrations.rb b/db/post_migrate/20170627101016_schedule_event_migrations.rb deleted file mode 100644 index f026a86bc0f..00000000000 --- a/db/post_migrate/20170627101016_schedule_event_migrations.rb +++ /dev/null @@ -1,40 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class ScheduleEventMigrations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - BUFFER_SIZE = 1000 - - disable_ddl_transaction! - - class Event < ActiveRecord::Base - include EachBatch - - self.table_name = 'events' - end - - def up - jobs = [] - - Event.each_batch(of: 1000) do |relation| - min, max = relation.pluck('MIN(id), MAX(id)').first - - if jobs.length == BUFFER_SIZE - # We push multiple jobs at a time to reduce the time spent in - # Sidekiq/Redis operations. We're using this buffer based approach so we - # don't need to run additional queries for every range. - BackgroundMigrationWorker.bulk_perform_async(jobs) - jobs.clear - end - - jobs << ['MigrateEventsToPushEventPayloads', [min, max]] - end - - BackgroundMigrationWorker.bulk_perform_async(jobs) unless jobs.empty? - end - - def down - end -end diff --git a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb b/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb deleted file mode 100644 index 36aac3df071..00000000000 --- a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb +++ /dev/null @@ -1,33 +0,0 @@ -class MigrateStageIdReferenceInBackground < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - BATCH_SIZE = 10000 - RANGE_SIZE = 1000 - MIGRATION = 'MigrateBuildStageIdReference'.freeze - - disable_ddl_transaction! - - class Build < ActiveRecord::Base - self.table_name = 'ci_builds' - include ::EachBatch - end - - ## - # It will take around 3 days to process 20M ci_builds. - # - def up - Build.where(stage_id: nil).each_batch(of: BATCH_SIZE) do |relation, index| - relation.each_batch(of: RANGE_SIZE) do |relation| - range = relation.pluck('MIN(id)', 'MAX(id)').first - - BackgroundMigrationWorker - .perform_in(index * 2.minutes, MIGRATION, range) - end - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20170629180131_cleanup_application_settings_signin_enabled_rename.rb b/db/post_migrate/20170629180131_cleanup_application_settings_signin_enabled_rename.rb deleted file mode 100644 index 87268fb4b31..00000000000 --- a/db/post_migrate/20170629180131_cleanup_application_settings_signin_enabled_rename.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CleanupApplicationSettingsSigninEnabledRename < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_rename :application_settings, :signin_enabled, :password_authentication_enabled - end - - def down - rename_column_concurrently :application_settings, :password_authentication_enabled, :signin_enabled - end -end diff --git a/db/post_migrate/20170711145558_migrate_stages_statuses.rb b/db/post_migrate/20170711145558_migrate_stages_statuses.rb deleted file mode 100644 index 8ba69ea4dce..00000000000 --- a/db/post_migrate/20170711145558_migrate_stages_statuses.rb +++ /dev/null @@ -1,34 +0,0 @@ -class MigrateStagesStatuses < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - BATCH_SIZE = 10000 - RANGE_SIZE = 100 - MIGRATION = 'MigrateStageStatus'.freeze - - class Stage < ActiveRecord::Base - self.table_name = 'ci_stages' - include ::EachBatch - end - - def up - Stage.where(status: nil).each_batch(of: BATCH_SIZE) do |relation, index| - relation.each_batch(of: RANGE_SIZE) do |batch| - range = batch.pluck('MIN(id)', 'MAX(id)').first - delay = index * 5.minutes - - BackgroundMigrationWorker.perform_in(delay, MIGRATION, range) - end - end - end - - def down - disable_statement_timeout do - # rubocop:disable Migration/UpdateLargeTable - update_column_in_batches(:ci_stages, :status, nil) - end - end -end diff --git a/db/post_migrate/20170717111152_cleanup_move_system_upload_folder_symlink.rb b/db/post_migrate/20170717111152_cleanup_move_system_upload_folder_symlink.rb deleted file mode 100644 index 392c4f71532..00000000000 --- a/db/post_migrate/20170717111152_cleanup_move_system_upload_folder_symlink.rb +++ /dev/null @@ -1,40 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupMoveSystemUploadFolderSymlink < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if File.symlink?(old_directory) - say "Removing #{old_directory} -> #{new_directory} symlink" - FileUtils.rm(old_directory) - else - say "Symlink #{old_directory} non existent, nothing to do." - end - end - - def down - if File.directory?(new_directory) - say "Symlinking #{old_directory} -> #{new_directory}" - FileUtils.ln_s(new_directory, old_directory) unless File.exist?(old_directory) - else - say "#{new_directory} doesn't exist, skipping." - end - end - - def new_directory - File.join(base_directory, '-', 'system') - end - - def old_directory - File.join(base_directory, 'system') - end - - def base_directory - File.join(Rails.root, 'public', 'uploads') - end -end diff --git a/db/post_migrate/20170717150329_enqueue_migrate_system_uploads_to_new_folder.rb b/db/post_migrate/20170717150329_enqueue_migrate_system_uploads_to_new_folder.rb deleted file mode 100644 index fdd990ae2e5..00000000000 --- a/db/post_migrate/20170717150329_enqueue_migrate_system_uploads_to_new_folder.rb +++ /dev/null @@ -1,20 +0,0 @@ -class EnqueueMigrateSystemUploadsToNewFolder < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - OLD_FOLDER = 'uploads/system/' - NEW_FOLDER = 'uploads/-/system/' - - disable_ddl_transaction! - - def up - BackgroundMigrationWorker.perform_async('MigrateSystemUploadsToNewFolder', - [OLD_FOLDER, NEW_FOLDER]) - end - - def down - BackgroundMigrationWorker.perform_async('MigrateSystemUploadsToNewFolder', - [NEW_FOLDER, OLD_FOLDER]) - end -end diff --git a/db/post_migrate/20170719150301_merge_issuable_reopened_into_opened_state.rb b/db/post_migrate/20170719150301_merge_issuable_reopened_into_opened_state.rb deleted file mode 100644 index 7af1d04f0cc..00000000000 --- a/db/post_migrate/20170719150301_merge_issuable_reopened_into_opened_state.rb +++ /dev/null @@ -1,32 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MergeIssuableReopenedIntoOpenedState < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - self.table_name = 'issues' - - include EachBatch - end - - class MergeRequest < ActiveRecord::Base - self.table_name = 'merge_requests' - - include EachBatch - end - - def up - [Issue, MergeRequest].each do |model| - say "Changing #{model.table_name}.state from 'reopened' to 'opened'" - - model.where(state: 'reopened').each_batch do |batch| - batch.update_all(state: 'opened') - end - end - end -end diff --git a/db/post_migrate/20170728101014_remove_events_from_notification_settings.rb b/db/post_migrate/20170728101014_remove_events_from_notification_settings.rb deleted file mode 100644 index f1b0a1daec5..00000000000 --- a/db/post_migrate/20170728101014_remove_events_from_notification_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveEventsFromNotificationSettings < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :notification_settings, :events, :text - end -end diff --git a/db/post_migrate/20170803090603_calculate_conv_dev_index_percentages.rb b/db/post_migrate/20170803090603_calculate_conv_dev_index_percentages.rb deleted file mode 100644 index a148586ca89..00000000000 --- a/db/post_migrate/20170803090603_calculate_conv_dev_index_percentages.rb +++ /dev/null @@ -1,30 +0,0 @@ -class CalculateConvDevIndexPercentages < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - class ConversationalDevelopmentIndexMetric < ActiveRecord::Base - self.table_name = 'conversational_development_index_metrics' - - METRICS = %w[boards ci_pipelines deployments environments issues merge_requests milestones notes - projects_prometheus_active service_desk_issues] - end - - def up - ConversationalDevelopmentIndexMetric.find_each do |conv_dev_index| - update = [] - - ConversationalDevelopmentIndexMetric::METRICS.each do |metric| - instance_score = conv_dev_index["instance_#{metric}"].to_f - leader_score = conv_dev_index["leader_#{metric}"].to_f - - percentage = leader_score.zero? ? 0.0 : (instance_score / leader_score) * 100 - update << "percentage_#{metric} = '#{percentage}'" - end - - execute("UPDATE conversational_development_index_metrics SET #{update.join(',')} WHERE id = #{conv_dev_index.id}") - end - end - - def down - end -end diff --git a/db/post_migrate/20170807160457_remove_locked_at_column_from_merge_requests.rb b/db/post_migrate/20170807160457_remove_locked_at_column_from_merge_requests.rb deleted file mode 100644 index 6dc49211e5a..00000000000 --- a/db/post_migrate/20170807160457_remove_locked_at_column_from_merge_requests.rb +++ /dev/null @@ -1,11 +0,0 @@ -class RemoveLockedAtColumnFromMergeRequests < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - remove_column :merge_requests, :locked_at - end - - def down - add_column :merge_requests, :locked_at, :datetime_with_timezone - end -end diff --git a/db/post_migrate/20170807190736_move_personal_snippet_files_into_correct_folder.rb b/db/post_migrate/20170807190736_move_personal_snippet_files_into_correct_folder.rb deleted file mode 100644 index 8341ac39c25..00000000000 --- a/db/post_migrate/20170807190736_move_personal_snippet_files_into_correct_folder.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MovePersonalSnippetFilesIntoCorrectFolder < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - disable_ddl_transaction! - - DOWNTIME = false - NEW_DIRECTORY = File.join('/uploads', '-', 'system', 'personal_snippet') - OLD_DIRECTORY = File.join('/uploads', 'system', 'personal_snippet') - - def up - return unless file_storage? - - BackgroundMigrationWorker.perform_async('MovePersonalSnippetFiles', - [OLD_DIRECTORY, NEW_DIRECTORY]) - end - - def down - return unless file_storage? - - BackgroundMigrationWorker.perform_async('MovePersonalSnippetFiles', - [NEW_DIRECTORY, OLD_DIRECTORY]) - end - - def file_storage? - CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File - end -end diff --git a/db/post_migrate/20170815060945_remove_duplicate_mr_events.rb b/db/post_migrate/20170815060945_remove_duplicate_mr_events.rb deleted file mode 100644 index fdc126b8fd6..00000000000 --- a/db/post_migrate/20170815060945_remove_duplicate_mr_events.rb +++ /dev/null @@ -1,26 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDuplicateMrEvents < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - DOWNTIME = false - - class Event < ActiveRecord::Base - self.table_name = 'events' - end - - def up - base_condition = "action = 1 AND target_type = 'MergeRequest' AND created_at > '2017-08-13'" - Event.select('target_id, count(*)') - .where(base_condition) - .group('target_id').having('count(*) > 1').each do |event| - duplicates = Event.where("#{base_condition} AND target_id = #{event.target_id}").pluck(:id) - duplicates.shift - - Event.where(id: duplicates).delete_all - end - end - - def down - end -end diff --git a/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb b/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb deleted file mode 100644 index 27656fd926d..00000000000 --- a/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb +++ /dev/null @@ -1,54 +0,0 @@ -# Follow up of CleanupNamespacelessPendingDeleteProjects and it cleans -# all projects with `pending_delete = true` and for which the -# namespace no longer exists. -class CleanupNonexistingNamespacePendingDeleteProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class Project < ActiveRecord::Base - self.table_name = 'projects' - - include ::EachBatch - end - - class Namespace < ActiveRecord::Base - self.table_name = 'namespaces' - end - - def up - find_projects.each_batch do |batch| - args = batch.pluck(:id).map { |id| [id] } - - NamespacelessProjectDestroyWorker.bulk_perform_async(args) - end - end - - def down - # NOOP - end - - private - - def find_projects - projects = Project.arel_table - namespaces = Namespace.arel_table - - namespace_query = namespaces.project(1) - .where(namespaces[:id].eq(projects[:namespace_id])) - .exists.not - - # SELECT "projects"."id" - # FROM "projects" - # WHERE "projects"."pending_delete" = 't' - # AND (NOT (EXISTS - # (SELECT 1 - # FROM "namespaces" - # WHERE "namespaces"."id" = "projects"."namespace_id"))) - Project.where(projects[:pending_delete].eq(true)) - .where(namespace_query) - .select(:id) - end -end diff --git a/db/post_migrate/20170822101017_migrate_pipeline_sidekiq_queues.rb b/db/post_migrate/20170822101017_migrate_pipeline_sidekiq_queues.rb deleted file mode 100644 index 825bc9250bd..00000000000 --- a/db/post_migrate/20170822101017_migrate_pipeline_sidekiq_queues.rb +++ /dev/null @@ -1,17 +0,0 @@ -class MigratePipelineSidekiqQueues < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - sidekiq_queue_migrate 'build', to: 'pipeline_default' - sidekiq_queue_migrate 'pipeline', to: 'pipeline_default' - end - - def down - sidekiq_queue_migrate 'pipeline_default', to: 'pipeline' - sidekiq_queue_migrate 'pipeline_processing', to: 'pipeline' - sidekiq_queue_migrate 'pipeline_hooks', to: 'pipeline' - sidekiq_queue_migrate 'pipeline_cache', to: 'pipeline' - end -end diff --git a/db/post_migrate/20170828170502_post_deploy_migrate_user_external_mail_data.rb b/db/post_migrate/20170828170502_post_deploy_migrate_user_external_mail_data.rb deleted file mode 100644 index 533155aeb7a..00000000000 --- a/db/post_migrate/20170828170502_post_deploy_migrate_user_external_mail_data.rb +++ /dev/null @@ -1,57 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PostDeployMigrateUserExternalMailData < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class User < ActiveRecord::Base - self.table_name = 'users' - - include EachBatch - end - - class UserSyncedAttributesMetadata < ActiveRecord::Base - self.table_name = 'user_synced_attributes_metadata' - - include EachBatch - end - - def up - User.each_batch do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - execute <<-EOF - INSERT INTO user_synced_attributes_metadata (user_id, provider, email_synced) - SELECT id, email_provider, external_email - FROM users - WHERE external_email = TRUE - AND NOT EXISTS ( - SELECT true - FROM user_synced_attributes_metadata - WHERE user_id = users.id - AND (provider = users.email_provider OR (provider IS NULL AND users.email_provider IS NULL)) - ) - AND id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - - def down - UserSyncedAttributesMetadata.each_batch do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - execute <<-EOF - UPDATE users - SET users.email_provider = metadata.provider, users.external_email = metadata.email_synced - FROM user_synced_attributes_metadata as metadata, users - WHERE metadata.email_synced = TRUE - AND metadata.user_id = users.id - AND id BETWEEN #{start_id} AND #{end_id} - EOF - end - end -end diff --git a/db/post_migrate/20170828170513_remove_user_email_provider_column.rb b/db/post_migrate/20170828170513_remove_user_email_provider_column.rb deleted file mode 100644 index bfc8aede540..00000000000 --- a/db/post_migrate/20170828170513_remove_user_email_provider_column.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveUserEmailProviderColumn < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :users, :email_provider, :string - end -end diff --git a/db/post_migrate/20170828170516_remove_user_external_mail_columns.rb b/db/post_migrate/20170828170516_remove_user_external_mail_columns.rb deleted file mode 100644 index 0104955e5c8..00000000000 --- a/db/post_migrate/20170828170516_remove_user_external_mail_columns.rb +++ /dev/null @@ -1,12 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveUserExternalMailColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :users, :external_email, :boolean - end -end diff --git a/db/post_migrate/20170830084744_destroy_gpg_signatures.rb b/db/post_migrate/20170830084744_destroy_gpg_signatures.rb deleted file mode 100644 index 2945eb9fde6..00000000000 --- a/db/post_migrate/20170830084744_destroy_gpg_signatures.rb +++ /dev/null @@ -1,10 +0,0 @@ -class DestroyGpgSignatures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - truncate(:gpg_signatures) - end - - def down - end -end diff --git a/db/post_migrate/20170830150306_drop_events_for_migration_table.rb b/db/post_migrate/20170830150306_drop_events_for_migration_table.rb deleted file mode 100644 index 3538b52b004..00000000000 --- a/db/post_migrate/20170830150306_drop_events_for_migration_table.rb +++ /dev/null @@ -1,47 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class DropEventsForMigrationTable < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class Event < ActiveRecord::Base - include EachBatch - end - - def up - transaction do - drop_table :events_for_migration - end - end - - def down - create_table :events_for_migration do |t| - t.string :target_type, index: true - t.integer :target_id, index: true - t.string :title - t.text :data - t.integer :project_id - t.datetime :created_at, index: true - t.datetime :updated_at - t.integer :action, index: true - t.integer :author_id, index: true - - t.index [:project_id, :id] - end - - Event.all.each_batch do |relation| - start_id, stop_id = relation.pluck('MIN(id), MAX(id)').first - - execute <<-EOF.strip_heredoc - INSERT INTO events_for_migration (target_type, target_id, project_id, created_at, updated_at, action, author_id) - SELECT target_type, target_id, project_id, created_at, updated_at, action, author_id - FROM events - WHERE id BETWEEN #{start_id} AND #{stop_id} - EOF - end - end -end diff --git a/db/post_migrate/20170831195038_remove_valid_signature_from_gpg_signatures.rb b/db/post_migrate/20170831195038_remove_valid_signature_from_gpg_signatures.rb deleted file mode 100644 index 8e264c1ab41..00000000000 --- a/db/post_migrate/20170831195038_remove_valid_signature_from_gpg_signatures.rb +++ /dev/null @@ -1,11 +0,0 @@ -class RemoveValidSignatureFromGpgSignatures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - remove_column :gpg_signatures, :valid_signature - end - - def down - add_column :gpg_signatures, :valid_signature, :boolean - end -end diff --git a/db/post_migrate/20170907170235_delete_conflicting_redirect_routes.rb b/db/post_migrate/20170907170235_delete_conflicting_redirect_routes.rb deleted file mode 100644 index 95abf2474dd..00000000000 --- a/db/post_migrate/20170907170235_delete_conflicting_redirect_routes.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class DeleteConflictingRedirectRoutes < ActiveRecord::Migration[4.2] - def up - # No-op. - # See https://gitlab.com/gitlab-com/infrastructure/issues/3460#note_53223252 - end - - def down - # nothing - end -end diff --git a/db/post_migrate/20170913180600_fix_projects_without_project_feature.rb b/db/post_migrate/20170913180600_fix_projects_without_project_feature.rb deleted file mode 100644 index bbc624ac7c0..00000000000 --- a/db/post_migrate/20170913180600_fix_projects_without_project_feature.rb +++ /dev/null @@ -1,33 +0,0 @@ -class FixProjectsWithoutProjectFeature < ActiveRecord::Migration[4.2] - DOWNTIME = false - - def up - # Deletes corrupted project features - sql = "DELETE FROM project_features WHERE project_id IS NULL" - execute(sql) - - # Creates missing project features with private visibility - sql = - %Q{ - INSERT INTO project_features(project_id, repository_access_level, issues_access_level, merge_requests_access_level, wiki_access_level, - builds_access_level, snippets_access_level, created_at, updated_at) - SELECT projects.id as project_id, - 10 as repository_access_level, - 10 as issues_access_level, - 10 as merge_requests_access_level, - 10 as wiki_access_level, - 10 as builds_access_level , - 10 as snippets_access_level, - projects.created_at, - projects.updated_at - FROM projects - LEFT OUTER JOIN project_features ON project_features.project_id = projects.id - WHERE (project_features.id IS NULL) - } - - execute(sql) - end - - def down - end -end diff --git a/db/post_migrate/20170921101004_normalize_ldap_extern_uids.rb b/db/post_migrate/20170921101004_normalize_ldap_extern_uids.rb deleted file mode 100644 index 9080acee1d6..00000000000 --- a/db/post_migrate/20170921101004_normalize_ldap_extern_uids.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class NormalizeLdapExternUids < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - MIGRATION = 'NormalizeLdapExternUidsRange'.freeze - DELAY_INTERVAL = 10.seconds - - disable_ddl_transaction! - - class Identity < ActiveRecord::Base - include EachBatch - - self.table_name = 'identities' - end - - def up - ldap_identities = Identity.where("provider like 'ldap%'") - - if ldap_identities.any? - queue_background_migration_jobs_by_range_at_intervals(Identity, MIGRATION, DELAY_INTERVAL) - end - end - - def down - end -end diff --git a/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb b/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb deleted file mode 100644 index 83c21c203e0..00000000000 --- a/db/post_migrate/20170927112318_update_legacy_diff_notes_type_for_import.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class UpdateLegacyDiffNotesTypeForImport < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:notes, :type, 'LegacyDiffNote') do |table, query| - query.where(table[:type].eq('Github::Import::LegacyDiffNote')) - end - end - - def down - end -end diff --git a/db/post_migrate/20170927112319_update_notes_type_for_import.rb b/db/post_migrate/20170927112319_update_notes_type_for_import.rb deleted file mode 100644 index 8c691de3192..00000000000 --- a/db/post_migrate/20170927112319_update_notes_type_for_import.rb +++ /dev/null @@ -1,17 +0,0 @@ -# rubocop:disable Migration/UpdateLargeTable -class UpdateNotesTypeForImport < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - update_column_in_batches(:notes, :type, 'Note') do |table, query| - query.where(table[:type].eq('Github::Import::Note')) - end - end - - def down - end -end diff --git a/db/post_migrate/20171012150314_remove_user_authentication_token.rb b/db/post_migrate/20171012150314_remove_user_authentication_token.rb deleted file mode 100644 index 9313986ce85..00000000000 --- a/db/post_migrate/20171012150314_remove_user_authentication_token.rb +++ /dev/null @@ -1,20 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveUserAuthenticationToken < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - remove_column :users, :authentication_token - end - - def down - add_column :users, :authentication_token, :string - - add_concurrent_index :users, :authentication_token, unique: true - end -end diff --git a/db/post_migrate/20171013104327_migrate_gcp_clusters_to_new_clusters_architectures.rb b/db/post_migrate/20171013104327_migrate_gcp_clusters_to_new_clusters_architectures.rb deleted file mode 100644 index 9c90aa611a4..00000000000 --- a/db/post_migrate/20171013104327_migrate_gcp_clusters_to_new_clusters_architectures.rb +++ /dev/null @@ -1,98 +0,0 @@ -class MigrateGcpClustersToNewClustersArchitectures < ActiveRecord::Migration[4.2] - DOWNTIME = false - - class GcpCluster < ActiveRecord::Base - self.table_name = 'gcp_clusters' - - belongs_to :project, class_name: 'Project' - - include EachBatch - end - - class Cluster < ActiveRecord::Base - self.table_name = 'clusters' - - has_many :cluster_projects, class_name: 'ClustersProject' - has_many :projects, through: :cluster_projects, class_name: 'Project' - has_one :provider_gcp, class_name: 'ProvidersGcp' - has_one :platform_kubernetes, class_name: 'PlatformsKubernetes' - - accepts_nested_attributes_for :provider_gcp - accepts_nested_attributes_for :platform_kubernetes - - enum platform_type: { - kubernetes: 1 - } - - enum provider_type: { - user: 0, - gcp: 1 - } - end - - class Project < ActiveRecord::Base - self.table_name = 'projects' - - has_one :cluster_project, class_name: 'ClustersProject' - has_one :cluster, through: :cluster_project, class_name: 'Cluster' - end - - class ClustersProject < ActiveRecord::Base - self.table_name = 'cluster_projects' - - belongs_to :cluster, class_name: 'Cluster' - belongs_to :project, class_name: 'Project' - end - - class ProvidersGcp < ActiveRecord::Base - self.table_name = 'cluster_providers_gcp' - end - - class PlatformsKubernetes < ActiveRecord::Base - self.table_name = 'cluster_platforms_kubernetes' - end - - def up - GcpCluster.all.find_each(batch_size: 1) do |gcp_cluster| - Cluster.create( - enabled: gcp_cluster.enabled, - user_id: gcp_cluster.user_id, - name: gcp_cluster.gcp_cluster_name, - provider_type: Cluster.provider_types[:gcp], - platform_type: Cluster.platform_types[:kubernetes], - projects: [gcp_cluster.project], - provider_gcp_attributes: { - status: gcp_cluster.status, - status_reason: gcp_cluster.status_reason, - gcp_project_id: gcp_cluster.gcp_project_id, - zone: gcp_cluster.gcp_cluster_zone, - num_nodes: gcp_cluster.gcp_cluster_size, - machine_type: gcp_cluster.gcp_machine_type, - operation_id: gcp_cluster.gcp_operation_id, - endpoint: gcp_cluster.endpoint, - encrypted_access_token: gcp_cluster.encrypted_gcp_token, - encrypted_access_token_iv: gcp_cluster.encrypted_gcp_token_iv - }, - platform_kubernetes_attributes: { - api_url: api_url(gcp_cluster.endpoint), - ca_cert: gcp_cluster.ca_cert, - namespace: gcp_cluster.project_namespace, - username: gcp_cluster.username, - encrypted_password: gcp_cluster.encrypted_password, - encrypted_password_iv: gcp_cluster.encrypted_password_iv, - encrypted_token: gcp_cluster.encrypted_kubernetes_token, - encrypted_token_iv: gcp_cluster.encrypted_kubernetes_token_iv - } ) - end - end - - def down - execute('DELETE FROM clusters') - end - - private - - def api_url(endpoint) - endpoint ? 'https://' + endpoint : nil - end -end diff --git a/db/post_migrate/20171026082505_schedule_merge_request_latest_merge_request_diff_id_migrations.rb b/db/post_migrate/20171026082505_schedule_merge_request_latest_merge_request_diff_id_migrations.rb deleted file mode 100644 index 764561de997..00000000000 --- a/db/post_migrate/20171026082505_schedule_merge_request_latest_merge_request_diff_id_migrations.rb +++ /dev/null @@ -1,29 +0,0 @@ -class ScheduleMergeRequestLatestMergeRequestDiffIdMigrations < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - BATCH_SIZE = 50_000 - MIGRATION = 'PopulateMergeRequestsLatestMergeRequestDiffId' - - disable_ddl_transaction! - - class MergeRequest < ActiveRecord::Base - self.table_name = 'merge_requests' - - include ::EachBatch - end - - # On GitLab.com, we saw that we generated about 500,000 dead tuples over 5 minutes. - # To keep replication lag from ballooning, we'll aim for 50,000 updates over 5 minutes. - # - # Assuming that there are 5 million rows affected (which is more than on - # GitLab.com), and that each batch of 50,000 rows takes up to 5 minutes, then - # we can migrate all the rows in 8.5 hours. - def up - MergeRequest.where(latest_merge_request_diff_id: nil).each_batch(of: BATCH_SIZE) do |relation, index| - range = relation.pluck('MIN(id)', 'MAX(id)').first - - BackgroundMigrationWorker.perform_in(index * 5.minutes, MIGRATION, range) - end - end -end diff --git a/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb b/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb deleted file mode 100644 index e6a5ffc8649..00000000000 --- a/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb +++ /dev/null @@ -1,14 +0,0 @@ -class RemoveRefFetchedFromMergeRequests < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - # We don't need to cache this anymore: the refs are now created - # upon save/update and there is no more use for this flag - # - # See https://gitlab.com/gitlab-org/gitlab-ce/issues/36061 - def change - remove_column :merge_requests, :ref_fetched, :boolean - end -end diff --git a/db/post_migrate/20171103140253_track_untracked_uploads.rb b/db/post_migrate/20171103140253_track_untracked_uploads.rb deleted file mode 100644 index 6891ef5ba12..00000000000 --- a/db/post_migrate/20171103140253_track_untracked_uploads.rb +++ /dev/null @@ -1,21 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class TrackUntrackedUploads < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - disable_ddl_transaction! - - DOWNTIME = false - MIGRATION = 'PrepareUntrackedUploads' - - def up - BackgroundMigrationWorker.perform_async(MIGRATION) - end - - def down - if table_exists?(:untracked_files_for_uploads) - drop_table :untracked_files_for_uploads - end - end -end diff --git a/db/post_migrate/20171106133144_cleanup_application_settings_password_authentication_enabled_rename.rb b/db/post_migrate/20171106133144_cleanup_application_settings_password_authentication_enabled_rename.rb deleted file mode 100644 index 4a01bf75f50..00000000000 --- a/db/post_migrate/20171106133144_cleanup_application_settings_password_authentication_enabled_rename.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CleanupApplicationSettingsPasswordAuthenticationEnabledRename < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_rename :application_settings, :password_authentication_enabled, :password_authentication_enabled_for_web - end - - def down - rename_column_concurrently :application_settings, :password_authentication_enabled_for_web, :password_authentication_enabled - end -end diff --git a/db/post_migrate/20171106154015_remove_issues_branch_name.rb b/db/post_migrate/20171106154015_remove_issues_branch_name.rb deleted file mode 100644 index 4e71aa2f163..00000000000 --- a/db/post_migrate/20171106154015_remove_issues_branch_name.rb +++ /dev/null @@ -1,13 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveIssuesBranchName < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - # Set this constant to true if this migration requires downtime. - DOWNTIME = false - - def change - remove_column :issues, :branch_name, :string - end -end diff --git a/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb b/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb deleted file mode 100644 index 8187d3971fc..00000000000 --- a/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb +++ /dev/null @@ -1,20 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CleanupAddTimezoneToIssuesClosedAt < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - cleanup_concurrent_column_type_change(:issues, :closed_at) - end - - # rubocop:disable Migration/Datetime - # rubocop:disable Migration/UpdateLargeTable - def down - change_column_type_concurrently(:issues, :closed_at, :datetime) - end -end diff --git a/db/post_migrate/20171114104051_remove_empty_fork_networks.rb b/db/post_migrate/20171114104051_remove_empty_fork_networks.rb deleted file mode 100644 index 76862cccf60..00000000000 --- a/db/post_migrate/20171114104051_remove_empty_fork_networks.rb +++ /dev/null @@ -1,36 +0,0 @@ -class RemoveEmptyForkNetworks < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - BATCH_SIZE = 10_000 - - class MigrationForkNetwork < ActiveRecord::Base - include EachBatch - - self.table_name = 'fork_networks' - end - - class MigrationForkNetworkMembers < ActiveRecord::Base - self.table_name = 'fork_network_members' - end - - disable_ddl_transaction! - - def up - say 'Deleting empty ForkNetworks in batches' - - has_members = MigrationForkNetworkMembers - .where('fork_network_members.fork_network_id = fork_networks.id') - .select(1) - MigrationForkNetwork.where('NOT EXISTS (?)', has_members) - .each_batch(of: BATCH_SIZE) do |networks| - deleted = networks.delete_all - - say "Deleted #{deleted} rows in batch" - end - end - - def down - # nothing - end -end diff --git a/db/post_migrate/20171121160421_remove_merge_request_diff_st_commits_and_st_diffs.rb b/db/post_migrate/20171121160421_remove_merge_request_diff_st_commits_and_st_diffs.rb deleted file mode 100644 index 93a97993f1f..00000000000 --- a/db/post_migrate/20171121160421_remove_merge_request_diff_st_commits_and_st_diffs.rb +++ /dev/null @@ -1,10 +0,0 @@ -class RemoveMergeRequestDiffStCommitsAndStDiffs < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def change - remove_column :merge_request_diffs, :st_commits, :text - remove_column :merge_request_diffs, :st_diffs, :text - end -end diff --git a/db/post_migrate/20171123101020_update_circuitbreaker_defaults.rb b/db/post_migrate/20171123101020_update_circuitbreaker_defaults.rb deleted file mode 100644 index ae954289291..00000000000 --- a/db/post_migrate/20171123101020_update_circuitbreaker_defaults.rb +++ /dev/null @@ -1,34 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class UpdateCircuitbreakerDefaults < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - class ApplicationSetting < ActiveRecord::Base; end - - def up - change_column_default :application_settings, - :circuitbreaker_failure_count_threshold, - 3 - change_column_default :application_settings, - :circuitbreaker_storage_timeout, - 15 - - ApplicationSetting.update_all(circuitbreaker_failure_count_threshold: 3, - circuitbreaker_storage_timeout: 15) - end - - def down - change_column_default :application_settings, - :circuitbreaker_failure_count_threshold, - 160 - change_column_default :application_settings, - :circuitbreaker_storage_timeout, - 30 - - ApplicationSetting.update_all(circuitbreaker_failure_count_threshold: 160, - circuitbreaker_storage_timeout: 30) - end -end diff --git a/db/post_migrate/20171123101046_remove_old_circuitbreaker_config.rb b/db/post_migrate/20171123101046_remove_old_circuitbreaker_config.rb deleted file mode 100644 index 3f2c1b2170a..00000000000 --- a/db/post_migrate/20171123101046_remove_old_circuitbreaker_config.rb +++ /dev/null @@ -1,26 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveOldCircuitbreakerConfig < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - remove_column :application_settings, - :circuitbreaker_backoff_threshold - remove_column :application_settings, - :circuitbreaker_failure_wait_time - end - - def down - add_column :application_settings, - :circuitbreaker_backoff_threshold, - :integer, - default: 80 - add_column :application_settings, - :circuitbreaker_failure_wait_time, - :integer, - default: 30 - end -end diff --git a/db/post_migrate/20171124095655_add_index_on_merge_request_diffs_merge_request_id_and_id.rb b/db/post_migrate/20171124095655_add_index_on_merge_request_diffs_merge_request_id_and_id.rb deleted file mode 100644 index 2c65a4ae4f5..00000000000 --- a/db/post_migrate/20171124095655_add_index_on_merge_request_diffs_merge_request_id_and_id.rb +++ /dev/null @@ -1,17 +0,0 @@ -class AddIndexOnMergeRequestDiffsMergeRequestIdAndId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - add_concurrent_index(:merge_request_diffs, [:merge_request_id, :id]) - end - - def down - if index_exists?(:merge_request_diffs, [:merge_request_id, :id]) - remove_concurrent_index(:merge_request_diffs, [:merge_request_id, :id]) - end - end -end diff --git a/db/post_migrate/20171124100152_remove_index_on_merge_request_diffs_merge_request_diff_id.rb b/db/post_migrate/20171124100152_remove_index_on_merge_request_diffs_merge_request_diff_id.rb deleted file mode 100644 index efd3714d668..00000000000 --- a/db/post_migrate/20171124100152_remove_index_on_merge_request_diffs_merge_request_diff_id.rb +++ /dev/null @@ -1,17 +0,0 @@ -class RemoveIndexOnMergeRequestDiffsMergeRequestDiffId < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - if index_exists?(:merge_request_diffs, :merge_request_id) - remove_concurrent_index(:merge_request_diffs, :merge_request_id) - end - end - - def down - add_concurrent_index(:merge_request_diffs, :merge_request_id) - end -end diff --git a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb b/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb deleted file mode 100644 index 58ceefe3c97..00000000000 --- a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb +++ /dev/null @@ -1,151 +0,0 @@ -class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - DEFAULT_KUBERNETES_SERVICE_CLUSTER_NAME = 'KubernetesService'.freeze - - disable_ddl_transaction! - - class Project < ActiveRecord::Base - self.table_name = 'projects' - - has_many :cluster_projects, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::ClustersProject' - has_many :clusters, through: :cluster_projects, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Cluster' - has_many :services, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Service' - has_one :kubernetes_service, -> { where(category: 'deployment', type: 'KubernetesService') }, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Service', inverse_of: :project, foreign_key: :project_id - end - - class Cluster < ActiveRecord::Base - self.table_name = 'clusters' - - has_many :cluster_projects, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::ClustersProject' - has_many :projects, through: :cluster_projects, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Project' - has_one :platform_kubernetes, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::PlatformsKubernetes' - - accepts_nested_attributes_for :platform_kubernetes - - enum platform_type: { - kubernetes: 1 - } - - enum provider_type: { - user: 0, - gcp: 1 - } - end - - class ClustersProject < ActiveRecord::Base - self.table_name = 'cluster_projects' - - belongs_to :cluster, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Cluster' - belongs_to :project, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Project' - end - - class PlatformsKubernetes < ActiveRecord::Base - self.table_name = 'cluster_platforms_kubernetes' - - belongs_to :cluster, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Cluster' - - attr_encrypted :token, - mode: :per_attribute_iv, - key: Settings.attr_encrypted_db_key_base_truncated, - algorithm: 'aes-256-cbc' - end - - class Service < ActiveRecord::Base - include EachBatch - - self.table_name = 'services' - self.inheritance_column = :_type_disabled # Disable STI, otherwise KubernetesModel will be looked up - - belongs_to :project, class_name: 'MigrateKubernetesServiceToNewClustersArchitectures::Project', foreign_key: :project_id - - scope :unmanaged_kubernetes_service, -> do - joins('LEFT JOIN projects ON projects.id = services.project_id') - .joins('LEFT JOIN cluster_projects ON cluster_projects.project_id = projects.id') - .joins('LEFT JOIN cluster_platforms_kubernetes ON cluster_platforms_kubernetes.cluster_id = cluster_projects.cluster_id') - .where(category: 'deployment', type: 'KubernetesService', template: false) - .where("services.properties LIKE '%api_url%'") - .where("(services.properties NOT LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%')) OR cluster_platforms_kubernetes.api_url IS NULL") - .group(:id) - .order(id: :asc) - end - - scope :kubernetes_service_without_template, -> do - where(category: 'deployment', type: 'KubernetesService', template: false) - end - - def api_url - parsed_properties['api_url'] - end - - def ca_pem - parsed_properties['ca_pem'] - end - - def namespace - parsed_properties['namespace'] - end - - def token - parsed_properties['token'] - end - - private - - def parsed_properties - @parsed_properties ||= JSON.parse(self.properties) - end - end - - def find_dedicated_environement_scope(project) - environment_scopes = project.clusters.map(&:environment_scope) - - return '*' if environment_scopes.exclude?('*') # KubernetesService should be added as a default cluster (environment_scope: '*') at first place - return 'migrated/*' if environment_scopes.exclude?('migrated/*') # If it's conflicted, the KubernetesService added as a migrated cluster - - unique_iid = 0 - - # If it's still conflicted, finding an unique environment scope incrementaly - loop do - candidate = "migrated#{unique_iid}/*" - return candidate if environment_scopes.exclude?(candidate) - - unique_iid += 1 - end - end - - def up - ActiveRecord::Base.transaction do - MigrateKubernetesServiceToNewClustersArchitectures::Service - .unmanaged_kubernetes_service.find_each(batch_size: 1) do |kubernetes_service| - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create( - enabled: kubernetes_service.active, - user_id: nil, # KubernetesService doesn't have - name: DEFAULT_KUBERNETES_SERVICE_CLUSTER_NAME, - provider_type: MigrateKubernetesServiceToNewClustersArchitectures::Cluster.provider_types[:user], - platform_type: MigrateKubernetesServiceToNewClustersArchitectures::Cluster.platform_types[:kubernetes], - projects: [kubernetes_service.project], - environment_scope: find_dedicated_environement_scope(kubernetes_service.project), - platform_kubernetes_attributes: { - api_url: kubernetes_service.api_url, - ca_cert: kubernetes_service.ca_pem, - namespace: kubernetes_service.namespace, - username: nil, # KubernetesService doesn't have - encrypted_password: nil, # KubernetesService doesn't have - encrypted_password_iv: nil, # KubernetesService doesn't have - token: kubernetes_service.token # encrypted_token and encrypted_token_iv - } ) - end - end - - MigrateKubernetesServiceToNewClustersArchitectures::Service - .kubernetes_service_without_template.each_batch(of: 100) do |kubernetes_service| - kubernetes_service.update_all(active: false) - end - end - - def down - # noop - end -end diff --git a/db/post_migrate/20171124150326_reschedule_fork_network_creation.rb b/db/post_migrate/20171124150326_reschedule_fork_network_creation.rb deleted file mode 100644 index 8e320ea9e8d..00000000000 --- a/db/post_migrate/20171124150326_reschedule_fork_network_creation.rb +++ /dev/null @@ -1,13 +0,0 @@ -class RescheduleForkNetworkCreation < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - say 'Fork networks will be populated in 20171205190711 - RescheduleForkNetworkCreationCaller' - end - - def down - # nothing - end -end diff --git a/db/post_migrate/20171205190711_reschedule_fork_network_creation_caller.rb b/db/post_migrate/20171205190711_reschedule_fork_network_creation_caller.rb deleted file mode 100644 index 058f3a40817..00000000000 --- a/db/post_migrate/20171205190711_reschedule_fork_network_creation_caller.rb +++ /dev/null @@ -1,27 +0,0 @@ -class RescheduleForkNetworkCreationCaller < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - MIGRATION = 'PopulateForkNetworksRange'.freeze - BATCH_SIZE = 100 - DELAY_INTERVAL = 15.seconds - - disable_ddl_transaction! - - class ForkedProjectLink < ActiveRecord::Base - include EachBatch - - self.table_name = 'forked_project_links' - end - - def up - say 'Populating the `fork_networks` based on existing `forked_project_links`' - - queue_background_migration_jobs_by_range_at_intervals(ForkedProjectLink, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE) - end - - def down - # nothing - end -end diff --git a/db/post_migrate/20171207150300_remove_project_labels_group_id_copy.rb b/db/post_migrate/20171207150300_remove_project_labels_group_id_copy.rb deleted file mode 100644 index 44273cebc9d..00000000000 --- a/db/post_migrate/20171207150300_remove_project_labels_group_id_copy.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Copy of 20180202111106 - this one should run before 20171207150343 to fix issues related to -# the removal of groups with labels. - -class RemoveProjectLabelsGroupIdCopy < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - def up - # rubocop:disable Migration/UpdateColumnInBatches - update_column_in_batches(:labels, :group_id, nil) do |table, query| - query.where(table[:type].eq('ProjectLabel').and(table[:group_id].not_eq(nil))) - end - # rubocop:enable Migration/UpdateColumnInBatches - end - - def down - end -end diff --git a/db/post_migrate/20171207150344_remove_deleted_at_columns.rb b/db/post_migrate/20171207150344_remove_deleted_at_columns.rb deleted file mode 100644 index 5f1c70a2797..00000000000 --- a/db/post_migrate/20171207150344_remove_deleted_at_columns.rb +++ /dev/null @@ -1,31 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveDeletedAtColumns < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - TABLES = %i[issues merge_requests namespaces ci_pipeline_schedules ci_triggers].freeze - COLUMN = :deleted_at - - def up - TABLES.each do |table| - remove_column(table, COLUMN) if column_exists?(table, COLUMN) - end - end - - def down - TABLES.each do |table| - unless column_exists?(table, COLUMN) - add_column(table, COLUMN, :datetime_with_timezone) - end - - unless index_exists?(table, COLUMN) - add_concurrent_index(table, COLUMN) - end - end - end -end diff --git a/db/post_migrate/20171213160445_migrate_github_importer_advance_stage_sidekiq_queue.rb b/db/post_migrate/20171213160445_migrate_github_importer_advance_stage_sidekiq_queue.rb deleted file mode 100644 index 088c4b5d46b..00000000000 --- a/db/post_migrate/20171213160445_migrate_github_importer_advance_stage_sidekiq_queue.rb +++ /dev/null @@ -1,16 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class MigrateGithubImporterAdvanceStageSidekiqQueue < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - sidekiq_queue_migrate 'github_importer_advance_stage', to: 'github_import_advance_stage' - end - - def down - sidekiq_queue_migrate 'github_import_advance_stage', to: 'github_importer_advance_stage' - end -end diff --git a/db/post_migrate/20171215121205_post_populate_can_push_from_deploy_keys_projects.rb b/db/post_migrate/20171215121205_post_populate_can_push_from_deploy_keys_projects.rb deleted file mode 100644 index 1c81e56db55..00000000000 --- a/db/post_migrate/20171215121205_post_populate_can_push_from_deploy_keys_projects.rb +++ /dev/null @@ -1,63 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class PostPopulateCanPushFromDeployKeysProjects < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - DATABASE_NAME = Gitlab::Database.database_name - - disable_ddl_transaction! - - class DeploysKeyProject < ActiveRecord::Base - include EachBatch - - self.table_name = 'deploy_keys_projects' - end - - def up - DeploysKeyProject.each_batch(of: 10_000) do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects, #{DATABASE_NAME}.keys - SET deploy_keys_projects.can_push = #{DATABASE_NAME}.keys.can_push - WHERE deploy_keys_projects.deploy_key_id = #{DATABASE_NAME}.keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - else - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects - SET can_push = keys.can_push - FROM keys - WHERE deploy_key_id = keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - end - - def down - DeploysKeyProject.each_batch(of: 10_000) do |batch| - start_id, end_id = batch.pluck('MIN(id), MAX(id)').first - - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE deploy_keys_projects, #{DATABASE_NAME}.keys - SET #{DATABASE_NAME}.keys.can_push = deploy_keys_projects.can_push - WHERE deploy_keys_projects.deploy_key_id = #{DATABASE_NAME}.keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - else - execute <<-EOF.strip_heredoc - UPDATE keys - SET can_push = deploy_keys_projects.can_push - FROM deploy_keys_projects - WHERE deploy_keys_projects.deploy_key_id = keys.id - AND deploy_keys_projects.id BETWEEN #{start_id} AND #{end_id} - EOF - end - end - end -end diff --git a/db/post_migrate/20171215121259_remove_can_push_from_keys.rb b/db/post_migrate/20171215121259_remove_can_push_from_keys.rb deleted file mode 100644 index fc4045a383d..00000000000 --- a/db/post_migrate/20171215121259_remove_can_push_from_keys.rb +++ /dev/null @@ -1,17 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class RemoveCanPushFromKeys < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - disable_ddl_transaction! - - def up - remove_column :keys, :can_push - end - - def down - add_column_with_default :keys, :can_push, :boolean, default: false, allow_null: false - end -end diff --git a/db/post_migrate/20171219121201_normalize_extern_uid_from_identities.rb b/db/post_migrate/20171219121201_normalize_extern_uid_from_identities.rb deleted file mode 100644 index 45ef75fdb98..00000000000 --- a/db/post_migrate/20171219121201_normalize_extern_uid_from_identities.rb +++ /dev/null @@ -1,29 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class NormalizeExternUidFromIdentities < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - MIGRATION = 'NormalizeLdapExternUidsRange'.freeze - DELAY_INTERVAL = 10.seconds - - disable_ddl_transaction! - - class Identity < ActiveRecord::Base - include EachBatch - - self.table_name = 'identities' - end - - def up - ldap_identities = Identity.where("provider like 'ldap%'") - - if ldap_identities.any? - queue_background_migration_jobs_by_range_at_intervals(Identity, MIGRATION, DELAY_INTERVAL) - end - end - - def down - end -end diff --git a/db/post_migrate/20171221140220_schedule_issues_closed_at_type_change.rb b/db/post_migrate/20171221140220_schedule_issues_closed_at_type_change.rb deleted file mode 100644 index 6b5e6202688..00000000000 --- a/db/post_migrate/20171221140220_schedule_issues_closed_at_type_change.rb +++ /dev/null @@ -1,45 +0,0 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. -# rubocop:disable Migration/Datetime -class ScheduleIssuesClosedAtTypeChange < ActiveRecord::Migration[4.2] - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - disable_ddl_transaction! - - class Issue < ActiveRecord::Base - self.table_name = 'issues' - include EachBatch - - def self.to_migrate - where('closed_at IS NOT NULL') - end - end - - def up - return unless migrate_column_type? - - change_column_type_using_background_migration( - Issue.to_migrate, - :closed_at, - :datetime_with_timezone - ) - end - - def down - return if migrate_column_type? - - change_column_type_using_background_migration( - Issue.to_migrate, - :closed_at, - :datetime - ) - end - - def migrate_column_type? - # Some environments may have already executed the previous version of this - # migration, thus we don't need to migrate those environments again. - column_for('issues', 'closed_at').type == :datetime - end -end diff --git a/db/schema.rb b/db/schema.rb index 8876be1cb34..32a25f643ce 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20190628145246) do +ActiveRecord::Schema.define(version: 20190628185004) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1047,6 +1047,7 @@ ActiveRecord::Schema.define(version: 20190628145246) do t.datetime_with_timezone "created_at", null: false t.string "name", null: false t.string "token", null: false + t.string "username" t.index ["token", "expires_at", "id"], name: "index_deploy_tokens_on_token_and_expires_at_and_id", where: "(revoked IS FALSE)", using: :btree t.index ["token"], name: "index_deploy_tokens_on_token", unique: true, using: :btree end @@ -2901,6 +2902,7 @@ ActiveRecord::Schema.define(version: 20190628145246) do t.integer "author_id" t.string "name" t.string "sha" + t.datetime_with_timezone "released_at", null: false t.index ["author_id"], name: "index_releases_on_author_id", using: :btree t.index ["project_id", "tag"], name: "index_releases_on_project_id_and_tag", using: :btree t.index ["project_id"], name: "index_releases_on_project_id", using: :btree @@ -3029,6 +3031,7 @@ ActiveRecord::Schema.define(version: 20190628145246) do t.boolean "job_events", default: false, null: false t.boolean "confidential_note_events", default: true t.boolean "deployment_events", default: false, null: false + t.string "description", limit: 500 t.index ["project_id"], name: "index_services_on_project_id", using: :btree t.index ["template"], name: "index_services_on_template", using: :btree t.index ["type"], name: "index_services_on_type", using: :btree diff --git a/doc/administration/auth/ldap.md b/doc/administration/auth/ldap.md index 1f2961ea39a..79ac7fe0352 100644 --- a/doc/administration/auth/ldap.md +++ b/doc/administration/auth/ldap.md @@ -1,6 +1,4 @@ -[//]: # (Do *NOT* modify this file in EE documentation. All changes in this) -[//]: # (file should happen in CE, too. If the change is EE-specific, put) -[//]: # (it in `ldap-ee.md`.) +<!-- If the change is EE-specific, put it in `ldap-ee.md`, NOT here. --> # LDAP diff --git a/doc/administration/container_registry.md b/doc/administration/container_registry.md index 4d55f2357c1..2e4b4efa0ac 100644 --- a/doc/administration/container_registry.md +++ b/doc/administration/container_registry.md @@ -689,6 +689,20 @@ You can add a configuration option for backwards compatibility. 1. Restart the registry for the changes to take affect. +### Docker connection error + +A Docker connection error can occur when there are special characters in either the group, +project or branch name. Special characters can include: + +* Leading underscore +* Trailing hyphen/dash +* Double hyphen/dash + +To get around this, you can [change the group path](../user/group/index.md#changing-a-groups-path), +[change the project path](../user/project/settings/index.md#renaming-a-repository) or change the +branch name. Another option is to create a [push rule](../push_rules/push_rules.html) to prevent +this at the instance level. + [ce-18239]: https://gitlab.com/gitlab-org/gitlab-ce/issues/18239 [docker-insecure-self-signed]: https://docs.docker.com/registry/insecure/#use-self-signed-certificates diff --git a/doc/administration/geo/disaster_recovery/background_verification.md b/doc/administration/geo/disaster_recovery/background_verification.md index d4c8c2d3624..e19cd9bbfec 100644 --- a/doc/administration/geo/disaster_recovery/background_verification.md +++ b/doc/administration/geo/disaster_recovery/background_verification.md @@ -143,11 +143,13 @@ If the **primary** and **secondary** nodes have a checksum verification mismatch 1. On the project admin page get the **Gitaly storage name**, and **Gitaly relative path**: ![Project admin page](img/checksum-differences-admin-project-page.png) -1. Navigate to the project's repository directory on both **primary** and **secondary** nodes (the path is usually `/var/opt/gitlab/git-data/repositories`). Note that if `git_data_dirs` is customized, check the directory layout on your server to be sure. +1. Navigate to the project's repository directory on both **primary** and **secondary** nodes + (the path is usually `/var/opt/gitlab/git-data/repositories`). Note that if `git_data_dirs` + is customized, check the directory layout on your server to be sure. - ```sh - cd /var/opt/gitlab/git-data/repositories - ``` + ```sh + cd /var/opt/gitlab/git-data/repositories + ``` 1. Run the following command on the **primary** node, redirecting the output to a file: diff --git a/doc/administration/geo/disaster_recovery/bring_primary_back.md b/doc/administration/geo/disaster_recovery/bring_primary_back.md index f4d31a98080..9a981b49349 100644 --- a/doc/administration/geo/disaster_recovery/bring_primary_back.md +++ b/doc/administration/geo/disaster_recovery/bring_primary_back.md @@ -21,20 +21,20 @@ To bring the former **primary** node up to date: 1. SSH into the former **primary** node that has fallen behind. 1. Make sure all the services are up: - ```sh - sudo gitlab-ctl start - ``` - - > **Note 1:** If you [disabled the **primary** node permanently][disaster-recovery-disable-primary], - > you need to undo those steps now. For Debian/Ubuntu you just need to run - > `sudo systemctl enable gitlab-runsvdir`. For CentOS 6, you need to install - > the GitLab instance from scratch and set it up as a **secondary** node by - > following [Setup instructions][setup-geo]. In this case, you don't need to follow the next step. - > - > **Note 2:** If you [changed the DNS records](index.md#step-4-optional-updating-the-primary-domain-dns-record) - > for this node during disaster recovery procedure you may need to [block - > all the writes to this node](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/gitlab-geo/planned-failover.md#block-primary-traffic) - > during this procedure. + ```sh + sudo gitlab-ctl start + ``` + + NOTE: **Note:** If you [disabled the **primary** node permanently][disaster-recovery-disable-primary], + you need to undo those steps now. For Debian/Ubuntu you just need to run + `sudo systemctl enable gitlab-runsvdir`. For CentOS 6, you need to install + the GitLab instance from scratch and set it up as a **secondary** node by + following [Setup instructions][setup-geo]. In this case, you don't need to follow the next step. + + NOTE: **Note:** If you [changed the DNS records](index.md#step-4-optional-updating-the-primary-domain-dns-record) + for this node during disaster recovery procedure you may need to [block + all the writes to this node](planned_failover.md#prevent-updates-to-the-primary-node) + during this procedure. 1. [Setup database replication][database-replication]. Note that in this case, **primary** node refers to the current **primary** node, and **secondary** node refers to the diff --git a/doc/administration/geo/disaster_recovery/index.md b/doc/administration/geo/disaster_recovery/index.md index 71dc797f281..86182b84062 100644 --- a/doc/administration/geo/disaster_recovery/index.md +++ b/doc/administration/geo/disaster_recovery/index.md @@ -39,48 +39,50 @@ must disable the **primary** node. 1. SSH into the **primary** node to stop and disable GitLab, if possible: - ```sh - sudo gitlab-ctl stop - ``` + ```sh + sudo gitlab-ctl stop + ``` - Prevent GitLab from starting up again if the server unexpectedly reboots: + Prevent GitLab from starting up again if the server unexpectedly reboots: - ```sh - sudo systemctl disable gitlab-runsvdir - ``` + ```sh + sudo systemctl disable gitlab-runsvdir + ``` - > **CentOS only**: In CentOS 6 or older, there is no easy way to prevent GitLab from being - > started if the machine reboots isn't available (see [gitlab-org/omnibus-gitlab#3058]). - > It may be safest to uninstall the GitLab package completely: + NOTE: **Note:** + (**CentOS only**) In CentOS 6 or older, there is no easy way to prevent GitLab from being + started if the machine reboots isn't available (see [gitlab-org/omnibus-gitlab#3058]). + It may be safest to uninstall the GitLab package completely: - ```sh - yum remove gitlab-ee - ``` + ```sh + yum remove gitlab-ee + ``` - > **Ubuntu 14.04 LTS**: If you are using an older version of Ubuntu - > or any other distro based on the Upstart init system, you can prevent GitLab - > from starting if the machine reboots by doing the following: + NOTE: **Note:** + (**Ubuntu 14.04 LTS**) If you are using an older version of Ubuntu + or any other distro based on the Upstart init system, you can prevent GitLab + from starting if the machine reboots by doing the following: - ```sh - initctl stop gitlab-runsvvdir - echo 'manual' > /etc/init/gitlab-runsvdir.override - initctl reload-configuration - ``` + ```sh + initctl stop gitlab-runsvvdir + echo 'manual' > /etc/init/gitlab-runsvdir.override + initctl reload-configuration + ``` 1. If you do not have SSH access to the **primary** node, take the machine offline and - prevent it from rebooting by any means at your disposal. - Since there are many ways you may prefer to accomplish this, we will avoid a - single recommendation. You may need to: - - Reconfigure the load balancers. - - Change DNS records (e.g., point the primary DNS record to the **secondary** - node in order to stop usage of the **primary** node). - - Stop the virtual servers. - - Block traffic through a firewall. - - Revoke object storage permissions from the **primary** node. - - Physically disconnect a machine. - -1. If you plan to - [update the primary domain DNS record](#step-4-optional-updating-the-primary-domain-dns-record), + prevent it from rebooting by any means at your disposal. + Since there are many ways you may prefer to accomplish this, we will avoid a + single recommendation. You may need to: + + - Reconfigure the load balancers. + - Change DNS records (e.g., point the primary DNS record to the **secondary** + node in order to stop usage of the **primary** node). + - Stop the virtual servers. + - Block traffic through a firewall. + - Revoke object storage permissions from the **primary** node. + - Physically disconnect a machine. + +1. If you plan to [update the primary domain DNS record](#step-4-optional-updating-the-primary-domain-dns-record), you may wish to lower the TTL now to speed up propagation. ### Step 3. Promoting a **secondary** node @@ -94,26 +96,26 @@ the **secondary** to the **primary**. 1. SSH in to your **secondary** node and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Edit `/etc/gitlab/gitlab.rb` to reflect its new status as **primary** by removing any lines that enabled the `geo_secondary_role`: - ```ruby - ## In pre-11.5 documentation, the role was enabled as follows. Remove this line. - geo_secondary_role['enable'] = true + ```ruby + ## In pre-11.5 documentation, the role was enabled as follows. Remove this line. + geo_secondary_role['enable'] = true - ## In 11.5+ documentation, the role was enabled as follows. Remove this line. - roles ['geo_secondary_role'] - ``` + ## In 11.5+ documentation, the role was enabled as follows. Remove this line. + roles ['geo_secondary_role'] + ``` 1. Promote the **secondary** node to the **primary** node. Execute: - ```sh - gitlab-ctl promote-to-primary-node - ``` + ```sh + gitlab-ctl promote-to-primary-node + ``` 1. Verify you can connect to the newly promoted **primary** node using the URL used previously for the **secondary** node. @@ -129,31 +131,31 @@ do this manually. 1. SSH in to the database node in the **secondary** and trigger PostgreSQL to promote to read-write: - ```bash - sudo gitlab-pg-ctl promote - ``` + ```bash + sudo gitlab-pg-ctl promote + ``` 1. Edit `/etc/gitlab/gitlab.rb` on every machine in the **secondary** to reflect its new status as **primary** by removing any lines that enabled the `geo_secondary_role`: - ```ruby - ## In pre-11.5 documentation, the role was enabled as follows. Remove this line. - geo_secondary_role['enable'] = true + ```ruby + ## In pre-11.5 documentation, the role was enabled as follows. Remove this line. + geo_secondary_role['enable'] = true - ## In 11.5+ documentation, the role was enabled as follows. Remove this line. - roles ['geo_secondary_role'] - ``` + ## In 11.5+ documentation, the role was enabled as follows. Remove this line. + roles ['geo_secondary_role'] + ``` - After making these changes [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) each - machine so the changes take effect. + After making these changes [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) each + machine so the changes take effect. 1. Promote the **secondary** to **primary**. SSH into a single application server and execute: - ```bash - sudo gitlab-rake geo:set_secondary_as_primary - ``` + ```bash + sudo gitlab-rake geo:set_secondary_as_primary + ``` 1. Verify you can connect to the newly promoted **primary** using the URL used previously for the **secondary**. @@ -167,37 +169,37 @@ secondary domain, like changing Git remotes and API URLs. 1. SSH into the **secondary** node and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Update the primary domain's DNS record. After updating the primary domain's DNS records to point to the **secondary** node, edit `/etc/gitlab/gitlab.rb` on the **secondary** node to reflect the new URL: - ```ruby - # Change the existing external_url configuration - external_url 'https://<new_external_url>' - ``` + ```ruby + # Change the existing external_url configuration + external_url 'https://<new_external_url>' + ``` - NOTE: **Note** - Changing `external_url` won't prevent access via the old secondary URL, as - long as the secondary DNS records are still intact. + NOTE: **Note** + Changing `external_url` won't prevent access via the old secondary URL, as + long as the secondary DNS records are still intact. 1. Reconfigure the **secondary** node for the change to take effect: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` 1. Execute the command below to update the newly promoted **primary** node URL: - ```sh - gitlab-rake geo:update_primary_node_url - ``` + ```sh + gitlab-rake geo:update_primary_node_url + ``` - This command will use the changed `external_url` configuration defined - in `/etc/gitlab/gitlab.rb`. + This command will use the changed `external_url` configuration defined + in `/etc/gitlab/gitlab.rb`. 1. Verify you can connect to the newly promoted **primary** using its URL. If you updated the DNS records for the primary domain, these changes may @@ -231,62 +233,61 @@ and after that you also need two extra steps. 1. SSH into the new **primary** node and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Edit `/etc/gitlab/gitlab.rb` - ```ruby - ## Enable a Geo Primary role (if you haven't yet) - roles ['geo_primary_role'] + ```ruby + ## Enable a Geo Primary role (if you haven't yet) + roles ['geo_primary_role'] - ## - # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be - # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32'] - ## - postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32'] + ## + # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be + # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32'] + ## + postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32'] - # Every secondary server needs to have its own slot so specify the number of secondary nodes you're going to have - postgresql['max_replication_slots'] = 1 + # Every secondary server needs to have its own slot so specify the number of secondary nodes you're going to have + postgresql['max_replication_slots'] = 1 - ## - ## Disable automatic database migrations temporarily - ## (until PostgreSQL is restarted and listening on the private address). - ## - gitlab_rails['auto_migrate'] = false + ## + ## Disable automatic database migrations temporarily + ## (until PostgreSQL is restarted and listening on the private address). + ## + gitlab_rails['auto_migrate'] = false + ``` - ``` - - (For more details about these settings you can read [Configure the primary server][configure-the-primary-server]) + (For more details about these settings you can read [Configure the primary server][configure-the-primary-server]) 1. Save the file and reconfigure GitLab for the database listen changes and the replication slot changes to be applied. - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` - Restart PostgreSQL for its changes to take effect: + Restart PostgreSQL for its changes to take effect: - ```sh - gitlab-ctl restart postgresql - ``` + ```sh + gitlab-ctl restart postgresql + ``` 1. Re-enable migrations now that PostgreSQL is restarted and listening on the private address. - Edit `/etc/gitlab/gitlab.rb` and **change** the configuration to `true`: + Edit `/etc/gitlab/gitlab.rb` and **change** the configuration to `true`: - ```ruby - gitlab_rails['auto_migrate'] = true - ``` + ```ruby + gitlab_rails['auto_migrate'] = true + ``` - Save the file and reconfigure GitLab: + Save the file and reconfigure GitLab: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` ### Step 2. Initiate the replication process diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md index b8071b5993f..c1a95157f8d 100644 --- a/doc/administration/geo/disaster_recovery/planned_failover.md +++ b/doc/administration/geo/disaster_recovery/planned_failover.md @@ -143,26 +143,26 @@ access to the **primary** node during the maintenance window. all HTTP, HTTPS and SSH traffic to/from the **primary** node, **except** for your IP and the **secondary** node's IP. - For instance, you might run the following commands on the server(s) making up your **primary** node: + For instance, you might run the following commands on the server(s) making up your **primary** node: - ```sh - sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 22 -j ACCEPT - sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 22 -j ACCEPT - sudo iptables -A INPUT --destination-port 22 -j REJECT + ```sh + sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 22 -j ACCEPT + sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 22 -j ACCEPT + sudo iptables -A INPUT --destination-port 22 -j REJECT - sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 80 -j ACCEPT - sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 80 -j ACCEPT - sudo iptables -A INPUT --tcp-dport 80 -j REJECT + sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 80 -j ACCEPT + sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 80 -j ACCEPT + sudo iptables -A INPUT --tcp-dport 80 -j REJECT - sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 443 -j ACCEPT - sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 443 -j ACCEPT - sudo iptables -A INPUT --tcp-dport 443 -j REJECT - ``` + sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 443 -j ACCEPT + sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 443 -j ACCEPT + sudo iptables -A INPUT --tcp-dport 443 -j REJECT + ``` - From this point, users will be unable to view their data or make changes on the - **primary** node. They will also be unable to log in to the **secondary** node. - However, existing sessions will work for the remainder of the maintenance period, and - public data will be accessible throughout. + From this point, users will be unable to view their data or make changes on the + **primary** node. They will also be unable to log in to the **secondary** node. + However, existing sessions will work for the remainder of the maintenance period, and + public data will be accessible throughout. 1. Verify the **primary** node is blocked to HTTP traffic by visiting it in browser via another IP. The server should refuse connection. @@ -187,10 +187,11 @@ access to the **primary** node during the maintenance window. before it is completed will cause the work to be lost. 1. On the **primary** node, navigate to **Admin Area > Geo** and wait for the following conditions to be true of the **secondary** node you are failing over to: - - All replication meters to each 100% replicated, 0% failures. - - All verification meters reach 100% verified, 0% failures. - - Database replication lag is 0ms. - - The Geo log cursor is up to date (0 events behind). + + - All replication meters to each 100% replicated, 0% failures. + - All verification meters reach 100% verified, 0% failures. + - Database replication lag is 0ms. + - The Geo log cursor is up to date (0 events behind). 1. On the **secondary** node, navigate to **Admin Area > Monitoring > Background Jobs > Queues** and wait for all the `geo` queues to drop to 0 queued and 0 running jobs. diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md index 3d4f69d3abe..dd5e09c0dd7 100644 --- a/doc/administration/geo/replication/configuration.md +++ b/doc/administration/geo/replication/configuration.md @@ -16,11 +16,10 @@ The basic steps of configuring a **secondary** node are to: You are encouraged to first read through all the steps before executing them in your testing/production environment. -> **Notes:** -> - **Do not** setup any custom authentication for the **secondary** nodes. This will be - handled by the **primary** node. -> - Any change that requires access to the **Admin Area** needs to be done in the - **primary** node because the **secondary** node is a read-only replica. +NOTE: **Note:** +**Do not** set up any custom authentication for the **secondary** nodes. This will be handled by the **primary** node. +Any change that requires access to the **Admin Area** needs to be done in the +**primary** node because the **secondary** node is a read-only replica. ### Step 1. Manually replicate secret GitLab values @@ -31,47 +30,47 @@ they must be manually replicated to the **secondary** node. 1. SSH into the **primary** node, and execute the command below: - ```sh - sudo cat /etc/gitlab/gitlab-secrets.json - ``` + ```sh + sudo cat /etc/gitlab/gitlab-secrets.json + ``` - This will display the secrets that need to be replicated, in JSON format. + This will display the secrets that need to be replicated, in JSON format. 1. SSH into the **secondary** node and login as the `root` user: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Make a backup of any existing secrets: - ```sh - mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F` - ``` + ```sh + mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F` + ``` 1. Copy `/etc/gitlab/gitlab-secrets.json` from the **primary** node to the **secondary** node, or copy-and-paste the file contents between nodes: - ```sh - sudo editor /etc/gitlab/gitlab-secrets.json + ```sh + sudo editor /etc/gitlab/gitlab-secrets.json - # paste the output of the `cat` command you ran on the primary - # save and exit - ``` + # paste the output of the `cat` command you ran on the primary + # save and exit + ``` 1. Ensure the file permissions are correct: - ```sh - chown root:root /etc/gitlab/gitlab-secrets.json - chmod 0600 /etc/gitlab/gitlab-secrets.json - ``` + ```sh + chown root:root /etc/gitlab/gitlab-secrets.json + chmod 0600 /etc/gitlab/gitlab-secrets.json + ``` 1. Reconfigure the **secondary** node for the change to take effect: - ```sh - gitlab-ctl reconfigure - gitlab-ctl restart - ``` + ```sh + gitlab-ctl reconfigure + gitlab-ctl restart + ``` ### Step 2. Manually replicate the **primary** node's SSH host keys @@ -89,80 +88,80 @@ keys must be manually replicated to the **secondary** node. 1. SSH into the **secondary** node and login as the `root` user: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Make a backup of any existing SSH host keys: - ```sh - find /etc/ssh -iname ssh_host_* -exec cp {} {}.backup.`date +%F` \; - ``` + ```sh + find /etc/ssh -iname ssh_host_* -exec cp {} {}.backup.`date +%F` \; + ``` 1. Copy OpenSSH host keys from the **primary** node: - If you can access your **primary** node using the **root** user: + If you can access your **primary** node using the **root** user: - ```sh - # Run this from the secondary node, change `<primary_node_fqdn>` for the IP or FQDN of the server - scp root@<primary_node_fqdn>:/etc/ssh/ssh_host_*_key* /etc/ssh - ``` + ```sh + # Run this from the secondary node, change `<primary_node_fqdn>` for the IP or FQDN of the server + scp root@<primary_node_fqdn>:/etc/ssh/ssh_host_*_key* /etc/ssh + ``` - If you only have access through a user with **sudo** privileges: + If you only have access through a user with **sudo** privileges: - ```sh - # Run this from your primary node: - sudo tar --transform 's/.*\///g' -zcvf ~/geo-host-key.tar.gz /etc/ssh/ssh_host_*_key* + ```sh + # Run this from your primary node: + sudo tar --transform 's/.*\///g' -zcvf ~/geo-host-key.tar.gz /etc/ssh/ssh_host_*_key* - # Run this from your secondary node: - scp <user_with_sudo>@<primary_node_fqdn>:geo-host-key.tar.gz . - tar zxvf ~/geo-host-key.tar.gz -C /etc/ssh - ``` + # Run this from your secondary node: + scp <user_with_sudo>@<primary_node_fqdn>:geo-host-key.tar.gz . + tar zxvf ~/geo-host-key.tar.gz -C /etc/ssh + ``` 1. On your **secondary** node, ensure the file permissions are correct: - ```sh - chown root:root /etc/ssh/ssh_host_*_key* - chmod 0600 /etc/ssh/ssh_host_*_key* - ``` + ```sh + chown root:root /etc/ssh/ssh_host_*_key* + chmod 0600 /etc/ssh/ssh_host_*_key* + ``` 1. To verify key fingerprint matches, execute the following command on both nodes: - ```sh - for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done - ``` + ```sh + for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done + ``` - You should get an output similar to this one and they should be identical on both nodes: + You should get an output similar to this one and they should be identical on both nodes: - ```sh - 1024 SHA256:FEZX2jQa2bcsd/fn/uxBzxhKdx4Imc4raXrHwsbtP0M root@serverhostname (DSA) - 256 SHA256:uw98R35Uf+fYEQ/UnJD9Br4NXUFPv7JAUln5uHlgSeY root@serverhostname (ECDSA) - 256 SHA256:sqOUWcraZQKd89y/QQv/iynPTOGQxcOTIXU/LsoPmnM root@serverhostname (ED25519) - 2048 SHA256:qwa+rgir2Oy86QI+PZi/QVR+MSmrdrpsuH7YyKknC+s root@serverhostname (RSA) - ``` + ```sh + 1024 SHA256:FEZX2jQa2bcsd/fn/uxBzxhKdx4Imc4raXrHwsbtP0M root@serverhostname (DSA) + 256 SHA256:uw98R35Uf+fYEQ/UnJD9Br4NXUFPv7JAUln5uHlgSeY root@serverhostname (ECDSA) + 256 SHA256:sqOUWcraZQKd89y/QQv/iynPTOGQxcOTIXU/LsoPmnM root@serverhostname (ED25519) + 2048 SHA256:qwa+rgir2Oy86QI+PZi/QVR+MSmrdrpsuH7YyKknC+s root@serverhostname (RSA) + ``` 1. Verify that you have the correct public keys for the existing private keys: - ```sh - # This will print the fingerprint for private keys: - for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done + ```sh + # This will print the fingerprint for private keys: + for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done - # This will print the fingerprint for public keys: - for file in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf $file; done - ``` + # This will print the fingerprint for public keys: + for file in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf $file; done + ``` - NOTE: **Note**: - The output for private keys and public keys command should generate the same fingerprint. + NOTE: **Note:** + The output for private keys and public keys command should generate the same fingerprint. 1. Restart sshd on your **secondary** node: - ```sh - # Debian or Ubuntu installations - sudo service ssh reload + ```sh + # Debian or Ubuntu installations + sudo service ssh reload - # CentOS installations - sudo service sshd reload - ``` + # CentOS installations + sudo service sshd reload + ``` ### Step 3. Add the **secondary** node @@ -176,22 +175,22 @@ keys must be manually replicated to the **secondary** node. 1. Click the **Add node** button. 1. SSH into your GitLab **secondary** server and restart the services: - ```sh - gitlab-ctl restart - ``` + ```sh + gitlab-ctl restart + ``` - Check if there are any common issue with your Geo setup by running: + Check if there are any common issue with your Geo setup by running: - ```sh - gitlab-rake gitlab:geo:check - ``` + ```sh + gitlab-rake gitlab:geo:check + ``` 1. SSH into your **primary** server and login as root to verify the **secondary** node is reachable or there are any common issue with your Geo setup: - ```sh - gitlab-rake gitlab:geo:check - ``` + ```sh + gitlab-rake gitlab:geo:check + ``` Once added to the admin panel and restarted, the **secondary** node will automatically start replicating missing data from the **primary** node in a process known as **backfill**. @@ -250,9 +249,8 @@ The two most obvious issues that can become apparent in the dashboard are: 1. Database replication not working well. 1. Instance to instance notification not working. In that case, it can be something of the following: - - You are using a custom certificate or custom CA (see the - [troubleshooting document]). - - The instance is firewalled (check your firewall rules). + - You are using a custom certificate or custom CA (see the [troubleshooting document](troubleshooting.md)). + - The instance is firewalled (check your firewall rules). Please note that disabling a **secondary** node will stop the synchronization process. @@ -304,5 +302,4 @@ See the [troubleshooting document](troubleshooting.md). [gitlab-org/gitlab-ee#3789]: https://gitlab.com/gitlab-org/gitlab-ee/issues/3789 [gitlab-com/infrastructure#2821]: https://gitlab.com/gitlab-com/infrastructure/issues/2821 [omnibus-ssl]: https://docs.gitlab.com/omnibus/settings/ssl.html -[troubleshooting document]: troubleshooting.md [using-geo]: using_a_geo_server.md diff --git a/doc/administration/geo/replication/database.md b/doc/administration/geo/replication/database.md index 6658c37752a..021ed2d9f3c 100644 --- a/doc/administration/geo/replication/database.md +++ b/doc/administration/geo/replication/database.md @@ -52,186 +52,188 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o 1. SSH into your GitLab **primary** server and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Execute the command below to define the node as **primary** node: - ```sh - gitlab-ctl set-geo-primary-node - ``` + ```sh + gitlab-ctl set-geo-primary-node + ``` - This command will use your defined `external_url` in `/etc/gitlab/gitlab.rb`. + This command will use your defined `external_url` in `/etc/gitlab/gitlab.rb`. 1. GitLab 10.4 and up only: Do the following to make sure the `gitlab` database user has a password defined: - Generate a MD5 hash of the desired password: + Generate a MD5 hash of the desired password: - ```sh - gitlab-ctl pg-password-md5 gitlab - # Enter password: <your_password_here> - # Confirm password: <your_password_here> - # fca0b89a972d69f00eb3ec98a5838484 - ``` + ```sh + gitlab-ctl pg-password-md5 gitlab + # Enter password: <your_password_here> + # Confirm password: <your_password_here> + # fca0b89a972d69f00eb3ec98a5838484 + ``` - Edit `/etc/gitlab/gitlab.rb`: + Edit `/etc/gitlab/gitlab.rb`: - ```ruby - # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` - postgresql['sql_user_password'] = '<md5_hash_of_your_password>' + ```ruby + # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` + postgresql['sql_user_password'] = '<md5_hash_of_your_password>' - # Every node that runs Unicorn or Sidekiq needs to have the database - # password specified as below. If you have a high-availability setup, this - # must be present in all application nodes. - gitlab_rails['db_password'] = '<your_password_here>' - ``` + # Every node that runs Unicorn or Sidekiq needs to have the database + # password specified as below. If you have a high-availability setup, this + # must be present in all application nodes. + gitlab_rails['db_password'] = '<your_password_here>' + ``` 1. Omnibus GitLab already has a [replication user] called `gitlab_replicator`. You must set the password for this user manually. You will be prompted to enter a password: - ```sh - gitlab-ctl set-replication-password - ``` + ```sh + gitlab-ctl set-replication-password + ``` - This command will also read the `postgresql['sql_replication_user']` Omnibus - setting in case you have changed `gitlab_replicator` username to something - else. + This command will also read the `postgresql['sql_replication_user']` Omnibus + setting in case you have changed `gitlab_replicator` username to something + else. - If you are using an external database not managed by Omnibus GitLab, you need - to create the replicator user and define a password to it manually: + If you are using an external database not managed by Omnibus GitLab, you need + to create the replicator user and define a password to it manually: - ```sql - --- Create a new user 'replicator' - CREATE USER gitlab_replicator; + ```sql + --- Create a new user 'replicator' + CREATE USER gitlab_replicator; - --- Set/change a password and grants replication privilege - ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<replication_password>'; - ``` + --- Set/change a password and grants replication privilege + ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<replication_password>'; + ``` 1. Configure PostgreSQL to listen on network interfaces: - For security reasons, PostgreSQL does not listen on any network interfaces - by default. However, Geo requires the **secondary** node to be able to - connect to the **primary** node's database. For this reason, we need the address of - each node. Note: For external PostgreSQL instances, see [additional instructions](external_database.md). - - If you are using a cloud provider, you can lookup the addresses for each - Geo node through your cloud provider's management console. - - To lookup the address of a Geo node, SSH in to the Geo node and execute: - - ```sh - ## - ## Private address - ## - ip route get 255.255.255.255 | awk '{print "Private address:", $NF; exit}' - - ## - ## Public address - ## - echo "External address: $(curl --silent ipinfo.io/ip)" - ``` - - In most cases, the following addresses will be used to configure GitLab - Geo: - - | Configuration | Address | - |:----------------------------------------|:------------------------------------------------------| - | `postgresql['listen_address']` | **Primary** node's public or VPC private address. | - | `postgresql['md5_auth_cidr_addresses']` | **Secondary** node's public or VPC private addresses. | - - If you are using Google Cloud Platform, SoftLayer, or any other vendor that - provides a virtual private cloud (VPC) you can use the **secondary** node's private - address (corresponds to "internal address" for Google Cloud Platform) for - `postgresql['md5_auth_cidr_addresses']` and `postgresql['listen_address']`. - - The `listen_address` option opens PostgreSQL up to network connections - with the interface corresponding to the given address. See [the PostgreSQL - documentation][pg-docs-runtime-conn] for more details. - - Depending on your network configuration, the suggested addresses may not - be correct. If your **primary** node and **secondary** nodes connect over a local - area network, or a virtual network connecting availability zones like - [Amazon's VPC](https://aws.amazon.com/vpc/) or [Google's VPC](https://cloud.google.com/vpc/) - you should use the **secondary** node's private address for `postgresql['md5_auth_cidr_addresses']`. - - Edit `/etc/gitlab/gitlab.rb` and add the following, replacing the IP - addresses with addresses appropriate to your network configuration: - - ```ruby - ## - ## Geo Primary role - ## - configure dependent flags automatically to enable Geo - ## - roles ['geo_primary_role'] - - ## - ## Primary address - ## - replace '<primary_node_ip>' with the public or VPC address of your Geo primary node - ## - postgresql['listen_address'] = '<primary_node_ip>' - - ## - # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be - # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32'] - ## - postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32'] - - ## - ## Replication settings - ## - set this to be the number of Geo secondary nodes you have - ## - postgresql['max_replication_slots'] = 1 - # postgresql['max_wal_senders'] = 10 - # postgresql['wal_keep_segments'] = 10 - - ## - ## Disable automatic database migrations temporarily - ## (until PostgreSQL is restarted and listening on the private address). - ## - gitlab_rails['auto_migrate'] = false - ``` + For security reasons, PostgreSQL does not listen on any network interfaces + by default. However, Geo requires the **secondary** node to be able to + connect to the **primary** node's database. For this reason, we need the address of + each node. + + NOTE: **Note:** For external PostgreSQL instances, see [additional instructions](external_database.md). + + If you are using a cloud provider, you can lookup the addresses for each + Geo node through your cloud provider's management console. + + To lookup the address of a Geo node, SSH in to the Geo node and execute: + + ```sh + ## + ## Private address + ## + ip route get 255.255.255.255 | awk '{print "Private address:", $NF; exit}' + + ## + ## Public address + ## + echo "External address: $(curl --silent ipinfo.io/ip)" + ``` + + In most cases, the following addresses will be used to configure GitLab + Geo: + + | Configuration | Address | + |:----------------------------------------|:------------------------------------------------------| + | `postgresql['listen_address']` | **Primary** node's public or VPC private address. | + | `postgresql['md5_auth_cidr_addresses']` | **Secondary** node's public or VPC private addresses. | + + If you are using Google Cloud Platform, SoftLayer, or any other vendor that + provides a virtual private cloud (VPC) you can use the **secondary** node's private + address (corresponds to "internal address" for Google Cloud Platform) for + `postgresql['md5_auth_cidr_addresses']` and `postgresql['listen_address']`. + + The `listen_address` option opens PostgreSQL up to network connections + with the interface corresponding to the given address. See [the PostgreSQL + documentation][pg-docs-runtime-conn] for more details. + + Depending on your network configuration, the suggested addresses may not + be correct. If your **primary** node and **secondary** nodes connect over a local + area network, or a virtual network connecting availability zones like + [Amazon's VPC](https://aws.amazon.com/vpc/) or [Google's VPC](https://cloud.google.com/vpc/) + you should use the **secondary** node's private address for `postgresql['md5_auth_cidr_addresses']`. + + Edit `/etc/gitlab/gitlab.rb` and add the following, replacing the IP + addresses with addresses appropriate to your network configuration: + + ```ruby + ## + ## Geo Primary role + ## - configure dependent flags automatically to enable Geo + ## + roles ['geo_primary_role'] + + ## + ## Primary address + ## - replace '<primary_node_ip>' with the public or VPC address of your Geo primary node + ## + postgresql['listen_address'] = '<primary_node_ip>' + + ## + # Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be + # public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32'] + ## + postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32'] + + ## + ## Replication settings + ## - set this to be the number of Geo secondary nodes you have + ## + postgresql['max_replication_slots'] = 1 + # postgresql['max_wal_senders'] = 10 + # postgresql['wal_keep_segments'] = 10 + + ## + ## Disable automatic database migrations temporarily + ## (until PostgreSQL is restarted and listening on the private address). + ## + gitlab_rails['auto_migrate'] = false + ``` 1. Optional: If you want to add another **secondary** node, the relevant setting would look like: - ```ruby - postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32', '<another_secondary_node_ip>/32'] - ``` + ```ruby + postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32', '<another_secondary_node_ip>/32'] + ``` - You may also want to edit the `wal_keep_segments` and `max_wal_senders` to - match your database replication requirements. Consult the [PostgreSQL - - Replication documentation][pg-docs-runtime-replication] - for more information. + You may also want to edit the `wal_keep_segments` and `max_wal_senders` to + match your database replication requirements. Consult the [PostgreSQL - + Replication documentation][pg-docs-runtime-replication] + for more information. 1. Save the file and reconfigure GitLab for the database listen changes and the replication slot changes to be applied: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` - Restart PostgreSQL for its changes to take effect: + Restart PostgreSQL for its changes to take effect: - ```sh - gitlab-ctl restart postgresql - ``` + ```sh + gitlab-ctl restart postgresql + ``` 1. Re-enable migrations now that PostgreSQL is restarted and listening on the private address. - Edit `/etc/gitlab/gitlab.rb` and **change** the configuration to `true`: + Edit `/etc/gitlab/gitlab.rb` and **change** the configuration to `true`: - ```ruby - gitlab_rails['auto_migrate'] = true - ``` + ```ruby + gitlab_rails['auto_migrate'] = true + ``` - Save the file and reconfigure GitLab: + Save the file and reconfigure GitLab: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` 1. Now that the PostgreSQL server is set up to accept remote connections, run `netstat -plnt | grep 5432` to make sure that PostgreSQL is listening on port @@ -241,143 +243,143 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o will be used automatically to protect your PostgreSQL traffic from eavesdroppers, but to protect against active ("man-in-the-middle") attackers, the **secondary** node needs a copy of the certificate. Make a copy of the PostgreSQL - `server.crt` file on the **primary** node by running this command: + `server.crt` file on the **primary** node by running this command: - ```sh - cat ~gitlab-psql/data/server.crt - ``` + ```sh + cat ~gitlab-psql/data/server.crt + ``` - Copy the output into a clipboard or into a local file. You - will need it when setting up the **secondary** node! The certificate is not sensitive - data. + Copy the output into a clipboard or into a local file. You + will need it when setting up the **secondary** node! The certificate is not sensitive + data. ### Step 2. Configure the **secondary** server 1. SSH into your GitLab **secondary** server and login as root: - ``` - sudo -i - ``` + ``` + sudo -i + ``` 1. Stop application server and Sidekiq - ``` - gitlab-ctl stop unicorn - gitlab-ctl stop sidekiq - ``` + ``` + gitlab-ctl stop unicorn + gitlab-ctl stop sidekiq + ``` - NOTE: **Note**: - This step is important so we don't try to execute anything before the node is fully configured. + NOTE: **Note:** + This step is important so we don't try to execute anything before the node is fully configured. 1. [Check TCP connectivity][rake-maintenance] to the **primary** node's PostgreSQL server: - ```sh - gitlab-rake gitlab:tcp_check[<primary_node_ip>,5432] - ``` + ```sh + gitlab-rake gitlab:tcp_check[<primary_node_ip>,5432] + ``` - NOTE: **Note**: - If this step fails, you may be using the wrong IP address, or a firewall may - be preventing access to the server. Check the IP address, paying close - attention to the difference between public and private addresses and ensure - that, if a firewall is present, the **secondary** node is permitted to connect to the - **primary** node on port 5432. + NOTE: **Note:** + If this step fails, you may be using the wrong IP address, or a firewall may + be preventing access to the server. Check the IP address, paying close + attention to the difference between public and private addresses and ensure + that, if a firewall is present, the **secondary** node is permitted to connect to the + **primary** node on port 5432. 1. Create a file `server.crt` in the **secondary** server, with the content you got on the last step of the **primary** node's setup: - ``` - editor server.crt - ``` + ``` + editor server.crt + ``` 1. Set up PostgreSQL TLS verification on the **secondary** node: - Install the `server.crt` file: + Install the `server.crt` file: - ```sh - install \ - -D \ - -o gitlab-psql \ - -g gitlab-psql \ - -m 0400 \ - -T server.crt ~gitlab-psql/.postgresql/root.crt - ``` + ```sh + install \ + -D \ + -o gitlab-psql \ + -g gitlab-psql \ + -m 0400 \ + -T server.crt ~gitlab-psql/.postgresql/root.crt + ``` - PostgreSQL will now only recognize that exact certificate when verifying TLS - connections. The certificate can only be replicated by someone with access - to the private key, which is **only** present on the **primary** node. + PostgreSQL will now only recognize that exact certificate when verifying TLS + connections. The certificate can only be replicated by someone with access + to the private key, which is **only** present on the **primary** node. 1. Test that the `gitlab-psql` user can connect to the **primary** node's database (the default Omnibus database name is gitlabhq_production): - ```sh - sudo \ - -u gitlab-psql /opt/gitlab/embedded/bin/psql \ - --list \ - -U gitlab_replicator \ - -d "dbname=gitlabhq_production sslmode=verify-ca" \ - -W \ - -h <primary_node_ip> - ``` + ```sh + sudo \ + -u gitlab-psql /opt/gitlab/embedded/bin/psql \ + --list \ + -U gitlab_replicator \ + -d "dbname=gitlabhq_production sslmode=verify-ca" \ + -W \ + -h <primary_node_ip> + ``` - When prompted enter the password you set in the first step for the - `gitlab_replicator` user. If all worked correctly, you should see - the list of **primary** node's databases. + When prompted enter the password you set in the first step for the + `gitlab_replicator` user. If all worked correctly, you should see + the list of **primary** node's databases. - A failure to connect here indicates that the TLS configuration is incorrect. - Ensure that the contents of `~gitlab-psql/data/server.crt` on the **primary** node - match the contents of `~gitlab-psql/.postgresql/root.crt` on the **secondary** node. + A failure to connect here indicates that the TLS configuration is incorrect. + Ensure that the contents of `~gitlab-psql/data/server.crt` on the **primary** node + match the contents of `~gitlab-psql/.postgresql/root.crt` on the **secondary** node. 1. Configure PostgreSQL to enable FDW support: - This step is similar to how we configured the **primary** instance. - We need to enable this, to enable FDW support, even if using a single node. - - Edit `/etc/gitlab/gitlab.rb` and add the following, replacing the IP - addresses with addresses appropriate to your network configuration: - - ```ruby - ## - ## Geo Secondary role - ## - configure dependent flags automatically to enable Geo - ## - roles ['geo_secondary_role'] - - ## - ## Secondary address - ## - replace '<secondary_node_ip>' with the public or VPC address of your Geo secondary node - ## - postgresql['listen_address'] = '<secondary_node_ip>' - postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32'] - - ## - ## Database credentials password (defined previously in primary node) - ## - replicate same values here as defined in primary node - ## - postgresql['sql_user_password'] = '<md5_hash_of_your_password>' - gitlab_rails['db_password'] = '<your_password_here>' - - ## - ## Enable FDW support for the Geo Tracking Database (improves performance) - ## - geo_secondary['db_fdw'] = true - ``` - - For external PostgreSQL instances, see [additional instructions](external_database.md). - If you bring a former **primary** node back online to serve as a **secondary** node, then you also need to remove `roles ['geo_primary_role']` or `geo_primary_role['enable'] = true`. + This step is similar to how we configured the **primary** instance. + We need to enable this, to enable FDW support, even if using a single node. + + Edit `/etc/gitlab/gitlab.rb` and add the following, replacing the IP + addresses with addresses appropriate to your network configuration: + + ```ruby + ## + ## Geo Secondary role + ## - configure dependent flags automatically to enable Geo + ## + roles ['geo_secondary_role'] + + ## + ## Secondary address + ## - replace '<secondary_node_ip>' with the public or VPC address of your Geo secondary node + ## + postgresql['listen_address'] = '<secondary_node_ip>' + postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32'] + + ## + ## Database credentials password (defined previously in primary node) + ## - replicate same values here as defined in primary node + ## + postgresql['sql_user_password'] = '<md5_hash_of_your_password>' + gitlab_rails['db_password'] = '<your_password_here>' + + ## + ## Enable FDW support for the Geo Tracking Database (improves performance) + ## + geo_secondary['db_fdw'] = true + ``` + + For external PostgreSQL instances, see [additional instructions](external_database.md). + If you bring a former **primary** node back online to serve as a **secondary** node, then you also need to remove `roles ['geo_primary_role']` or `geo_primary_role['enable'] = true`. 1. Reconfigure GitLab for the changes to take effect: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` 1. Restart PostgreSQL for the IP change to take effect and reconfigure again: - ```sh - gitlab-ctl restart postgresql - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl restart postgresql + gitlab-ctl reconfigure + ``` - This last reconfigure will provision the FDW configuration and enable it. + This last reconfigure will provision the FDW configuration and enable it. ### Step 3. Initiate the replication process @@ -394,9 +396,9 @@ data before running `pg_basebackup`. 1. SSH into your GitLab **secondary** server and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Choose a database-friendly name to use for your **secondary** node to use as the replication slot name. For example, if your domain is @@ -404,38 +406,40 @@ data before running `pg_basebackup`. name as shown in the commands below. 1. Execute the command below to start a backup/restore and begin the replication - CAUTION: **Warning:** Each Geo **secondary** node must have its own unique replication slot name. - Using the same slot name between two secondaries will break PostgreSQL replication. - - ```sh - gitlab-ctl replicate-geo-database \ - --slot-name=<secondary_node_name> \ - --host=<primary_node_ip> - ``` - - When prompted, enter the _plaintext_ password you set up for the `gitlab_replicator` - user in the first step. - - This command also takes a number of additional options. You can use `--help` - to list them all, but here are a couple of tips: - - If PostgreSQL is listening on a non-standard port, add `--port=` as well. - - If your database is too large to be transferred in 30 minutes, you will need - to increase the timeout, e.g., `--backup-timeout=3600` if you expect the - initial replication to take under an hour. - - Pass `--sslmode=disable` to skip PostgreSQL TLS authentication altogether - (e.g., you know the network path is secure, or you are using a site-to-site - VPN). This is **not** safe over the public Internet! - - You can read more details about each `sslmode` in the - [PostgreSQL documentation][pg-docs-ssl]; - the instructions above are carefully written to ensure protection against - both passive eavesdroppers and active "man-in-the-middle" attackers. - - Change the `--slot-name` to the name of the replication slot - to be used on the **primary** database. The script will attempt to create the - replication slot automatically if it does not exist. - - If you're repurposing an old server into a Geo **secondary** node, you'll need to - add `--force` to the command line. - - When not in a production machine you can disable backup step if you - really sure this is what you want by adding `--skip-backup` + + CAUTION: **Warning:** Each Geo **secondary** node must have its own unique replication slot name. + Using the same slot name between two secondaries will break PostgreSQL replication. + + ```sh + gitlab-ctl replicate-geo-database \ + --slot-name=<secondary_node_name> \ + --host=<primary_node_ip> + ``` + + When prompted, enter the _plaintext_ password you set up for the `gitlab_replicator` + user in the first step. + + This command also takes a number of additional options. You can use `--help` + to list them all, but here are a couple of tips: + + - If PostgreSQL is listening on a non-standard port, add `--port=` as well. + - If your database is too large to be transferred in 30 minutes, you will need + to increase the timeout, e.g., `--backup-timeout=3600` if you expect the + initial replication to take under an hour. + - Pass `--sslmode=disable` to skip PostgreSQL TLS authentication altogether + (e.g., you know the network path is secure, or you are using a site-to-site + VPN). This is **not** safe over the public Internet! + - You can read more details about each `sslmode` in the + [PostgreSQL documentation][pg-docs-ssl]; + the instructions above are carefully written to ensure protection against + both passive eavesdroppers and active "man-in-the-middle" attackers. + - Change the `--slot-name` to the name of the replication slot + to be used on the **primary** database. The script will attempt to create the + replication slot automatically if it does not exist. + - If you're repurposing an old server into a Geo **secondary** node, you'll need to + add `--force` to the command line. + - When not in a production machine you can disable backup step if you + really sure this is what you want by adding `--skip-backup` The replication process is now complete. @@ -452,42 +456,42 @@ it will need a separate read-only user to make [PostgreSQL FDW queries][FDW] work: 1. On the **primary** Geo database, enter the PostgreSQL on the console as an - admin user. If you are using an Omnibus-managed database, log onto the **primary** - node that is running the PostgreSQL database (the default Omnibus database name is gitlabhq_production): + admin user. If you are using an Omnibus-managed database, log onto the **primary** + node that is running the PostgreSQL database (the default Omnibus database name is gitlabhq_production): - ```sh - sudo \ - -u gitlab-psql /opt/gitlab/embedded/bin/psql \ - -h /var/opt/gitlab/postgresql gitlabhq_production - ``` + ```sh + sudo \ + -u gitlab-psql /opt/gitlab/embedded/bin/psql \ + -h /var/opt/gitlab/postgresql gitlabhq_production + ``` 1. Then create the read-only user: - ```sql - -- NOTE: Use the password defined earlier - CREATE USER gitlab_geo_fdw WITH password 'mypassword'; - GRANT CONNECT ON DATABASE gitlabhq_production to gitlab_geo_fdw; - GRANT USAGE ON SCHEMA public TO gitlab_geo_fdw; - GRANT SELECT ON ALL TABLES IN SCHEMA public TO gitlab_geo_fdw; - GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO gitlab_geo_fdw; + ```sql + -- NOTE: Use the password defined earlier + CREATE USER gitlab_geo_fdw WITH password 'mypassword'; + GRANT CONNECT ON DATABASE gitlabhq_production to gitlab_geo_fdw; + GRANT USAGE ON SCHEMA public TO gitlab_geo_fdw; + GRANT SELECT ON ALL TABLES IN SCHEMA public TO gitlab_geo_fdw; + GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO gitlab_geo_fdw; - -- Tables created by "gitlab" should be made read-only for "gitlab_geo_fdw" - -- automatically. - ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON TABLES TO gitlab_geo_fdw; - ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON SEQUENCES TO gitlab_geo_fdw; - ``` + -- Tables created by "gitlab" should be made read-only for "gitlab_geo_fdw" + -- automatically. + ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON TABLES TO gitlab_geo_fdw; + ALTER DEFAULT PRIVILEGES FOR USER gitlab IN SCHEMA public GRANT SELECT ON SEQUENCES TO gitlab_geo_fdw; + ``` 1. On the **secondary** nodes, change `/etc/gitlab/gitlab.rb`: - ``` - geo_postgresql['fdw_external_user'] = 'gitlab_geo_fdw' - ``` + ``` + geo_postgresql['fdw_external_user'] = 'gitlab_geo_fdw' + ``` 1. Save the file and reconfigure GitLab for the changes to be applied: - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` ## Troubleshooting diff --git a/doc/administration/geo/replication/external_database.md b/doc/administration/geo/replication/external_database.md index 177ca68613e..452e4f490a6 100644 --- a/doc/administration/geo/replication/external_database.md +++ b/doc/administration/geo/replication/external_database.md @@ -4,7 +4,7 @@ This document is relevant if you are using a PostgreSQL instance that is *not managed by Omnibus*. This includes cloud-managed instances like AWS RDS, or manually installed and configured PostgreSQL instances. -NOTE: **Note**: +NOTE: **Note:** We strongly recommend running Omnibus-managed instances as they are actively developed and tested. We aim to be compatible with most external (not managed by Omnibus) databases but we do not guarantee compatibility. @@ -13,17 +13,17 @@ developed and tested. We aim to be compatible with most external 1. SSH into a GitLab **primary** application server and login as root: - ```sh - sudo -i - ``` + ```sh + sudo -i + ``` 1. Execute the command below to define the node as **primary** node: - ```sh - gitlab-ctl set-geo-primary-node - ``` + ```sh + gitlab-ctl set-geo-primary-node + ``` - This command will use your defined `external_url` in `/etc/gitlab/gitlab.rb`. + This command will use your defined `external_url` in `/etc/gitlab/gitlab.rb`. ### Configure the external database to be replicated @@ -101,26 +101,27 @@ To configure the connection to the external read-replica database and enable Log 1. SSH into a GitLab **secondary** application server and login as root: - ```bash - sudo -i - ``` + ```bash + sudo -i + ``` 1. Edit `/etc/gitlab/gitlab.rb` and add the following - ```ruby - ## - ## Geo Secondary role - ## - configure dependent flags automatically to enable Geo - ## - roles ['geo_secondary_role'] + ```ruby + ## + ## Geo Secondary role + ## - configure dependent flags automatically to enable Geo + ## + roles ['geo_secondary_role'] + + # note this is shared between both databases, + # make sure you define the same password in both + gitlab_rails['db_password'] = '<your_password_here>' - # note this is shared between both databases, - # make sure you define the same password in both - gitlab_rails['db_password'] = '<your_password_here>' + gitlab_rails['db_username'] = 'gitlab' + gitlab_rails['db_host'] = '<database_read_replica_host>' + ``` - gitlab_rails['db_username'] = 'gitlab' - gitlab_rails['db_host'] = '<database_read_replica_host>' - ``` 1. Save the file and [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) ### Configure the tracking database @@ -147,73 +148,72 @@ the tracking database on port 5432. 1. SSH into a GitLab **secondary** server and login as root: - ```bash - sudo -i - ``` + ```bash + sudo -i + ``` 1. Edit `/etc/gitlab/gitlab.rb` with the connection params and credentials for - the machine with the PostgreSQL instance: + the machine with the PostgreSQL instance: - ```ruby - geo_secondary['db_username'] = 'gitlab_geo' - geo_secondary['db_password'] = '<your_password_here>' + ```ruby + geo_secondary['db_username'] = 'gitlab_geo' + geo_secondary['db_password'] = '<your_password_here>' - geo_secondary['db_host'] = '<tracking_database_host>' - geo_secondary['db_port'] = <tracking_database_port> # change to the correct port - geo_secondary['db_fdw'] = true # enable FDW - geo_postgresql['enable'] = false # don't use internal managed instance - ``` + geo_secondary['db_host'] = '<tracking_database_host>' + geo_secondary['db_port'] = <tracking_database_port> # change to the correct port + geo_secondary['db_fdw'] = true # enable FDW + geo_postgresql['enable'] = false # don't use internal managed instance + ``` 1. Save the file and [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) 1. Run the tracking database migrations: - ```bash - gitlab-rake geo:db:create - gitlab-rake geo:db:migrate - ``` - -1. Configure the - [PostgreSQL FDW](https://www.postgresql.org/docs/9.6/static/postgres-fdw.html) - connection and credentials: - - Save the script below in a file, ex. `/tmp/geo_fdw.sh` and modify the connection - params to match your environment. Execute it to set up the FDW connection. - - ```bash - #!/bin/bash - - # Secondary Database connection params: - DB_HOST="<public_ip_or_vpc_private_ip>" - DB_NAME="gitlabhq_production" - DB_USER="gitlab" - DB_PASS="<your_password_here>" - DB_PORT="5432" - - # Tracking Database connection params: - GEO_DB_HOST="<public_ip_or_vpc_private_ip>" - GEO_DB_NAME="gitlabhq_geo_production" - GEO_DB_USER="gitlab_geo" - GEO_DB_PORT="5432" - - query_exec () { - gitlab-psql -h $GEO_DB_HOST -d $GEO_DB_NAME -p $GEO_DB_PORT -c "${1}" - } - - query_exec "CREATE EXTENSION postgres_fdw;" - query_exec "CREATE SERVER gitlab_secondary FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '${DB_HOST}', dbname '${DB_NAME}', port '${DB_PORT}');" - query_exec "CREATE USER MAPPING FOR ${GEO_DB_USER} SERVER gitlab_secondary OPTIONS (user '${DB_USER}', password '${DB_PASS}');" - query_exec "CREATE SCHEMA gitlab_secondary;" - query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};" - ``` - - NOTE: **Note:** The script template above uses `gitlab-psql` as it's intended to be executed from the Geo machine, - but you can change it to `psql` and run it from any machine that has access to the database. We also recommend using - `psql` for AWS RDS. + ```bash + gitlab-rake geo:db:create + gitlab-rake geo:db:migrate + ``` + +1. Configure the [PostgreSQL FDW](https://www.postgresql.org/docs/9.6/static/postgres-fdw.html) + connection and credentials: + + Save the script below in a file, ex. `/tmp/geo_fdw.sh` and modify the connection + params to match your environment. Execute it to set up the FDW connection. + + ```bash + #!/bin/bash + + # Secondary Database connection params: + DB_HOST="<public_ip_or_vpc_private_ip>" + DB_NAME="gitlabhq_production" + DB_USER="gitlab" + DB_PASS="<your_password_here>" + DB_PORT="5432" + + # Tracking Database connection params: + GEO_DB_HOST="<public_ip_or_vpc_private_ip>" + GEO_DB_NAME="gitlabhq_geo_production" + GEO_DB_USER="gitlab_geo" + GEO_DB_PORT="5432" + + query_exec () { + gitlab-psql -h $GEO_DB_HOST -d $GEO_DB_NAME -p $GEO_DB_PORT -c "${1}" + } + + query_exec "CREATE EXTENSION postgres_fdw;" + query_exec "CREATE SERVER gitlab_secondary FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '${DB_HOST}', dbname '${DB_NAME}', port '${DB_PORT}');" + query_exec "CREATE USER MAPPING FOR ${GEO_DB_USER} SERVER gitlab_secondary OPTIONS (user '${DB_USER}', password '${DB_PASS}');" + query_exec "CREATE SCHEMA gitlab_secondary;" + query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};" + ``` + + NOTE: **Note:** The script template above uses `gitlab-psql` as it's intended to be executed from the Geo machine, + but you can change it to `psql` and run it from any machine that has access to the database. We also recommend using + `psql` for AWS RDS. 1. Save the file and [restart GitLab](../../restart_gitlab.md#omnibus-gitlab-restart) 1. Populate the FDW tables: - ```bash - gitlab-rake geo:db:refresh_foreign_tables - ``` + ```bash + gitlab-rake geo:db:refresh_foreign_tables + ``` diff --git a/doc/administration/geo/replication/high_availability.md b/doc/administration/geo/replication/high_availability.md index 28ad89c4446..61e18df2480 100644 --- a/doc/administration/geo/replication/high_availability.md +++ b/doc/administration/geo/replication/high_availability.md @@ -50,17 +50,17 @@ The following steps enable a GitLab cluster to serve as the **primary** node. 1. Edit `/etc/gitlab/gitlab.rb` and add the following: - ```ruby - ## - ## Enable the Geo primary role - ## - roles ['geo_primary_role'] - - ## - ## Disable automatic migrations - ## - gitlab_rails['auto_migrate'] = false - ``` + ```ruby + ## + ## Enable the Geo primary role + ## + roles ['geo_primary_role'] + + ## + ## Disable automatic migrations + ## + gitlab_rails['auto_migrate'] = false + ``` After making these changes, [reconfigure GitLab][gitlab-reconfigure] so the changes take effect. @@ -107,36 +107,36 @@ Configure the [**secondary** database](database.md) as a read-only replica of the **primary** database. Use the following as a guide. 1. Edit `/etc/gitlab/gitlab.rb` in the replica database machine, and add the - following: - - ```ruby - ## - ## Configure the PostgreSQL role - ## - roles ['postgres_role'] - - ## - ## Secondary address - ## - replace '<secondary_node_ip>' with the public or VPC address of your Geo secondary node - ## - replace '<tracking_database_ip>' with the public or VPC address of your Geo tracking database node - ## - postgresql['listen_address'] = '<secondary_node_ip>' - postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32', '<tracking_database_ip>/32'] - - ## - ## Database credentials password (defined previously in primary node) - ## - replicate same values here as defined in primary node - ## - postgresql['sql_user_password'] = '<md5_hash_of_your_password>' - gitlab_rails['db_password'] = '<your_password_here>' - - ## - ## When running the Geo tracking database on a separate machine, disable it - ## here and allow connections from the tracking database host. And ensure - ## the tracking database IP is in postgresql['md5_auth_cidr_addresses'] above. - ## - geo_postgresql['enable'] = false - ``` + following: + + ```ruby + ## + ## Configure the PostgreSQL role + ## + roles ['postgres_role'] + + ## + ## Secondary address + ## - replace '<secondary_node_ip>' with the public or VPC address of your Geo secondary node + ## - replace '<tracking_database_ip>' with the public or VPC address of your Geo tracking database node + ## + postgresql['listen_address'] = '<secondary_node_ip>' + postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32', '<tracking_database_ip>/32'] + + ## + ## Database credentials password (defined previously in primary node) + ## - replicate same values here as defined in primary node + ## + postgresql['sql_user_password'] = '<md5_hash_of_your_password>' + gitlab_rails['db_password'] = '<your_password_here>' + + ## + ## When running the Geo tracking database on a separate machine, disable it + ## here and allow connections from the tracking database host. And ensure + ## the tracking database IP is in postgresql['md5_auth_cidr_addresses'] above. + ## + geo_postgresql['enable'] = false + ``` After making these changes, [reconfigure GitLab][gitlab-reconfigure] so the changes take effect. @@ -151,47 +151,47 @@ only a single machine, rather than as a PostgreSQL cluster. Configure the tracking database. 1. Edit `/etc/gitlab/gitlab.rb` in the tracking database machine, and add the - following: - - ```ruby - ## - ## Enable the Geo secondary tracking database - ## - geo_postgresql['enable'] = true - geo_postgresql['listen_address'] = '<ip_address_of_this_host>' - geo_postgresql['sql_user_password'] = '<tracking_database_password_md5_hash>' - - ## - ## Configure FDW connection to the replica database - ## - geo_secondary['db_fdw'] = true - geo_postgresql['fdw_external_password'] = '<replica_database_password_plaintext>' - geo_postgresql['md5_auth_cidr_addresses'] = ['<replica_database_ip>/32'] - gitlab_rails['db_host'] = '<replica_database_ip>' - - # Prevent reconfigure from attempting to run migrations on the replica DB - gitlab_rails['auto_migrate'] = false - - ## - ## Disable all other services that aren't needed, since we don't have a role - ## that does this. - ## - alertmanager['enable'] = false - consul['enable'] = false - gitaly['enable'] = false - gitlab_monitor['enable'] = false - gitlab_workhorse['enable'] = false - nginx['enable'] = false - node_exporter['enable'] = false - pgbouncer_exporter['enable'] = false - postgresql['enable'] = false - prometheus['enable'] = false - redis['enable'] = false - redis_exporter['enable'] = false - repmgr['enable'] = false - sidekiq['enable'] = false - unicorn['enable'] = false - ``` + following: + + ```ruby + ## + ## Enable the Geo secondary tracking database + ## + geo_postgresql['enable'] = true + geo_postgresql['listen_address'] = '<ip_address_of_this_host>' + geo_postgresql['sql_user_password'] = '<tracking_database_password_md5_hash>' + + ## + ## Configure FDW connection to the replica database + ## + geo_secondary['db_fdw'] = true + geo_postgresql['fdw_external_password'] = '<replica_database_password_plaintext>' + geo_postgresql['md5_auth_cidr_addresses'] = ['<replica_database_ip>/32'] + gitlab_rails['db_host'] = '<replica_database_ip>' + + # Prevent reconfigure from attempting to run migrations on the replica DB + gitlab_rails['auto_migrate'] = false + + ## + ## Disable all other services that aren't needed, since we don't have a role + ## that does this. + ## + alertmanager['enable'] = false + consul['enable'] = false + gitaly['enable'] = false + gitlab_monitor['enable'] = false + gitlab_workhorse['enable'] = false + nginx['enable'] = false + node_exporter['enable'] = false + pgbouncer_exporter['enable'] = false + postgresql['enable'] = false + prometheus['enable'] = false + redis['enable'] = false + redis_exporter['enable'] = false + repmgr['enable'] = false + sidekiq['enable'] = false + unicorn['enable'] = false + ``` After making these changes, [reconfigure GitLab][gitlab-reconfigure] so the changes take effect. @@ -211,50 +211,50 @@ following modifications: 1. Edit `/etc/gitlab/gitlab.rb` on each application server in the **secondary** cluster, and add the following: - ```ruby - ## - ## Enable the Geo secondary role - ## - roles ['geo_secondary_role', 'application_role'] - - ## - ## Disable automatic migrations - ## - gitlab_rails['auto_migrate'] = false - - ## - ## Configure the connection to the tracking DB. And disable application - ## servers from running tracking databases. - ## - geo_secondary['db_host'] = '<geo_tracking_db_host>' - geo_secondary['db_password'] = '<geo_tracking_db_password>' - geo_postgresql['enable'] = false - - ## - ## Configure connection to the streaming replica database, if you haven't - ## already - ## - gitlab_rails['db_host'] = '<replica_database_host>' - gitlab_rails['db_password'] = '<replica_database_password>' - - ## - ## Configure connection to Redis, if you haven't already - ## - gitlab_rails['redis_host'] = '<redis_host>' - gitlab_rails['redis_password'] = '<redis_password>' - - ## - ## If you are using custom users not managed by Omnibus, you need to specify - ## UIDs and GIDs like below, and ensure they match between servers in a - ## cluster to avoid permissions issues - ## - user['uid'] = 9000 - user['gid'] = 9000 - web_server['uid'] = 9001 - web_server['gid'] = 9001 - registry['uid'] = 9002 - registry['gid'] = 9002 - ``` + ```ruby + ## + ## Enable the Geo secondary role + ## + roles ['geo_secondary_role', 'application_role'] + + ## + ## Disable automatic migrations + ## + gitlab_rails['auto_migrate'] = false + + ## + ## Configure the connection to the tracking DB. And disable application + ## servers from running tracking databases. + ## + geo_secondary['db_host'] = '<geo_tracking_db_host>' + geo_secondary['db_password'] = '<geo_tracking_db_password>' + geo_postgresql['enable'] = false + + ## + ## Configure connection to the streaming replica database, if you haven't + ## already + ## + gitlab_rails['db_host'] = '<replica_database_host>' + gitlab_rails['db_password'] = '<replica_database_password>' + + ## + ## Configure connection to Redis, if you haven't already + ## + gitlab_rails['redis_host'] = '<redis_host>' + gitlab_rails['redis_password'] = '<redis_password>' + + ## + ## If you are using custom users not managed by Omnibus, you need to specify + ## UIDs and GIDs like below, and ensure they match between servers in a + ## cluster to avoid permissions issues + ## + user['uid'] = 9000 + user['gid'] = 9000 + web_server['uid'] = 9001 + web_server['gid'] = 9001 + registry['uid'] = 9002 + registry['gid'] = 9002 + ``` NOTE: **Note:** If you had set up PostgreSQL cluster using the omnibus package and you had set diff --git a/doc/administration/geo/replication/index.md b/doc/administration/geo/replication/index.md index 54377f7ae4e..8e1d1cb46ba 100644 --- a/doc/administration/geo/replication/index.md +++ b/doc/administration/geo/replication/index.md @@ -80,8 +80,8 @@ In this diagram: - If present, the [LDAP server](#ldap) should be configured to replicate for [Disaster Recovery](../disaster_recovery/index.md) scenarios. - A **secondary** node performs different type of synchronizations against the **primary** node, using a special authorization protected by JWT: - - Repositories are cloned/updated via Git over HTTPS. - - Attachments, LFS objects, and other files are downloaded via HTTPS using a private API endpoint. + - Repositories are cloned/updated via Git over HTTPS. + - Attachments, LFS objects, and other files are downloaded via HTTPS using a private API endpoint. From the perspective of a user performing Git operations: @@ -107,8 +107,8 @@ The following are required to run Geo: - An operating system that supports OpenSSH 6.9+ (needed for [fast lookup of authorized SSH keys in the database](../../operations/fast_ssh_key_lookup.md)) The following operating systems are known to ship with a current version of OpenSSH: - - [CentOS](https://www.centos.org) 7.4+ - - [Ubuntu](https://www.ubuntu.com) 16.04+ + - [CentOS](https://www.centos.org) 7.4+ + - [Ubuntu](https://www.ubuntu.com) 16.04+ - PostgreSQL 9.6+ with [FDW](https://www.postgresql.org/docs/9.6/postgres-fdw.html) support and [Streaming Replication](https://wiki.postgresql.org/wiki/Streaming_Replication) - Git 2.9+ diff --git a/doc/administration/geo/replication/remove_geo_node.md b/doc/administration/geo/replication/remove_geo_node.md index b190fe7d42d..6bdaad8f783 100644 --- a/doc/administration/geo/replication/remove_geo_node.md +++ b/doc/administration/geo/replication/remove_geo_node.md @@ -10,41 +10,42 @@ Once removed from the Geo admin page, you must stop and uninstall the **secondar 1. On the **secondary** node, stop GitLab: - ```bash - sudo gitlab-ctl stop - ``` + ```bash + sudo gitlab-ctl stop + ``` + 1. On the **secondary** node, uninstall GitLab: - ```bash - # Stop gitlab and remove its supervision process - sudo gitlab-ctl uninstall + ```bash + # Stop gitlab and remove its supervision process + sudo gitlab-ctl uninstall - # Debian/Ubuntu - sudo dpkg --remove gitlab-ee + # Debian/Ubuntu + sudo dpkg --remove gitlab-ee - # Redhat/Centos - sudo rpm --erase gitlab-ee - ``` + # Redhat/Centos + sudo rpm --erase gitlab-ee + ``` Once GitLab has been uninstalled from the **secondary** node, the replication slot must be dropped from the **primary** node's database as follows: 1. On the **primary** node, start a PostgreSQL console session: - ```bash - sudo gitlab-psql - ``` + ```bash + sudo gitlab-psql + ``` - NOTE: **Note:** - Using `gitlab-rails dbconsole` will not work, because managing replication slots requires superuser permissions. + NOTE: **Note:** + Using `gitlab-rails dbconsole` will not work, because managing replication slots requires superuser permissions. 1. Find the name of the relevant replication slot. This is the slot that is specified with `--slot-name` when running the replicate command: `gitlab-ctl replicate-geo-database`. - ```sql - SELECT * FROM pg_replication_slots; - ``` + ```sql + SELECT * FROM pg_replication_slots; + ``` 1. Remove the replication slot for the **secondary** node: - ```sql - SELECT pg_drop_replication_slot('<name_of_slot>'); - ``` + ```sql + SELECT pg_drop_replication_slot('<name_of_slot>'); + ``` diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md index 5bd6cc81362..c7c78407084 100644 --- a/doc/administration/geo/replication/troubleshooting.md +++ b/doc/administration/geo/replication/troubleshooting.md @@ -184,17 +184,17 @@ log data to build up in `pg_xlog`. Removing the unused slots can reduce the amou 1. Start a PostgreSQL console session: - ```sh - sudo gitlab-psql gitlabhq_production - ``` + ```sh + sudo gitlab-psql gitlabhq_production + ``` - > Note that using `gitlab-rails dbconsole` will not work, because managing replication slots requires superuser permissions. + Note: **Note:** Using `gitlab-rails dbconsole` will not work, because managing replication slots requires superuser permissions. 1. View your replication slots with: - ```sql - SELECT * FROM pg_replication_slots; - ``` + ```sql + SELECT * FROM pg_replication_slots; + ``` Slots where `active` is `f` are not active. @@ -204,9 +204,9 @@ Slots where `active` is `f` are not active. - If you are no longer using the slot (e.g. you no longer have Geo enabled), you can remove it with in the PostgreSQL console session: - ```sql - SELECT pg_drop_replication_slot('<name_of_extra_slot>'); - ``` + ```sql + SELECT pg_drop_replication_slot('<name_of_extra_slot>'); + ``` ### Very large repositories never successfully synchronize on the **secondary** node @@ -237,82 +237,82 @@ to start again from scratch, there are a few steps that can help you: 1. Stop Sidekiq and the Geo LogCursor - It's possible to make Sidekiq stop gracefully, but making it stop getting new jobs and - wait until the current jobs to finish processing. + It's possible to make Sidekiq stop gracefully, but making it stop getting new jobs and + wait until the current jobs to finish processing. - You need to send a **SIGTSTP** kill signal for the first phase and them a **SIGTERM** - when all jobs have finished. Otherwise just use the `gitlab-ctl stop` commands. + You need to send a **SIGTSTP** kill signal for the first phase and them a **SIGTERM** + when all jobs have finished. Otherwise just use the `gitlab-ctl stop` commands. - ```sh - gitlab-ctl status sidekiq - # run: sidekiq: (pid 10180) <- this is the PID you will use - kill -TSTP 10180 # change to the correct PID + ```sh + gitlab-ctl status sidekiq + # run: sidekiq: (pid 10180) <- this is the PID you will use + kill -TSTP 10180 # change to the correct PID - gitlab-ctl stop sidekiq - gitlab-ctl stop geo-logcursor - ``` + gitlab-ctl stop sidekiq + gitlab-ctl stop geo-logcursor + ``` - You can watch sidekiq logs to know when sidekiq jobs processing have finished: + You can watch sidekiq logs to know when sidekiq jobs processing have finished: - ```sh - gitlab-ctl tail sidekiq - ``` + ```sh + gitlab-ctl tail sidekiq + ``` 1. Rename repository storage folders and create new ones - ```sh - mv /var/opt/gitlab/git-data/repositories /var/opt/gitlab/git-data/repositories.old - mkdir -p /var/opt/gitlab/git-data/repositories - chown git:git /var/opt/gitlab/git-data/repositories - ``` + ```sh + mv /var/opt/gitlab/git-data/repositories /var/opt/gitlab/git-data/repositories.old + mkdir -p /var/opt/gitlab/git-data/repositories + chown git:git /var/opt/gitlab/git-data/repositories + ``` - TIP: **Tip** - You may want to remove the `/var/opt/gitlab/git-data/repositories.old` in the future - as soon as you confirmed that you don't need it anymore, to save disk space. + TIP: **Tip** + You may want to remove the `/var/opt/gitlab/git-data/repositories.old` in the future + as soon as you confirmed that you don't need it anymore, to save disk space. 1. _(Optional)_ Rename other data folders and create new ones - CAUTION: **Caution**: - You may still have files on the **secondary** node that have been removed from **primary** node but - removal have not been reflected. If you skip this step, they will never be removed - from this Geo node. + CAUTION: **Caution**: + You may still have files on the **secondary** node that have been removed from **primary** node but + removal have not been reflected. If you skip this step, they will never be removed + from this Geo node. - Any uploaded content like file attachments, avatars or LFS objects are stored in a - subfolder in one of the two paths below: + Any uploaded content like file attachments, avatars or LFS objects are stored in a + subfolder in one of the two paths below: - 1. /var/opt/gitlab/gitlab-rails/shared - 1. /var/opt/gitlab/gitlab-rails/uploads + - /var/opt/gitlab/gitlab-rails/shared + - /var/opt/gitlab/gitlab-rails/uploads - To rename all of them: + To rename all of them: - ```sh - gitlab-ctl stop + ```sh + gitlab-ctl stop - mv /var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-rails/shared.old - mkdir -p /var/opt/gitlab/gitlab-rails/shared + mv /var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-rails/shared.old + mkdir -p /var/opt/gitlab/gitlab-rails/shared - mv /var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/uploads.old - mkdir -p /var/opt/gitlab/gitlab-rails/uploads - ``` + mv /var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/uploads.old + mkdir -p /var/opt/gitlab/gitlab-rails/uploads + ``` - Reconfigure in order to recreate the folders and make sure permissions and ownership - are correctly + Reconfigure in order to recreate the folders and make sure permissions and ownership + are correctly - ```sh - gitlab-ctl reconfigure - ``` + ```sh + gitlab-ctl reconfigure + ``` 1. Reset the Tracking Database - ```sh - gitlab-rake geo:db:reset - ``` + ```sh + gitlab-rake geo:db:reset + ``` 1. Restart previously stopped services - ```sh - gitlab-ctl start - ``` + ```sh + gitlab-ctl start + ``` ## Fixing Foreign Data Wrapper errors @@ -345,108 +345,106 @@ To check the configuration: 1. Enter the database console: - ```sh - gitlab-geo-psql - ``` + ```sh + gitlab-geo-psql + ``` 1. Check whether any tables are present. If everything is working, you should see something like this: - ```sql - gitlabhq_geo_production=# SELECT * from information_schema.foreign_tables; - foreign_table_catalog | foreign_table_schema | foreign_table_name | foreign_server_catalog | foreign_server_n - ame - -------------------------+----------------------+-------------------------------------------------+-------------------------+----------------- - ---- - gitlabhq_geo_production | gitlab_secondary | abuse_reports | gitlabhq_geo_production | gitlab_secondary - gitlabhq_geo_production | gitlab_secondary | appearances | gitlabhq_geo_production | gitlab_secondary - gitlabhq_geo_production | gitlab_secondary | application_setting_terms | gitlabhq_geo_production | gitlab_secondary - gitlabhq_geo_production | gitlab_secondary | application_settings | gitlabhq_geo_production | gitlab_secondary - <snip> - ``` - - However, if the query returns with `0 rows`, then continue onto the next steps. + ```sql + gitlabhq_geo_production=# SELECT * from information_schema.foreign_tables; + foreign_table_catalog | foreign_table_schema | foreign_table_name | foreign_server_catalog | foreign_server_name + -------------------------+----------------------+-------------------------------------------------+-------------------------+--------------------- + gitlabhq_geo_production | gitlab_secondary | abuse_reports | gitlabhq_geo_production | gitlab_secondary + gitlabhq_geo_production | gitlab_secondary | appearances | gitlabhq_geo_production | gitlab_secondary + gitlabhq_geo_production | gitlab_secondary | application_setting_terms | gitlabhq_geo_production | gitlab_secondary + gitlabhq_geo_production | gitlab_secondary | application_settings | gitlabhq_geo_production | gitlab_secondary + <snip> + ``` + + However, if the query returns with `0 rows`, then continue onto the next steps. 1. Check that the foreign server mapping is correct via `\des+`. The results should look something like this: - ```sql - gitlabhq_geo_production=# \des+ - List of foreign servers - -[ RECORD 1 ]--------+------------------------------------------------------------ - Name | gitlab_secondary - Owner | gitlab-psql - Foreign-data wrapper | postgres_fdw - Access privileges | "gitlab-psql"=U/"gitlab-psql" + - | gitlab_geo=U/"gitlab-psql" - Type | - Version | - FDW Options | (host '0.0.0.0', port '5432', dbname 'gitlabhq_production') - Description | - ``` - - NOTE: **Note:** Pay particular attention to the host and port under - FDW options. That configuration should point to the Geo secondary - database. - - If you need to experiment with changing the host or password, the - following queries demonstrate how: - - ```sql - ALTER SERVER gitlab_secondary OPTIONS (SET host '<my_new_host>'); - ALTER SERVER gitlab_secondary OPTIONS (SET port 5432); - ``` - - If you change the host and/or port, you will also have to adjust the - following settings in `/etc/gitlab/gitlab.rb` and run `gitlab-ctl - reconfigure`: - - - `gitlab_rails['db_host']` - - `gitlab_rails['db_port']` + ```sql + gitlabhq_geo_production=# \des+ + List of foreign servers + -[ RECORD 1 ]--------+------------------------------------------------------------ + Name | gitlab_secondary + Owner | gitlab-psql + Foreign-data wrapper | postgres_fdw + Access privileges | "gitlab-psql"=U/"gitlab-psql" + + | gitlab_geo=U/"gitlab-psql" + Type | + Version | + FDW Options | (host '0.0.0.0', port '5432', dbname 'gitlabhq_production') + Description | + ``` + + NOTE: **Note:** Pay particular attention to the host and port under + FDW options. That configuration should point to the Geo secondary + database. + + If you need to experiment with changing the host or password, the + following queries demonstrate how: + + ```sql + ALTER SERVER gitlab_secondary OPTIONS (SET host '<my_new_host>'); + ALTER SERVER gitlab_secondary OPTIONS (SET port 5432); + ``` + + If you change the host and/or port, you will also have to adjust the + following settings in `/etc/gitlab/gitlab.rb` and run `gitlab-ctl + reconfigure`: + + - `gitlab_rails['db_host']` + - `gitlab_rails['db_port']` 1. Check that the user mapping is configured properly via `\deu+`: - ```sql - gitlabhq_geo_production=# \deu+ - List of user mappings - Server | User name | FDW Options - ------------------+------------+-------------------------------------------------------------------------------- - gitlab_secondary | gitlab_geo | ("user" 'gitlab', password 'YOUR-PASSWORD-HERE') - (1 row) - ``` + ```sql + gitlabhq_geo_production=# \deu+ + List of user mappings + Server | User name | FDW Options + ------------------+------------+-------------------------------------------------------------------------------- + gitlab_secondary | gitlab_geo | ("user" 'gitlab', password 'YOUR-PASSWORD-HERE') + (1 row) + ``` - Make sure the password is correct. You can test that logins work by running `psql`: + Make sure the password is correct. You can test that logins work by running `psql`: - ```sh - # Connect to the tracking database as the `gitlab_geo` user - sudo \ - -u git /opt/gitlab/embedded/bin/psql \ - -h /var/opt/gitlab/geo-postgresql \ - -p 5431 \ - -U gitlab_geo \ - -W \ - -d gitlabhq_geo_production - ``` + ```sh + # Connect to the tracking database as the `gitlab_geo` user + sudo \ + -u git /opt/gitlab/embedded/bin/psql \ + -h /var/opt/gitlab/geo-postgresql \ + -p 5431 \ + -U gitlab_geo \ + -W \ + -d gitlabhq_geo_production + ``` - If you need to correct the password, the following query shows how: + If you need to correct the password, the following query shows how: - ```sql - ALTER USER MAPPING FOR gitlab_geo SERVER gitlab_secondary OPTIONS (SET password '<my_new_password>'); - ``` + ```sql + ALTER USER MAPPING FOR gitlab_geo SERVER gitlab_secondary OPTIONS (SET password '<my_new_password>'); + ``` - If you change the user or password, you will also have to adjust the - following settings in `/etc/gitlab/gitlab.rb` and run `gitlab-ctl - reconfigure`: + If you change the user or password, you will also have to adjust the + following settings in `/etc/gitlab/gitlab.rb` and run `gitlab-ctl + reconfigure`: - - `gitlab_rails['db_username']` - - `gitlab_rails['db_password']` + - `gitlab_rails['db_username']` + - `gitlab_rails['db_password']` - If you are using [PgBouncer in front of the secondary - database](database.md#pgbouncer-support-optional), be sure to update - the following settings: + If you are using [PgBouncer in front of the secondary + database](database.md#pgbouncer-support-optional), be sure to update + the following settings: - - `geo_postgresql['fdw_external_user']` - - `geo_postgresql['fdw_external_password']` + - `geo_postgresql['fdw_external_user']` + - `geo_postgresql['fdw_external_password']` #### Manual reload of FDW schema @@ -456,34 +454,34 @@ reload of the FDW schema. To manually reload the FDW schema: 1. On the node running the Geo tracking database, enter the PostgreSQL console via the `gitlab_geo` user: - ```sh - sudo \ - -u git /opt/gitlab/embedded/bin/psql \ - -h /var/opt/gitlab/geo-postgresql \ - -p 5431 \ - -U gitlab_geo \ - -W \ - -d gitlabhq_geo_production - ``` + ```sh + sudo \ + -u git /opt/gitlab/embedded/bin/psql \ + -h /var/opt/gitlab/geo-postgresql \ + -p 5431 \ + -U gitlab_geo \ + -W \ + -d gitlabhq_geo_production + ``` - Be sure to adjust the port and hostname for your configuration. You - may be asked to enter a password. + Be sure to adjust the port and hostname for your configuration. You + may be asked to enter a password. 1. Reload the schema via: - ```sql - DROP SCHEMA IF EXISTS gitlab_secondary CASCADE; - CREATE SCHEMA gitlab_secondary; - GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO gitlab_geo; - IMPORT FOREIGN SCHEMA public FROM SERVER gitlab_secondary INTO gitlab_secondary; - ``` + ```sql + DROP SCHEMA IF EXISTS gitlab_secondary CASCADE; + CREATE SCHEMA gitlab_secondary; + GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO gitlab_geo; + IMPORT FOREIGN SCHEMA public FROM SERVER gitlab_secondary INTO gitlab_secondary; + ``` 1. Test that queries work: - ```sql - SELECT * from information_schema.foreign_tables; - SELECT * FROM gitlab_secondary.projects limit 1; - ``` + ```sql + SELECT * from information_schema.foreign_tables; + SELECT * FROM gitlab_secondary.projects limit 1; + ``` [database-start-replication]: database.md#step-3-initiate-the-replication-process [database-pg-replication]: database.md#postgresql-replication diff --git a/doc/administration/geo/replication/updating_the_geo_nodes.md b/doc/administration/geo/replication/updating_the_geo_nodes.md index 933a75c47d8..d56a59f4967 100644 --- a/doc/administration/geo/replication/updating_the_geo_nodes.md +++ b/doc/administration/geo/replication/updating_the_geo_nodes.md @@ -30,70 +30,70 @@ We now require this change as we use this password to enable the Foreign Data Wr the Geo Tracking Database. We are also improving security by disabling the use of **trust** authentication method. -1. **[primary]** Login to your **primary** node and run: +1. **(primary)** Login to your **primary** node and run: - ```sh - gitlab-ctl pg-password-md5 gitlab - # Enter password: <your_password_here> - # Confirm password: <your_password_here> - # fca0b89a972d69f00eb3ec98a5838484 - ``` + ```sh + gitlab-ctl pg-password-md5 gitlab + # Enter password: <your_password_here> + # Confirm password: <your_password_here> + # fca0b89a972d69f00eb3ec98a5838484 + ``` - Copy the generated hash and edit `/etc/gitlab/gitlab.rb`: + Copy the generated hash and edit `/etc/gitlab/gitlab.rb`: - ```ruby - # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` - postgresql['sql_user_password'] = '<md5_hash_of_your_password>' + ```ruby + # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` + postgresql['sql_user_password'] = '<md5_hash_of_your_password>' - # Every node that runs Unicorn or Sidekiq needs to have the database - # password specified as below. If you have a high-availability setup, this - # must be present in all application nodes. - gitlab_rails['db_password'] = '<your_password_here>' - ``` + # Every node that runs Unicorn or Sidekiq needs to have the database + # password specified as below. If you have a high-availability setup, this + # must be present in all application nodes. + gitlab_rails['db_password'] = '<your_password_here>' + ``` - Still in the configuration file, locate and remove the `trust_auth_cidr_address`: + Still in the configuration file, locate and remove the `trust_auth_cidr_address`: - ```ruby - postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','1.2.3.4/32'] # <- Remove this - ``` + ```ruby + postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','1.2.3.4/32'] # <- Remove this + ``` -1. **[primary]** Reconfigure and restart: +1. **(primary)** Reconfigure and restart: - ```sh - sudo gitlab-ctl reconfigure - sudo gitlab-ctl restart - ``` + ```sh + sudo gitlab-ctl reconfigure + sudo gitlab-ctl restart + ``` -1. **[secondary]** Login to all **secondary** nodes and edit `/etc/gitlab/gitlab.rb`: +1. **(secondary)** Login to all **secondary** nodes and edit `/etc/gitlab/gitlab.rb`: - ```ruby - # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` - postgresql['sql_user_password'] = '<md5_hash_of_your_password>' + ```ruby + # Fill with the hash generated by `gitlab-ctl pg-password-md5 gitlab` + postgresql['sql_user_password'] = '<md5_hash_of_your_password>' - # Every node that runs Unicorn or Sidekiq needs to have the database - # password specified as below. If you have a high-availability setup, this - # must be present in all application nodes. - gitlab_rails['db_password'] = '<your_password_here>' + # Every node that runs Unicorn or Sidekiq needs to have the database + # password specified as below. If you have a high-availability setup, this + # must be present in all application nodes. + gitlab_rails['db_password'] = '<your_password_here>' - # Enable Foreign Data Wrapper - geo_secondary['db_fdw'] = true + # Enable Foreign Data Wrapper + geo_secondary['db_fdw'] = true - # Secondary address in CIDR format, for example '5.6.7.8/32' - postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32'] - ``` + # Secondary address in CIDR format, for example '5.6.7.8/32' + postgresql['md5_auth_cidr_addresses'] = ['<secondary_node_ip>/32'] + ``` - Still in the configuration file, locate and remove the `trust_auth_cidr_address`: + Still in the configuration file, locate and remove the `trust_auth_cidr_address`: - ```ruby - postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','5.6.7.8/32'] # <- Remove this - ``` + ```ruby + postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','5.6.7.8/32'] # <- Remove this + ``` -1. **[secondary]** Reconfigure and restart: +1. **(secondary)** Reconfigure and restart: - ```sh - sudo gitlab-ctl reconfigure - sudo gitlab-ctl restart - ``` + ```sh + sudo gitlab-ctl reconfigure + sudo gitlab-ctl restart + ``` ## Upgrading to GitLab 10.5 @@ -169,11 +169,11 @@ After you've verified that HTTP/HTTPS replication is working, you should remove the now-unused SSH keys from your secondaries, as they may cause problems if the **secondary** node if ever promoted to a **primary** node: -1. **[secondary]** Login to **all** your **secondary** nodes and run: +1. **(secondary)** Login to **all** your **secondary** nodes and run: - ```ruby - sudo -u git -H rm ~git/.ssh/id_rsa ~git/.ssh/id_rsa.pub - ``` + ```ruby + sudo -u git -H rm ~git/.ssh/id_rsa ~git/.ssh/id_rsa.pub + ``` ### Hashed Storage @@ -236,12 +236,12 @@ instructions below. When in doubt, it does not hurt to do a resync. The easiest way to do this in Omnibus is the following: - 1. Make sure you have Omnibus GitLab on the **primary** server. - 1. Run `gitlab-ctl reconfigure` and `gitlab-ctl restart postgresql`. This will enable replication slots on the **primary** database. - 1. Check the steps about defining `postgresql['sql_user_password']`, `gitlab_rails['db_password']`. - 1. Make sure `postgresql['max_replication_slots']` matches the number of **secondary** Geo nodes locations. - 1. Install GitLab on the **secondary** server. - 1. Re-run the [database replication process][database-replication]. +1. Make sure you have Omnibus GitLab on the **primary** server. +1. Run `gitlab-ctl reconfigure` and `gitlab-ctl restart postgresql`. This will enable replication slots on the **primary** database. +1. Check the steps about defining `postgresql['sql_user_password']`, `gitlab_rails['db_password']`. +1. Make sure `postgresql['max_replication_slots']` matches the number of **secondary** Geo nodes locations. +1. Install GitLab on the **secondary** server. +1. Re-run the [database replication process][database-replication]. ## Special update notes for 9.0.x @@ -260,157 +260,154 @@ Make sure to follow the steps in the exact order as they appear below and pay extra attention in what node (either **primary** or **secondary**) you execute them! Each step is prepended with the relevant node for better clarity: -1. **[secondary]** Login to **all** your **secondary** nodes and stop all services: +1. **(secondary)** Login to **all** your **secondary** nodes and stop all services: - ```ruby - sudo gitlab-ctl stop - ``` + ```ruby + sudo gitlab-ctl stop + ``` -1. **[secondary]** Make a backup of the `recovery.conf` file on **all** +1. **(secondary)** Make a backup of the `recovery.conf` file on **all** **secondary** nodes to preserve PostgreSQL's credentials: - ```sh - sudo cp /var/opt/gitlab/postgresql/data/recovery.conf /var/opt/gitlab/ - ``` + ```sh + sudo cp /var/opt/gitlab/postgresql/data/recovery.conf /var/opt/gitlab/ + ``` -1. **[primary]** Update the **primary** node to GitLab 9.0 following the +1. **(primary)** Update the **primary** node to GitLab 9.0 following the [regular update docs][update]. At the end of the update, the **primary** node will be running with PostgreSQL 9.6. -1. **[primary]** To prevent a de-synchronization of the repository replication, +1. **(primary)** To prevent a de-synchronization of the repository replication, stop all services except `postgresql` as we will use it to re-initialize the **secondary** node's database: - ```sh - sudo gitlab-ctl stop - sudo gitlab-ctl start postgresql - ``` + ```sh + sudo gitlab-ctl stop + sudo gitlab-ctl start postgresql + ``` -1. **[secondary]** Run the following steps on each of the **secondary** nodes: +1. **(secondary)** Run the following steps on each of the **secondary** nodes: - 1. **[secondary]** Stop all services: + 1. **(secondary)** Stop all services: - ```sh - sudo gitlab-ctl stop - ``` + ```sh + sudo gitlab-ctl stop + ``` - 1. **[secondary]** Prevent running database migrations: + 1. **(secondary)** Prevent running database migrations: - ```sh - sudo touch /etc/gitlab/skip-auto-migrations - ``` + ```sh + sudo touch /etc/gitlab/skip-auto-migrations + ``` - 1. **[secondary]** Move the old database to another directory: + 1. **(secondary)** Move the old database to another directory: - ```sh - sudo mv /var/opt/gitlab/postgresql{,.bak} - ``` + ```sh + sudo mv /var/opt/gitlab/postgresql{,.bak} + ``` - 1. **[secondary]** Update to GitLab 9.0 following the [regular update docs][update]. - At the end of the update, the node will be running with PostgreSQL 9.6. + 1. **(secondary)** Update to GitLab 9.0 following the [regular update docs][update]. + At the end of the update, the node will be running with PostgreSQL 9.6. - 1. **[secondary]** Make sure all services are up: + 1. **(secondary)** Make sure all services are up: - ```sh - sudo gitlab-ctl start - ``` + ```sh + sudo gitlab-ctl start + ``` - 1. **[secondary]** Reconfigure GitLab: + 1. **(secondary)** Reconfigure GitLab: - ```sh - sudo gitlab-ctl reconfigure - ``` + ```sh + sudo gitlab-ctl reconfigure + ``` - 1. **[secondary]** Run the PostgreSQL upgrade command: + 1. **(secondary)** Run the PostgreSQL upgrade command: - ```sh - sudo gitlab-ctl pg-upgrade - ``` + ```sh + sudo gitlab-ctl pg-upgrade + ``` - 1. **[secondary]** See the stored credentials for the database that you will - need to re-initialize the replication: + 1. **(secondary)** See the stored credentials for the database that you will + need to re-initialize the replication: - ```sh - sudo grep -s primary_conninfo /var/opt/gitlab/recovery.conf - ``` + ```sh + sudo grep -s primary_conninfo /var/opt/gitlab/recovery.conf + ``` - 1. **[secondary]** Create the `replica.sh` script as described in the - [database configuration document][database-source-replication]. + 1. **(secondary)** Save the snippet below in a file, let's say `/tmp/replica.sh`. Modify the + embedded paths if necessary: - 1. 1. **[secondary]** Save the snippet below in a file, let's say `/tmp/replica.sh`. Modify the - embedded paths if necessary: + ``` + #!/bin/bash - ``` - #!/bin/bash + PORT="5432" + USER="gitlab_replicator" + echo --------------------------------------------------------------- + echo WARNING: Make sure this script is run from the secondary server + echo --------------------------------------------------------------- + echo + echo Enter the IP or FQDN of the primary PostgreSQL server + read HOST + echo Enter the password for $USER@$HOST + read -s PASSWORD + echo Enter the required sslmode + read SSLMODE - PORT="5432" - USER="gitlab_replicator" - echo --------------------------------------------------------------- - echo WARNING: Make sure this script is run from the secondary server - echo --------------------------------------------------------------- - echo - echo Enter the IP or FQDN of the primary PostgreSQL server - read HOST - echo Enter the password for $USER@$HOST - read -s PASSWORD - echo Enter the required sslmode - read SSLMODE + echo Stopping PostgreSQL and all GitLab services + sudo service gitlab stop + sudo service postgresql stop - echo Stopping PostgreSQL and all GitLab services - sudo service gitlab stop - sudo service postgresql stop + echo Backing up postgresql.conf + sudo -u postgres mv /var/opt/gitlab/postgresql/data/postgresql.conf /var/opt/gitlab/postgresql/ - echo Backing up postgresql.conf - sudo -u postgres mv /var/opt/gitlab/postgresql/data/postgresql.conf /var/opt/gitlab/postgresql/ + echo Cleaning up old cluster directory + sudo -u postgres rm -rf /var/opt/gitlab/postgresql/data - echo Cleaning up old cluster directory - sudo -u postgres rm -rf /var/opt/gitlab/postgresql/data + echo Starting base backup as the replicator user + echo Enter the password for $USER@$HOST + sudo -u postgres /opt/gitlab/embedded/bin/pg_basebackup -h $HOST -D /var/opt/gitlab/postgresql/data -U gitlab_replicator -v -x -P - echo Starting base backup as the replicator user - echo Enter the password for $USER@$HOST - sudo -u postgres /opt/gitlab/embedded/bin/pg_basebackup -h $HOST -D /var/opt/gitlab/postgresql/data -U gitlab_replicator -v -x -P + echo Writing recovery.conf file + sudo -u postgres bash -c "cat > /var/opt/gitlab/postgresql/data/recovery.conf <<- _EOF1_ + standby_mode = 'on' + primary_conninfo = 'host=$HOST port=$PORT user=$USER password=$PASSWORD sslmode=$SSLMODE' + _EOF1_ + " - echo Writing recovery.conf file - sudo -u postgres bash -c "cat > /var/opt/gitlab/postgresql/data/recovery.conf <<- _EOF1_ - standby_mode = 'on' - primary_conninfo = 'host=$HOST port=$PORT user=$USER password=$PASSWORD sslmode=$SSLMODE' - _EOF1_ - " + echo Restoring postgresql.conf + sudo -u postgres mv /var/opt/gitlab/postgresql/postgresql.conf /var/opt/gitlab/postgresql/data/ - echo Restoring postgresql.conf - sudo -u postgres mv /var/opt/gitlab/postgresql/postgresql.conf /var/opt/gitlab/postgresql/data/ + echo Starting PostgreSQL + sudo service postgresql start + ``` - echo Starting PostgreSQL - sudo service postgresql start - ``` + 1. **(secondary)** Run the recovery script using the credentials from the + previous step: - 1. **[secondary]** Run the recovery script using the credentials from the - previous step: + ```sh + sudo bash /tmp/replica.sh + ``` - ```sh - sudo bash /tmp/replica.sh - ``` + 1. **(secondary)** Reconfigure GitLab: - 1. **[secondary]** Reconfigure GitLab: + ```sh + sudo gitlab-ctl reconfigure + ``` - ```sh - sudo gitlab-ctl reconfigure - ``` + 1. **(secondary)** Start all services: - 1. **[secondary]** Start all services: + ```sh + sudo gitlab-ctl start + ``` - ```sh - sudo gitlab-ctl start - ``` + 1. **(secondary)** Repeat the steps for the remaining **secondary** nodes. - 1. **[secondary]** Repeat the steps for the remaining **secondary** nodes. - -1. **[primary]** After all **secondary** nodes are updated, start all services in +1. **(primary)** After all **secondary** nodes are updated, start all services in **primary** node: - ```sh - sudo gitlab-ctl start - ``` + ```sh + sudo gitlab-ctl start + ``` ## Check status after updating @@ -419,9 +416,9 @@ everything is working correctly: 1. Run the Geo raketask on all nodes, everything should be green: - ```sh - sudo gitlab-rake gitlab:geo:check - ``` + ```sh + sudo gitlab-rake gitlab:geo:check + ``` 1. Check the **primary** node's Geo dashboard for any errors. 1. Test the data replication by pushing code to the **primary** node and see if it @@ -435,9 +432,9 @@ and it is required since 10.0. 1. Run database migrations on tracking database: - ```sh - sudo gitlab-rake geo:db:migrate - ``` + ```sh + sudo gitlab-rake geo:db:migrate + ``` 1. Repeat this step for each **secondary** node. diff --git a/doc/administration/high_availability/redis.md b/doc/administration/high_availability/redis.md index cc338725e1b..874525dd836 100644 --- a/doc/administration/high_availability/redis.md +++ b/doc/administration/high_availability/redis.md @@ -394,7 +394,7 @@ The prerequisites for a HA Redis setup are the following: 1. [Reconfigure Omnibus GitLab][reconfigure] for the changes to take effect. > Note: You can specify multiple roles like sentinel and redis as: -> roles ['redis_sentinel_role', 'redis_master_role']. Read more about high +> `roles ['redis_sentinel_role', 'redis_master_role']`. Read more about high > availability roles at <https://docs.gitlab.com/omnibus/roles/>. ### Step 2. Configuring the slave Redis instances @@ -443,7 +443,7 @@ The prerequisites for a HA Redis setup are the following: 1. Go through the steps again for all the other slave nodes. > Note: You can specify multiple roles like sentinel and redis as: -> roles ['redis_sentinel_role', 'redis_slave_role']. Read more about high +> `roles ['redis_sentinel_role', 'redis_slave_role']`. Read more about high > availability roles at <https://docs.gitlab.com/omnibus/roles/>. --- diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md index 84b71ae6f1c..2d9e3f7f18b 100644 --- a/doc/administration/monitoring/prometheus/gitlab_metrics.md +++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md @@ -108,7 +108,7 @@ Some basic Ruby runtime metrics are available: [GC.stat]: https://ruby-doc.org/core-2.3.0/GC.html#method-c-stat -## Puma Metrics **[EXPERIMENTAL]** +## Puma Metrics **(EXPERIMENTAL)** When Puma is used instead of Unicorn, following metrics are available: diff --git a/doc/api/jobs.md b/doc/api/jobs.md index 72973b69117..223bfed91a9 100644 --- a/doc/api/jobs.md +++ b/doc/api/jobs.md @@ -14,7 +14,7 @@ GET /projects/:id/jobs | `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. | ```sh -curl --header "PRIVATE-TOKEN: <your_access_token>" 'https://gitlab.example.com/api/v4/projects/1/jobs?scope[]=pending&scope[]=running' +curl --globoff --header "PRIVATE-TOKEN: <your_access_token>" 'https://gitlab.example.com/api/v4/projects/1/jobs?scope[]=pending&scope[]=running' ``` Example of response diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md index 0ccb0517e08..2b2e40fb276 100644 --- a/doc/api/project_snippets.md +++ b/doc/api/project_snippets.md @@ -13,6 +13,12 @@ Constants for snippet visibility levels are: | `internal` | The snippet is visible for any logged in user | | `public` | The snippet can be accessed without any authentication | +NOTE: **Note:** +From July 2019, the `Internal` visibility setting is disabled for new projects, groups, +and snippets on GitLab.com. Existing projects, groups, and snippets using the `Internal` +visibility setting keep this setting. You can read more about the change in the +[relevant issue](https://gitlab.com/gitlab-org/gitlab-ee/issues/12388). + ## List snippets Get a list of project snippets. diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md index 7dbb9af2869..e911e97d3c8 100644 --- a/doc/ci/variables/predefined_variables.md +++ b/doc/ci/variables/predefined_variables.md @@ -78,7 +78,7 @@ future GitLab releases.** | `CI_PIPELINE_ID` | 8.10 | all | The unique id of the current pipeline that GitLab CI uses internally | | `CI_PIPELINE_IID` | 11.0 | all | The unique id of the current pipeline scoped to project | | `CI_PIPELINE_SOURCE` | 10.0 | all | Indicates how the pipeline was triggered. Possible options are: `push`, `web`, `trigger`, `schedule`, `api`, and `pipeline`. For pipelines created before GitLab 9.5, this will show as `unknown` | -| `CI_PIPELINE_TRIGGERED` | all | all | The flag to indicate that job was [triggered] | +| `CI_PIPELINE_TRIGGERED` | all | all | The flag to indicate that job was [triggered](../triggers/README.md) | | `CI_PIPELINE_URL` | 11.1 | 0.5 | Pipeline details URL | | `CI_PROJECT_DIR` | all | all | The full path where the repository is cloned and where the job is run. If the GitLab Runner `builds_dir` parameter is set, this variable is set relative to the value of `builds_dir`. For more information, see [Advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section) for GitLab Runner. | | `CI_PROJECT_ID` | all | all | The unique id of the current project that GitLab CI uses internally | diff --git a/doc/customization/system_header_and_footer_messages.md b/doc/customization/system_header_and_footer_messages.md index 9d6931c730d..7eee79abc77 100644 --- a/doc/customization/system_header_and_footer_messages.md +++ b/doc/customization/system_header_and_footer_messages.md @@ -1,6 +1,7 @@ # Adding a system message to every page -> [Introduced][ee-1283] in [GitLab Premium][eep] 10.7. +> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/5023) in [GitLab Premium](https://about.gitlab.com/pricing/) 10.7. +> [Added](https://gitlab.com/gitlab-org/gitlab-ce/issues/55057) to [GitLab Core](https://about.gitlab.com/pricing/) in 11.9. Navigate to the **Admin** area and go to the **Appearance** page. diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md index d9595bd7bba..f1015f56106 100644 --- a/doc/development/contributing/issue_workflow.md +++ b/doc/development/contributing/issue_workflow.md @@ -6,10 +6,13 @@ scheduling into milestones. Labelling is a task for everyone. Most issues will have labels for at least one of the following: -- Type: ~feature, ~bug, ~customer, etc. -- Subject: ~wiki, ~"Container Registry", ~ldap, ~api, ~frontend, etc. -- Team: ~Plan, ~Manage, ~Quality, etc. -- Stage: ~"devops:plan", ~"devops:create", etc. +- Type: ~feature, ~bug, ~backstage, etc. +- Subject: ~wiki, ~"Container Registry", ~ldap, ~api, etc. +- Team: ~Documentation, ~Delivery, etc. +- Stage: ~"devops::plan", ~"devops::create", etc. +- Group: ~"group::source code" ~"group::knowledge" ~"group::editor", etc. +- Department: ~UX, ~Quality +- Specialization: ~frontend, ~backend - Release Scoping: ~Deliverable, ~Stretch, ~"Next Patch Release" - Priority: ~P1, ~P2, ~P3, ~P4 - Severity: ~S1, ~S2, ~S3, ~S4 @@ -27,8 +30,7 @@ labels, you can _always_ add the team and type, and often also the subject. Type labels are very important. They define what kind of issue this is. Every issue should have one or more. -Examples of type labels are ~feature, ~bug, ~customer, ~security, -and ~direction. +Examples of type labels are ~feature, ~bug, ~backstage and ~security A number of type labels have a priority assigned to them, which automatically makes them float to the top, depending on their importance. @@ -56,19 +58,20 @@ issue is labeled with a subject label corresponding to your expertise. Subject labels are always all-lowercase. -## Team labels +## Team labels + +**Important**: Most of the team labels will be soon deprecated in favor of [Group labels](#group-labels). Team labels specify what team is responsible for this issue. Assigning a team label makes sure issues get the attention of the appropriate people. -The current team labels are: +The team labels planned for deprecation are: - ~Configure - ~Create - ~Defend - ~Distribution -- ~Documentation - ~Ecosystem - ~Geo - ~Gitaly @@ -77,12 +80,15 @@ The current team labels are: - ~Memory - ~Monitor - ~Plan -- ~Quality - ~Release - ~Secure -- ~UX - ~Verify +The following team labels are **true** teams per our [organization structure](https://about.gitlab.com/company/team/structure/#organizational-structure) which will remain post deprecation. + +- ~Delivery +- ~Documentation + The descriptions on the [labels page][labels-page] explain what falls under the responsibility of each team. @@ -92,6 +98,7 @@ indicate if an issue needs backend work, frontend work, or both. Team labels are always capitalized so that they show up as the first label for any issue. + ## Stage labels Stage labels specify which [DevOps stage][devops-stages] the issue belongs to. @@ -132,10 +139,44 @@ The Stage labels are used to generate the [direction pages][direction-pages] aut Group labels specify which [groups][structure-groups] the issue belongs to. -Examples include: - -- ~"group::control" -- ~"group::editor" +The current group labels are: + +* ~"group::access" +* ~"group::measure" +* ~"group::source code" +* ~"group::knowledge" +* ~"group::editor" +* ~"group::gitaly" +* ~"group::gitter" +* ~"group::team planning" +* ~"group::enterprise planning" +* ~"group::certify" +* ~"group::ci and runner" +* ~"group::testing" +* ~"group::package" +* ~"group::core release" +* ~"group::supporting capabilities" +* ~"group::autodevops and kubernetes" +* ~"group::serverless and paas" +* ~"group::apm" +* ~"group::health" +* ~"group::static analysis" +* ~"group::dynamic analysis" +* ~"group::software composition analysis" +* ~"group::runtime application security" +* ~"group::threat management" +* ~"group::application infrastructure security" +* ~"group::activation" +* ~"group::adoption" +* ~"group::upsell" +* ~"group::retention" +* ~"group::fulfillment" +* ~"group::telemetry" +* ~"group::distribution" +* ~"group::geo" +* ~"group::memory" +* ~"group::ecosystem" + These labels are [scoped labels](../../user/project/labels.md#scoped-labels-premium) and thus are mutually exclusive. @@ -147,6 +188,20 @@ can be applied to a single issue. You can find the groups listed in the [structure-groups]: https://about.gitlab.com/company/team/structure/#groups [product-categories]: https://about.gitlab.com/handbook/product/categories/ +## Department labels + +The current department labels are: + +* ~UX +* ~Quality + +## Specialization labels + +These labels narrow the [specialization](https://about.gitlab.com/company/team/structure/#specialist) on a unit of work. + +* ~frontend +* ~backend + ## Release Scoping labels Release Scoping labels help us clearly communicate expectations of the work for the diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md index 34d41cf4958..6f4a36d4066 100644 --- a/doc/development/ee_features.md +++ b/doc/development/ee_features.md @@ -1036,7 +1036,14 @@ to avoid conflicts during CE to EE merge. ### Backporting changes from EE to CE -When working in EE-specific features, you might have to tweak a few files that are not EE-specific. Here is a workflow to make sure those changes end up backported safely into CE too. +Until the work completed to merge the ce and ee codebases, which is tracked on [epic &802](https://gitlab.com/groups/gitlab-org/-/epics/802), there exists times in which some changes for EE require specific changes to the CE +code base. Examples of backports include the following: + +* Features intended or originally built for EE that are later decided to move to CE +* Sometimes some code in CE may impact the EE feature + +Here is a workflow to make sure those changes end up backported safely into CE too. + (This approach does not refer to changes introduced via [csslab](https://gitlab.com/gitlab-org/csslab/).) 1. **Make your changes in the EE branch.** If possible, keep a separated commit (to be squashed) to help backporting and review. diff --git a/doc/install/installation.md b/doc/install/installation.md index 4c1021d097f..70e5ab28931 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -560,7 +560,7 @@ NOTE: **Note:** If you want to use HTTPS, see [Using HTTPS](#using-https) for the additional steps. NOTE: **Note:** -Make sure your hostname can be resolved on the machine itself by either a proper DNS record or an additional line in `/etc/hosts` ("127.0.0.1 hostname"). This might be necessary, for example, if you set up GitLab behind a reverse proxy. If the hostname cannot be resolved, the final installation check will fail with "Check GitLab API access: FAILED. code: 401" and pushing commits will be rejected with "[remote rejected] master -> master (hook declined)". +Make sure your hostname can be resolved on the machine itself by either a proper DNS record or an additional line in `/etc/hosts` ("127.0.0.1 hostname"). This might be necessary, for example, if you set up GitLab behind a reverse proxy. If the hostname cannot be resolved, the final installation check will fail with `Check GitLab API access: FAILED. code: 401` and pushing commits will be rejected with `[remote rejected] master -> master (hook declined)`. NOTE: **Note:** GitLab Shell application startup time can be greatly reduced by disabling RubyGems. This can be done in several ways: diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md index f64fdb1e28b..877330b8c44 100644 --- a/doc/integration/elasticsearch.md +++ b/doc/integration/elasticsearch.md @@ -167,7 +167,7 @@ To disable the Elasticsearch integration: 1. Find the 'Elasticsearch' section and uncheck 'Search with Elasticsearch enabled' and 'Elasticsearch indexing' 1. Click **Save** for the changes to take effect -1. [Optional] Delete the existing index by running the command `sudo gitlab-rake gitlab:elastic:delete_index` +1. (Optional) Delete the existing index by running the command `sudo gitlab-rake gitlab:elastic:delete_index` ## Adding GitLab's data to the Elasticsearch index diff --git a/doc/public_access/public_access.md b/doc/public_access/public_access.md index b1637181855..d04428fdbfe 100644 --- a/doc/public_access/public_access.md +++ b/doc/public_access/public_access.md @@ -29,6 +29,12 @@ in users. Any logged in user will have [Guest permissions](../user/permissions.md) on the repository. +NOTE: **Note:** +From July 2019, the `Internal` visibility setting is disabled for new projects, groups, +and snippets on GitLab.com. Existing projects, groups, and snippets using the `Internal` +visibility setting keep this setting. You can read more about the change in the +[relevant issue](https://gitlab.com/gitlab-org/gitlab-ee/issues/12388). + ### Private projects Private projects can only be cloned and viewed by project members. diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md index 41d12128e51..bd788cb138c 100644 --- a/doc/topics/autodevops/index.md +++ b/doc/topics/autodevops/index.md @@ -175,8 +175,8 @@ When using Auto DevOps, you may want to deploy different environments to different Kubernetes clusters. This is possible due to the 1:1 connection that [exists between them](../../user/project/clusters/index.md#multiple-kubernetes-clusters-premium). -In the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml) -(used behind the scenes by Auto DevOps), there are currently 3 defined environment names that you need to know: +In the [Auto DevOps template] (used behind the scenes by Auto DevOps), there +are currently 3 defined environment names that you need to know: - `review/` (every environment starting with `review/`) - `staging` @@ -662,25 +662,32 @@ to the desired environment. See [Limiting environment scopes of variables](../.. ### Customizing `.gitlab-ci.yml` -If you want to modify the CI/CD pipeline used by Auto DevOps, you can copy the -[Auto DevOps template] into your project's repo and edit as you see fit. - -Assuming that your project is new or it doesn't have a `.gitlab-ci.yml` file -present: - -1. From your project home page, either click on the "Set up CI/CD" button, or click - on the plus button and (`+`), then "New file" -1. Pick `.gitlab-ci.yml` as the template type -1. Select "Auto-DevOps" from the template dropdown -1. Edit the template or add any jobs needed -1. Give an appropriate commit message and hit "Commit changes" - -TIP: **Tip:** The Auto DevOps template includes useful comments to help you -customize it. For example, if you want deployments to go to a staging environment -instead of directly to a production one, you can enable the `staging` job by -renaming `.staging` to `staging`. Then make sure to uncomment the `when` key of -the `production` job to turn it into a manual action instead of deploying -automatically. +Everything about Auto DevOps is customizable since the [Auto DevOps template] +is just an example of a [`.gitlab-ci.yml`](../../ci/yaml/README.md) and uses +only features that are available to any `.gitlab-ci.yml`. + +Auto DevOps is completely customizable because the [Auto DevOps template]: + +- Is just an implementation of a [`.gitlab-ci.yml`](../../ci/yaml/README.md) file. +- Uses only features available to any implementation of `.gitlab-ci.yml`. + +If you want to modify the CI/CD pipeline used by Auto DevOps, you can [`include` +the template](../../ci/yaml/README.md#includetemplate) and customize as +needed. To do this, add a `.gitlab-ci.yml` file to the root of your repository +containing the following: + +```yml +include: + - template: Auto-DevOps.gitlab-ci.yml +``` + +Then add any extra changes you want. Your additions will be merged with the +[Auto DevOps template] using the behaviour described for +[`include`](../../ci/yaml/README.md#include). + +It is also possible to copy and paste the contents of the [Auto DevOps +template] into your project and edit this as needed. You may prefer to do it +that way if you want to specifically remove any part of it. ### Using components of Auto-DevOps diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md index f2516c6db0c..2246ea8ed5a 100644 --- a/doc/user/clusters/applications.md +++ b/doc/user/clusters/applications.md @@ -111,7 +111,7 @@ file. [Ingress](https://kubernetes.github.io/ingress-nginx/) can provide load balancing, SSL termination, and name-based virtual hosting. It acts as a web proxy for your applications and is useful if you want to use [Auto -DevOps] or deploy your own web apps. +DevOps](../../topics/autodevops/index.md) or deploy your own web apps. NOTE: **Note:** The @@ -251,6 +251,7 @@ The applications below can be uninstalled. | Application | GitLab version | Notes | | ----------- | -------------- | ----- | +| Ingress | 12.1+ | The associated load balancer and IP will be deleted and cannot be restored. Furthermore, it can only be uninstalled if JupyterHub is not installed. | | JupyterHub | 12.1+ | All data not committed to GitLab will be deleted and cannot be restored. | | Prometheus | 11.11+ | All data will be deleted and cannot be restored. | diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md index 2fb6cec55fa..886fb6e6f55 100644 --- a/doc/user/gitlab_com/index.md +++ b/doc/user/gitlab_com/index.md @@ -352,3 +352,13 @@ High Performance TCP/HTTP Load Balancer: [unicorn-worker-killer]: https://rubygems.org/gems/unicorn-worker-killer "unicorn-worker-killer" [4010]: https://gitlab.com/gitlab-com/infrastructure/issues/4010 "Find a good value for maximum timeout for Shared Runners" [4070]: https://gitlab.com/gitlab-com/infrastructure/issues/4070 "Configure per-runner timeout for shared-runners-manager-X on GitLab.com" + +## Other admin area settings + +This area highlights other noteworthy admin area settings on GitLab.com that differ from default settings. This list is not exhaustive. + +NOTE: **Note:** +From July 2019, the `Internal` visibility setting is disabled for new projects, groups, +and snippets on GitLab.com. Existing projects, groups, and snippets using the `Internal` +visibility setting keep this setting. You can read more about the change in the +[relevant issue](https://gitlab.com/gitlab-org/gitlab-ee/issues/12388). diff --git a/doc/user/markdown.md b/doc/user/markdown.md index a08b41aaecb..eaae9964367 100644 --- a/doc/user/markdown.md +++ b/doc/user/markdown.md @@ -288,7 +288,7 @@ $example = array( > If this is not rendered correctly, [view it in GitLab itself](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/user/markdown.md#inline-diff). -With inline diff tags you can display {+ additions +} or [- deletions -]. +With inline diff tags you can display `{+ additions +}` or `[- deletions -]`. The wrapping tags can be either curly braces or square brackets: diff --git a/doc/user/permissions.md b/doc/user/permissions.md index 03abef9fc62..33fff0fed74 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -122,8 +122,8 @@ The following table depicts the various user permission levels in a project. | Transfer project to another namespace | | | | | ✓ | | Remove project | | | | | ✓ | | Delete issues | | | | | ✓ | -| Force push to protected branches [^4] | | | | | | -| Remove protected branches [^4] | | | | | | +| Force push to protected branches (*4*) | | | | | | +| Remove protected branches (*4*) | | | | | | - (*1*): All users are able to perform this action on public and internal projects, but not private projects. - (*2*): Guest users can only view the confidential issues they created themselves diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md index cce862b0911..9bb282f1b78 100644 --- a/doc/user/project/canary_deployments.md +++ b/doc/user/project/canary_deployments.md @@ -44,7 +44,7 @@ Canary deployments require that you properly configure Deploy Boards: 1. Follow the steps to [enable Deploy Boards](deploy_boards.md#enabling-deploy-boards). 1. To track canary deployments you need to label your Kubernetes deployments and - pods with `track: canary`. To get started quickly, you can use the [Auto Deploy] + pods with `track: canary`. To get started quickly, you can use the [Auto Deploy](../../ci/autodeploy/index.md) template for canary deployments that GitLab provides. Depending on the deploy, the label should be either `stable` or `canary`. @@ -62,7 +62,6 @@ can easily notice them. ![Canary deployments on Deploy Board](img/deploy_boards_canary_deployments.png) -[autodeploy]: ../../ci/autodeploy/index.md "GitLab Autodeploy" [eep]: https://about.gitlab.com/pricing/ [ee-1659]: https://gitlab.com/gitlab-org/gitlab-ee/issues/1659 [kube-canary]: https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments diff --git a/doc/user/project/container_registry.md b/doc/user/project/container_registry.md index fdf9ce3e225..7d567da1c9a 100644 --- a/doc/user/project/container_registry.md +++ b/doc/user/project/container_registry.md @@ -168,6 +168,19 @@ curl localhost:5001/debug/health curl localhost:5001/debug/vars ``` +#### Docker connection error + +A Docker connection error can occur when there are special characters in either the group, +project or branch name. Special characters can include: + +* Leading underscore +* Trailing hyphen/dash +* Double hyphen/dash + +To get around this, you can [change the group path](../group/index.md#changing-a-groups-path), +[change the project path](../project/settings/index.md#renaming-a-repository) or chanage the branch +name. + ### Advanced Troubleshooting >**NOTE:** The following section is only recommended for experts. diff --git a/doc/user/project/integrations/prometheus_library/haproxy.md b/doc/user/project/integrations/prometheus_library/haproxy.md index abb0c01ad18..6be8fc82431 100644 --- a/doc/user/project/integrations/prometheus_library/haproxy.md +++ b/doc/user/project/integrations/prometheus_library/haproxy.md @@ -11,8 +11,8 @@ The [Prometheus service](../prometheus.md) must be enabled. | Name | Query | | ---- | ----- | -| Throughput (req/sec) | sum(rate(haproxy_frontend_http_requests_total{%{environment_filter}}[2m])) by (code) | -| HTTP Error Rate (%) | sum(rate(haproxy_frontend_http_requests_total{code="5xx",%{environment_filter}}[2m])) / sum(rate(haproxy_frontend_http_requests_total{%{environment_filter}}[2m])) | +| Throughput (req/sec) | `sum(rate(haproxy_frontend_http_requests_total{%{environment_filter}}[2m])) by (code)` | +| HTTP Error Rate (%) | `sum(rate(haproxy_frontend_http_requests_total{code="5xx",%{environment_filter}}[2m])) / sum(rate(haproxy_frontend_http_requests_total{%{environment_filter}}[2m]))` | ## Configuring Prometheus to monitor for HAProxy metrics diff --git a/doc/user/project/integrations/prometheus_library/nginx.md b/doc/user/project/integrations/prometheus_library/nginx.md index c4fea178ab5..7db9629c002 100644 --- a/doc/user/project/integrations/prometheus_library/nginx.md +++ b/doc/user/project/integrations/prometheus_library/nginx.md @@ -14,9 +14,9 @@ NGINX server metrics are detected, which tracks the pages and content directly s | Name | Query | | ---- | ----- | -| Throughput (req/sec) | sum(rate(nginx_server_requests{server_zone!="*", server_zone!="_", %{environment_filter}}[2m])) by (code) | -| Latency (ms) | avg(nginx_server_requestMsec{%{environment_filter}}) | -| HTTP Error Rate (HTTP Errors / sec) | sum(rate(nginx_server_requests{code="5xx", %{environment_filter}}[2m])) | +| Throughput (req/sec) | `sum(rate(nginx_server_requests{server_zone!="*", server_zone!="_", %{environment_filter}}[2m])) by (code)` | +| Latency (ms) | `avg(nginx_server_requestMsec{%{environment_filter}})` | +| HTTP Error Rate (HTTP Errors / sec) | `sum(rate(nginx_server_requests{code="5xx", %{environment_filter}}[2m]))` | ## Configuring Prometheus to monitor for NGINX metrics diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress.md b/doc/user/project/integrations/prometheus_library/nginx_ingress.md index de7fc93f0a4..fd743855a8c 100644 --- a/doc/user/project/integrations/prometheus_library/nginx_ingress.md +++ b/doc/user/project/integrations/prometheus_library/nginx_ingress.md @@ -14,9 +14,9 @@ GitLab has support for automatically detecting and monitoring the Kubernetes NGI | Name | Query | | ---- | ----- | -| Throughput (req/sec) | sum(label_replace(rate(nginx_ingress_controller_requests{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m]), "status_code", "${1}xx", "status", "(.)..")) by (status_code) | -| Latency (ms) | sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_sum{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) / sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_count{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) * 1000 | -| HTTP Error Rate (%) | sum(rate(nginx_ingress_controller_requests{status=~"5.*",namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) / sum(rate(nginx_ingress_controller_requests{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) * 100 | +| Throughput (req/sec) | `sum(label_replace(rate(nginx_ingress_controller_requests{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m]), "status_code", "${1}xx", "status", "(.)..")) by (status_code)` | +| Latency (ms) | `sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_sum{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) / sum(rate(nginx_ingress_controller_ingress_upstream_latency_seconds_count{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) * 1000` | +| HTTP Error Rate (%) | `sum(rate(nginx_ingress_controller_requests{status=~"5.*",namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) / sum(rate(nginx_ingress_controller_requests{namespace="%{kube_namespace}",ingress=~".*%{ci_environment_slug}.*"}[2m])) * 100` | ## Configuring NGINX ingress monitoring diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md b/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md index 31ac53c0d14..b03787b3e0d 100644 --- a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md +++ b/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md @@ -14,9 +14,9 @@ GitLab has support for automatically detecting and monitoring the Kubernetes NGI | Name | Query | | ---- | ----- | -| Throughput (req/sec) | sum(rate(nginx_upstream_responses_total{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) by (status_code) | -| Latency (ms) | avg(nginx_upstream_response_msecs_avg{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}) | -| HTTP Error Rate (%) | sum(rate(nginx_upstream_responses_total{status_code="5xx", upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) / sum(rate(nginx_upstream_responses_total{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) * 100 | +| Throughput (req/sec) | `sum(rate(nginx_upstream_responses_total{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) by (status_code)` | +| Latency (ms) | `avg(nginx_upstream_response_msecs_avg{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"})` | +| HTTP Error Rate (%) | `sum(rate(nginx_upstream_responses_total{status_code="5xx", upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) / sum(rate(nginx_upstream_responses_total{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) * 100` | ## Configuring NGINX ingress monitoring diff --git a/doc/user/project/merge_requests/squash_and_merge.md b/doc/user/project/merge_requests/squash_and_merge.md index 39fd2588811..38459584eed 100644 --- a/doc/user/project/merge_requests/squash_and_merge.md +++ b/doc/user/project/merge_requests/squash_and_merge.md @@ -50,7 +50,10 @@ all you have to do is enable squashing before you press merge to join the commits in the merge request into a single commit. This way, the history of your base branch remains clean with -meaningful commit messages and is simpler to [revert](revert_changes.md) if necessary. +meaningful commit messages and: + +- It's simpler to [revert](revert_changes.md) if necessary. +- The merged branch will retain the full commit history. ## Enabling squash for a merge request diff --git a/doc/user/project/merge_requests/work_in_progress_merge_requests.md b/doc/user/project/merge_requests/work_in_progress_merge_requests.md index 9cd868067bc..142178ba241 100644 --- a/doc/user/project/merge_requests/work_in_progress_merge_requests.md +++ b/doc/user/project/merge_requests/work_in_progress_merge_requests.md @@ -15,7 +15,7 @@ being merged, and it will stay disabled until the "WIP" flag has been removed. There are several ways to flag a merge request as a Work In Progress: -- Add "[WIP]" or "WIP:" to the start of the merge request's title. Clicking on +- Add `[WIP]` or `WIP:` to the start of the merge request's title. Clicking on **Start the title with WIP:**, under the title box, when editing the merge request's description will have the same effect. - Add the `/wip` [quick action](../quick_actions.md#quick-actions-for-issues-and-merge-requests) @@ -30,7 +30,7 @@ There are several ways to flag a merge request as a Work In Progress: Similar to above, when a Merge Request is ready to be merged, you can remove the "Work in Progress" flag in several ways: -- Remove "[WIP]" or "WIP:" from the start of the merge request's title. Clicking on +- Remove `[WIP]` or `WIP:` from the start of the merge request's title. Clicking on **Remove the WIP: prefix from the title**, under the title box, when editing the merge request's description, will have the same effect. - Add the `/wip` [quick action](../quick_actions.md#quick-actions-for-issues-and-merge-requests) diff --git a/doc/user/project/pipelines/job_artifacts.md b/doc/user/project/pipelines/job_artifacts.md index 002addfc043..f9feae36dbc 100644 --- a/doc/user/project/pipelines/job_artifacts.md +++ b/doc/user/project/pipelines/job_artifacts.md @@ -187,7 +187,8 @@ information in the UI. DANGER: **Warning:** This is a destructive action that leads to data loss. Use with caution. -If you have at least Developer [permissions](../../permissions.md#gitlab-cicd-permissions) +If you are either the owner of a given job or have Master +[permissions](../../permissions.md#gitlab-cicd-permissions) on the project, you can erase a single job via the UI which will also remove the artifacts and the job's trace. diff --git a/doc/workflow/gitlab_flow.md b/doc/workflow/gitlab_flow.md index 3e24557591c..0cb390e1242 100644 --- a/doc/workflow/gitlab_flow.md +++ b/doc/workflow/gitlab_flow.md @@ -175,7 +175,7 @@ A merge request is an online place to discuss the change and review the code. If you open the merge request but do not assign it to anyone, it is a "Work In Progress" merge request. These are used to discuss the proposed implementation but are not ready for inclusion in the `master` branch yet. -Start the title of the merge request with "[WIP]" or "WIP:" to prevent it from being merged before it's ready. +Start the title of the merge request with `[WIP]` or `WIP:` to prevent it from being merged before it's ready. When you think the code is ready, assign the merge request to a reviewer. The reviewer can merge the changes when they think the code is ready for inclusion in the `master` branch. diff --git a/doc/workflow/notifications.md b/doc/workflow/notifications.md index 5d560f2e000..d49d29c805a 100644 --- a/doc/workflow/notifications.md +++ b/doc/workflow/notifications.md @@ -64,18 +64,18 @@ These settings can be configured on project page under the name of the project. Below is the table of events users can be notified of: -| Event | Sent to | Settings level | -|------------------------------|-------------------------------------------------------------------|------------------------------| -| New SSH key added | User | Security email, always sent. | -| New email added | User | Security email, always sent. | -| Email changed | User | Security email, always sent. | -| Password changed | User | Security email, always sent. | -| New user created | User | Sent on user creation, except for omniauth (LDAP)| -| User added to project | User | Sent when user is added to project | -| Project access level changed | User | Sent when user project access level is changed | -| User added to group | User | Sent when user is added to group | -| Group access level changed | User | Sent when user group access level is changed | -| Project moved | Project members [1] | [1] not disabled | +| Event | Sent to | Settings level | +|------------------------------|---------------------|------------------------------| +| New SSH key added | User | Security email, always sent. | +| New email added | User | Security email, always sent. | +| Email changed | User | Security email, always sent. | +| Password changed | User | Security email, always sent. | +| New user created | User | Sent on user creation, except for omniauth (LDAP)| +| User added to project | User | Sent when user is added to project | +| Project access level changed | User | Sent when user project access level is changed | +| User added to group | User | Sent when user is added to group | +| Group access level changed | User | Sent when user group access level is changed | +| Project moved | Project members (1) | (1) not disabled | ### Issue / Epics / Merge request events diff --git a/lib/api/entities.rb b/lib/api/entities.rb index d783591c238..b96903d4a8d 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -1186,8 +1186,10 @@ module API MarkupHelper.markdown_field(entity, :description) end expose :created_at + expose :released_at expose :author, using: Entities::UserBasic, if: -> (release, _) { release.author.present? } expose :commit, using: Entities::Commit, if: lambda { |_, _| can_download_code? } + expose :upcoming_release?, as: :upcoming_release expose :assets do expose :assets_count, as: :count do |release, _| diff --git a/lib/api/releases.rb b/lib/api/releases.rb index 6b17f4317db..fdd8406388e 100644 --- a/lib/api/releases.rb +++ b/lib/api/releases.rb @@ -54,6 +54,7 @@ module API requires :url, type: String end end + optional :released_at, type: DateTime, desc: 'The date when the release will be/was ready. Defaults to the current time.' end post ':id/releases' do authorize_create_release! @@ -77,6 +78,7 @@ module API requires :tag_name, type: String, desc: 'The name of the tag', as: :tag optional :name, type: String, desc: 'The name of the release' optional :description, type: String, desc: 'Release notes with markdown support' + optional :released_at, type: DateTime, desc: 'The date when the release will be/was ready. Defaults to the current time.' end put ':id/releases/:tag_name', requirements: RELEASE_ENDPOINT_REQUIREMETS do authorize_update_release! diff --git a/lib/feature.rb b/lib/feature.rb index cc9c9d44005..22420e95ea2 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -34,7 +34,9 @@ class Feature begin # We saw on GitLab.com, this database request was called 2300 # times/s. Let's cache it for a minute to avoid that load. - Rails.cache.fetch('flipper:persisted_names', expires_in: 1.minute) { FlipperFeature.feature_names } + Gitlab::ThreadMemoryCache.cache_backend.fetch('flipper:persisted_names', expires_in: 1.minute) do + FlipperFeature.feature_names + end end end diff --git a/lib/gitlab/background_migration/create_fork_network_memberships_range.rb b/lib/gitlab/background_migration/create_fork_network_memberships_range.rb deleted file mode 100644 index ccd1f9b4dba..00000000000 --- a/lib/gitlab/background_migration/create_fork_network_memberships_range.rb +++ /dev/null @@ -1,85 +0,0 @@ -# frozen_string_literal: true -# rubocop:disable Style/Documentation - -module Gitlab - module BackgroundMigration - class CreateForkNetworkMembershipsRange - RESCHEDULE_DELAY = 15 - - class ForkedProjectLink < ActiveRecord::Base - self.table_name = 'forked_project_links' - end - - def perform(start_id, end_id) - log("Creating memberships for forks: #{start_id} - #{end_id}") - - insert_members(start_id, end_id) - - if missing_members?(start_id, end_id) - BackgroundMigrationWorker.perform_in(RESCHEDULE_DELAY, "CreateForkNetworkMembershipsRange", [start_id, end_id]) - end - end - - def insert_members(start_id, end_id) - ActiveRecord::Base.connection.execute <<~INSERT_MEMBERS - INSERT INTO fork_network_members (fork_network_id, project_id, forked_from_project_id) - - SELECT fork_network_members.fork_network_id, - forked_project_links.forked_to_project_id, - forked_project_links.forked_from_project_id - - FROM forked_project_links - - INNER JOIN fork_network_members - ON forked_project_links.forked_from_project_id = fork_network_members.project_id - - WHERE forked_project_links.id BETWEEN #{start_id} AND #{end_id} - AND NOT EXISTS ( - SELECT true - FROM fork_network_members existing_members - WHERE existing_members.project_id = forked_project_links.forked_to_project_id - ) - INSERT_MEMBERS - rescue ActiveRecord::RecordNotUnique => e - # `fork_network_member` was created concurrently in another migration - log(e.message) - end - - def missing_members?(start_id, end_id) - count_sql = <<~MISSING_MEMBERS - SELECT COUNT(*) - - FROM forked_project_links - - WHERE NOT EXISTS ( - SELECT true - FROM fork_network_members - WHERE fork_network_members.project_id = forked_project_links.forked_to_project_id - ) - AND EXISTS ( - SELECT true - FROM projects - WHERE forked_project_links.forked_from_project_id = projects.id - ) - AND NOT EXISTS ( - SELECT true - FROM forked_project_links AS parent_links - WHERE parent_links.forked_to_project_id = forked_project_links.forked_from_project_id - AND NOT EXISTS ( - SELECT true - FROM projects - WHERE parent_links.forked_from_project_id = projects.id - ) - ) - AND forked_project_links.id BETWEEN #{start_id} AND #{end_id} - MISSING_MEMBERS - - ForkedProjectLink.count_by_sql(count_sql) > 0 - end - - def log(message) - Rails.logger.info("#{self.class.name} - #{message}") - end - end - end -end diff --git a/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range.rb b/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range.rb deleted file mode 100644 index 21b626dde56..00000000000 --- a/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true -# rubocop:disable Style/Documentation - -module Gitlab - module BackgroundMigration - class DeleteConflictingRedirectRoutesRange - def perform(start_id, end_id) - # No-op. - # See https://gitlab.com/gitlab-com/infrastructure/issues/3460#note_53223252 - end - end - end -end diff --git a/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb b/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb deleted file mode 100644 index 42fcaa87e66..00000000000 --- a/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb +++ /dev/null @@ -1,179 +0,0 @@ -# frozen_string_literal: true -# rubocop:disable Style/Documentation - -module Gitlab - module BackgroundMigration - # Class that migrates events for the new push event payloads setup. All - # events are copied to a shadow table, and push events will also have a row - # created in the push_event_payloads table. - class MigrateEventsToPushEventPayloads - class Event < ActiveRecord::Base - self.table_name = 'events' - - serialize :data - - BLANK_REF = ('0' * 40).freeze - TAG_REF_PREFIX = 'refs/tags/'.freeze - MAX_INDEX = 69 - PUSHED = 5 - - def push_event? - action == PUSHED && data.present? - end - - def commit_title - commit = commits.last - - return unless commit && commit[:message] - - index = commit[:message].index("\n") - message = index ? commit[:message][0..index] : commit[:message] - - message.strip.truncate(70) - end - - def commit_from_sha - if create? - nil - else - data[:before] - end - end - - def commit_to_sha - if remove? - nil - else - data[:after] - end - end - - def data - super || {} - end - - def commits - data[:commits] || [] - end - - def commit_count - data[:total_commits_count] || 0 - end - - def ref - data[:ref] - end - - def trimmed_ref_name - if ref_type == :tag - ref[10..-1] - else - ref[11..-1] - end - end - - def create? - data[:before] == BLANK_REF - end - - def remove? - data[:after] == BLANK_REF - end - - def push_action - if create? - :created - elsif remove? - :removed - else - :pushed - end - end - - def ref_type - if ref.start_with?(TAG_REF_PREFIX) - :tag - else - :branch - end - end - end - - class EventForMigration < ActiveRecord::Base - self.table_name = 'events_for_migration' - end - - class PushEventPayload < ActiveRecord::Base - self.table_name = 'push_event_payloads' - - enum action: { - created: 0, - removed: 1, - pushed: 2 - } - - enum ref_type: { - branch: 0, - tag: 1 - } - end - - # start_id - The start ID of the range of events to process - # end_id - The end ID of the range to process. - def perform(start_id, end_id) - return unless migrate? - - find_events(start_id, end_id).each { |event| process_event(event) } - end - - def process_event(event) - ActiveRecord::Base.transaction do - replicate_event(event) - create_push_event_payload(event) if event.push_event? - end - rescue ActiveRecord::InvalidForeignKey => e - # A foreign key error means the associated event was removed. In this - # case we'll just skip migrating the event. - Rails.logger.error("Unable to migrate event #{event.id}: #{e}") - end - - def replicate_event(event) - new_attributes = event.attributes - .with_indifferent_access.except(:title, :data) - - EventForMigration.create!(new_attributes) - end - - def create_push_event_payload(event) - commit_from = pack(event.commit_from_sha) - commit_to = pack(event.commit_to_sha) - - PushEventPayload.create!( - event_id: event.id, - commit_count: event.commit_count, - ref_type: event.ref_type, - action: event.push_action, - commit_from: commit_from, - commit_to: commit_to, - ref: event.trimmed_ref_name, - commit_title: event.commit_title - ) - end - - def find_events(start_id, end_id) - Event - .where('NOT EXISTS (SELECT true FROM events_for_migration WHERE events_for_migration.id = events.id)') - .where(id: start_id..end_id) - end - - def migrate? - Event.table_exists? && PushEventPayload.table_exists? && - EventForMigration.table_exists? - end - - def pack(value) - value ? [value].pack('H*') : nil - end - end - end -end diff --git a/lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb b/lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb deleted file mode 100644 index 48aa369705f..00000000000 --- a/lib/gitlab/background_migration/normalize_ldap_extern_uids_range.rb +++ /dev/null @@ -1,319 +0,0 @@ -# frozen_string_literal: true -# rubocop:disable Metrics/MethodLength -# rubocop:disable Metrics/ClassLength -# rubocop:disable Metrics/BlockLength -# rubocop:disable Style/Documentation - -module Gitlab - module BackgroundMigration - class NormalizeLdapExternUidsRange - class Identity < ActiveRecord::Base - self.table_name = 'identities' - end - - # Copied this class to make this migration resilient to future code changes. - # And if the normalize behavior is changed in the future, it must be - # accompanied by another migration. - module Gitlab - module Auth - module LDAP - class DN - FormatError = Class.new(StandardError) - MalformedError = Class.new(FormatError) - UnsupportedError = Class.new(FormatError) - - def self.normalize_value(given_value) - dummy_dn = "placeholder=#{given_value}" - normalized_dn = new(*dummy_dn).to_normalized_s - normalized_dn.sub(/\Aplaceholder=/, '') - end - - ## - # Initialize a DN, escaping as required. Pass in attributes in name/value - # pairs. If there is a left over argument, it will be appended to the dn - # without escaping (useful for a base string). - # - # Most uses of this class will be to escape a DN, rather than to parse it, - # so storing the dn as an escaped String and parsing parts as required - # with a state machine seems sensible. - def initialize(*args) - if args.length > 1 - initialize_array(args) - else - initialize_string(args[0]) - end - end - - ## - # Parse a DN into key value pairs using ASN from - # http://tools.ietf.org/html/rfc2253 section 3. - # rubocop:disable Metrics/AbcSize - # rubocop:disable Metrics/CyclomaticComplexity - # rubocop:disable Metrics/PerceivedComplexity - def each_pair - state = :key - key = StringIO.new - value = StringIO.new - hex_buffer = "" - - @dn.each_char.with_index do |char, dn_index| - case state - when :key then - case char - when 'a'..'z', 'A'..'Z' then - state = :key_normal - key << char - when '0'..'9' then - state = :key_oid - key << char - when ' ' then state = :key - else raise(MalformedError, "Unrecognized first character of an RDN attribute type name \"#{char}\"") - end - when :key_normal then - case char - when '=' then state = :value - when 'a'..'z', 'A'..'Z', '0'..'9', '-', ' ' then key << char - else raise(MalformedError, "Unrecognized RDN attribute type name character \"#{char}\"") - end - when :key_oid then - case char - when '=' then state = :value - when '0'..'9', '.', ' ' then key << char - else raise(MalformedError, "Unrecognized RDN OID attribute type name character \"#{char}\"") - end - when :value then - case char - when '\\' then state = :value_normal_escape - when '"' then state = :value_quoted - when ' ' then state = :value - when '#' then - state = :value_hexstring - value << char - when ',' then - state = :key - yield key.string.strip, rstrip_except_escaped(value.string, dn_index) - key = StringIO.new - value = StringIO.new - else - state = :value_normal - value << char - end - when :value_normal then - case char - when '\\' then state = :value_normal_escape - when ',' then - state = :key - yield key.string.strip, rstrip_except_escaped(value.string, dn_index) - key = StringIO.new - value = StringIO.new - when '+' then raise(UnsupportedError, "Multivalued RDNs are not supported") - else value << char - end - when :value_normal_escape then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_normal_escape_hex - hex_buffer = char - else - state = :value_normal - value << char - end - when :value_normal_escape_hex then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_normal - value << "#{hex_buffer}#{char}".to_i(16).chr - else raise(MalformedError, "Invalid escaped hex code \"\\#{hex_buffer}#{char}\"") - end - when :value_quoted then - case char - when '\\' then state = :value_quoted_escape - when '"' then state = :value_end - else value << char - end - when :value_quoted_escape then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_quoted_escape_hex - hex_buffer = char - else - state = :value_quoted - value << char - end - when :value_quoted_escape_hex then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_quoted - value << "#{hex_buffer}#{char}".to_i(16).chr - else raise(MalformedError, "Expected the second character of a hex pair inside a double quoted value, but got \"#{char}\"") - end - when :value_hexstring then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_hexstring_hex - value << char - when ' ' then state = :value_end - when ',' then - state = :key - yield key.string.strip, rstrip_except_escaped(value.string, dn_index) - key = StringIO.new - value = StringIO.new - else raise(MalformedError, "Expected the first character of a hex pair, but got \"#{char}\"") - end - when :value_hexstring_hex then - case char - when '0'..'9', 'a'..'f', 'A'..'F' then - state = :value_hexstring - value << char - else raise(MalformedError, "Expected the second character of a hex pair, but got \"#{char}\"") - end - when :value_end then - case char - when ' ' then state = :value_end - when ',' then - state = :key - yield key.string.strip, rstrip_except_escaped(value.string, dn_index) - key = StringIO.new - value = StringIO.new - else raise(MalformedError, "Expected the end of an attribute value, but got \"#{char}\"") - end - else raise "Fell out of state machine" - end - end - - # Last pair - raise(MalformedError, 'DN string ended unexpectedly') unless - [:value, :value_normal, :value_hexstring, :value_end].include? state - - yield key.string.strip, rstrip_except_escaped(value.string, @dn.length) - end - - def rstrip_except_escaped(str, dn_index) - str_ends_with_whitespace = str.match(/\s\z/) - - if str_ends_with_whitespace - dn_part_ends_with_escaped_whitespace = @dn[0, dn_index].match(/\\(\s+)\z/) - - if dn_part_ends_with_escaped_whitespace - dn_part_rwhitespace = dn_part_ends_with_escaped_whitespace[1] - num_chars_to_remove = dn_part_rwhitespace.length - 1 - str = str[0, str.length - num_chars_to_remove] - else - str.rstrip! - end - end - - str - end - - ## - # Returns the DN as an array in the form expected by the constructor. - def to_a - a = [] - self.each_pair { |key, value| a << key << value } unless @dn.empty? - a - end - - ## - # Return the DN as an escaped string. - def to_s - @dn - end - - ## - # Return the DN as an escaped and normalized string. - def to_normalized_s - self.class.new(*to_a).to_s.downcase - end - - # https://tools.ietf.org/html/rfc4514 section 2.4 lists these exceptions - # for DN values. All of the following must be escaped in any normal string - # using a single backslash ('\') as escape. The space character is left - # out here because in a "normalized" string, spaces should only be escaped - # if necessary (i.e. leading or trailing space). - NORMAL_ESCAPES = [',', '+', '"', '\\', '<', '>', ';', '='].freeze - - # The following must be represented as escaped hex - HEX_ESCAPES = { - "\n" => '\0a', - "\r" => '\0d' - }.freeze - - # Compiled character class regexp using the keys from the above hash, and - # checking for a space or # at the start, or space at the end, of the - # string. - ESCAPE_RE = Regexp.new("(^ |^#| $|[" + - NORMAL_ESCAPES.map { |e| Regexp.escape(e) }.join + - "])") - - HEX_ESCAPE_RE = Regexp.new("([" + - HEX_ESCAPES.keys.map { |e| Regexp.escape(e) }.join + - "])") - - ## - # Escape a string for use in a DN value - def self.escape(string) - escaped = string.gsub(ESCAPE_RE) { |char| "\\" + char } - escaped.gsub(HEX_ESCAPE_RE) { |char| HEX_ESCAPES[char] } - end - - private - - def initialize_array(args) - buffer = StringIO.new - - args.each_with_index do |arg, index| - if index.even? # key - buffer << "," if index > 0 - buffer << arg - else # value - buffer << "=" - buffer << self.class.escape(arg) - end - end - - @dn = buffer.string - end - - def initialize_string(arg) - @dn = arg.to_s - end - - ## - # Proxy all other requests to the string object, because a DN is mainly - # used within the library as a string - # rubocop:disable GitlabSecurity/PublicSend - def method_missing(method, *args, &block) - @dn.send(method, *args, &block) - end - - ## - # Redefined to be consistent with redefined `method_missing` behavior - def respond_to?(sym, include_private = false) - @dn.respond_to?(sym, include_private) - end - end - end - end - end - - def perform(start_id, end_id) - return unless migrate? - - ldap_identities = Identity.where("provider like 'ldap%'").where(id: start_id..end_id) - ldap_identities.each do |identity| - identity.extern_uid = Gitlab::Auth::LDAP::DN.new(identity.extern_uid).to_normalized_s - unless identity.save - Rails.logger.info "Unable to normalize \"#{identity.extern_uid}\". Skipping." - end - rescue Gitlab::Auth::LDAP::DN::FormatError => e - Rails.logger.info "Unable to normalize \"#{identity.extern_uid}\" due to \"#{e.message}\". Skipping." - end - end - - def migrate? - Identity.table_exists? - end - end - end -end diff --git a/lib/gitlab/background_migration/populate_fork_networks_range.rb b/lib/gitlab/background_migration/populate_fork_networks_range.rb deleted file mode 100644 index aa4f130538c..00000000000 --- a/lib/gitlab/background_migration/populate_fork_networks_range.rb +++ /dev/null @@ -1,128 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module BackgroundMigration - # This background migration is going to create all `fork_networks` and - # the `fork_network_members` for the roots of fork networks based on the - # existing `forked_project_links`. - # - # When the source of a fork is deleted, we will create the fork with the - # target project as the root. This way, when there are forks of the target - # project, they will be joined into the same fork network. - # - # When the `fork_networks` and memberships for the root projects are created - # the `CreateForkNetworkMembershipsRange` migration is scheduled. This - # migration will create the memberships for all remaining forks-of-forks - class PopulateForkNetworksRange - def perform(start_id, end_id) - create_fork_networks_for_existing_projects(start_id, end_id) - create_fork_networks_for_missing_projects(start_id, end_id) - create_fork_networks_memberships_for_root_projects(start_id, end_id) - - delay = BackgroundMigration::CreateForkNetworkMembershipsRange::RESCHEDULE_DELAY - BackgroundMigrationWorker.perform_in( - delay, "CreateForkNetworkMembershipsRange", [start_id, end_id] - ) - end - - def create_fork_networks_for_existing_projects(start_id, end_id) - log("Creating fork networks: #{start_id} - #{end_id}") - ActiveRecord::Base.connection.execute <<~INSERT_NETWORKS - INSERT INTO fork_networks (root_project_id) - SELECT DISTINCT forked_project_links.forked_from_project_id - - FROM forked_project_links - - -- Exclude the forks that are not the first level fork of a project - WHERE NOT EXISTS ( - SELECT true - FROM forked_project_links inner_links - WHERE inner_links.forked_to_project_id = forked_project_links.forked_from_project_id - ) - - /* Exclude the ones that are already created, in case the fork network - was already created for another fork of the project. - */ - AND NOT EXISTS ( - SELECT true - FROM fork_networks - WHERE forked_project_links.forked_from_project_id = fork_networks.root_project_id - ) - - -- Only create a fork network for a root project that still exists - AND EXISTS ( - SELECT true - FROM projects - WHERE projects.id = forked_project_links.forked_from_project_id - ) - AND forked_project_links.id BETWEEN #{start_id} AND #{end_id} - INSERT_NETWORKS - end - - def create_fork_networks_for_missing_projects(start_id, end_id) - log("Creating fork networks with missing root: #{start_id} - #{end_id}") - ActiveRecord::Base.connection.execute <<~INSERT_NETWORKS - INSERT INTO fork_networks (root_project_id) - SELECT DISTINCT forked_project_links.forked_to_project_id - - FROM forked_project_links - - -- Exclude forks that are not the root forks - WHERE NOT EXISTS ( - SELECT true - FROM forked_project_links inner_links - WHERE inner_links.forked_to_project_id = forked_project_links.forked_from_project_id - ) - - /* Exclude the ones that are already created, in case this migration is - re-run - */ - AND NOT EXISTS ( - SELECT true - FROM fork_networks - WHERE forked_project_links.forked_to_project_id = fork_networks.root_project_id - ) - - /* Exclude projects for which the project still exists, those are - Processed in the previous step of this migration - */ - AND NOT EXISTS ( - SELECT true - FROM projects - WHERE projects.id = forked_project_links.forked_from_project_id - ) - AND forked_project_links.id BETWEEN #{start_id} AND #{end_id} - INSERT_NETWORKS - end - - def create_fork_networks_memberships_for_root_projects(start_id, end_id) - log("Creating memberships for root projects: #{start_id} - #{end_id}") - - ActiveRecord::Base.connection.execute <<~INSERT_ROOT - INSERT INTO fork_network_members (fork_network_id, project_id) - SELECT DISTINCT fork_networks.id, fork_networks.root_project_id - - FROM fork_networks - - /* Joining both on forked_from- and forked_to- so we could create the - memberships for forks for which the source was deleted - */ - INNER JOIN forked_project_links - ON forked_project_links.forked_from_project_id = fork_networks.root_project_id - OR forked_project_links.forked_to_project_id = fork_networks.root_project_id - - WHERE NOT EXISTS ( - SELECT true - FROM fork_network_members - WHERE fork_network_members.project_id = fork_networks.root_project_id - ) - AND forked_project_links.id BETWEEN #{start_id} AND #{end_id} - INSERT_ROOT - end - - def log(message) - Rails.logger.info("#{self.class.name} - #{message}") - end - end - end -end diff --git a/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id.rb b/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id.rb deleted file mode 100644 index dcac355e1b0..00000000000 --- a/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true -# rubocop:disable Style/Documentation - -module Gitlab - module BackgroundMigration - class PopulateMergeRequestsLatestMergeRequestDiffId - BATCH_SIZE = 1_000 - - class MergeRequest < ActiveRecord::Base - self.table_name = 'merge_requests' - - include ::EachBatch - end - - def perform(start_id, stop_id) - update = ' - latest_merge_request_diff_id = ( - SELECT MAX(id) - FROM merge_request_diffs - WHERE merge_requests.id = merge_request_diffs.merge_request_id - )'.squish - - MergeRequest - .where(id: start_id..stop_id) - .where(latest_merge_request_diff_id: nil) - .each_batch(of: BATCH_SIZE) do |relation| - - relation.update_all(update) - end - end - end - end -end diff --git a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml index 65a6630365d..cf3d261c1cb 100644 --- a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml @@ -74,16 +74,16 @@ stages: - cleanup include: - - template: Jobs/Build.gitlab-ci.yml - - template: Jobs/Test.gitlab-ci.yml - - template: Jobs/Code-Quality.gitlab-ci.yml - - template: Jobs/Deploy.gitlab-ci.yml - - template: Jobs/Browser-Performance-Testing.gitlab-ci.yml - - template: Security/DAST.gitlab-ci.yml - - template: Security/Container-Scanning.gitlab-ci.yml - - template: Security/Dependency-Scanning.gitlab-ci.yml - - template: Security/License-Management.gitlab-ci.yml - - template: Security/SAST.gitlab-ci.yml + - template: Jobs/Build.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml + - template: Jobs/Test.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Jobs/Test.gitlab-ci.yml + - template: Jobs/Code-Quality.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml + - template: Jobs/Deploy.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml + - template: Jobs/Browser-Performance-Testing.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml + - template: Security/DAST.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml + - template: Security/Container-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml + - template: Security/Dependency-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml + - template: Security/License-Management.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml + - template: Security/SAST.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml # Override DAST job to exclude master branch dast: diff --git a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml index 0d742aa282d..e7dacd3a1fc 100644 --- a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml @@ -4,6 +4,7 @@ image: ruby:2.3 variables: JEKYLL_ENV: production + LC_ALL: C.UTF-8 before_script: - bundle install diff --git a/lib/gitlab/legacy_github_import/release_formatter.rb b/lib/gitlab/legacy_github_import/release_formatter.rb index 746786b5a66..fdab6b512ea 100644 --- a/lib/gitlab/legacy_github_import/release_formatter.rb +++ b/lib/gitlab/legacy_github_import/release_formatter.rb @@ -10,6 +10,7 @@ module Gitlab name: raw_data.name, description: raw_data.body, created_at: raw_data.created_at, + released_at: raw_data.published_at, updated_at: raw_data.created_at } end diff --git a/lib/peek/views/redis.rb b/lib/peek/views/redis.rb new file mode 100644 index 00000000000..ad3c3c9fe01 --- /dev/null +++ b/lib/peek/views/redis.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'redis' +require 'peek-redis' + +module Gitlab + module Peek + module RedisInstrumented + def call(*args, &block) + start = Time.now + super(*args, &block) + ensure + duration = (Time.now - start) + add_call_details(duration, args) + end + + private + + def add_call_details(duration, args) + # redis-rb passes an array (e.g. [:get, key]) + return unless args.length == 1 + + detail_store << { + cmd: args.first, + duration: duration, + backtrace: Gitlab::Profiler.clean_backtrace(caller) + } + end + + def detail_store + ::Gitlab::SafeRequestStore['redis_call_details'] ||= [] + end + end + end +end + +module Peek + module Views + module RedisDetailed + def results + super.merge(details: details) + end + + def details + detail_store + .sort { |a, b| b[:duration] <=> a[:duration] } + .map(&method(:format_call_details)) + end + + def detail_store + ::Gitlab::SafeRequestStore['redis_call_details'] ||= [] + end + + def format_call_details(call) + call.merge(cmd: format_command(call[:cmd]), + duration: (call[:duration] * 1000).round(3)) + end + + def format_command(cmd) + # Scrub out the value of the SET calls to avoid binary + # data or large data from spilling into the view + if cmd.length >= 2 && cmd.first =~ /set/i + cmd[-1] = "<redacted>" + end + + cmd.join(' ') + end + end + end +end + +class Redis::Client + prepend Gitlab::Peek::RedisInstrumented +end + +module Peek + module Views + class Redis < View + prepend Peek::Views::RedisDetailed + end + end +end diff --git a/lib/tasks/migrate/setup_postgresql.rake b/lib/tasks/migrate/setup_postgresql.rake index f69d204c579..cda88c130bb 100644 --- a/lib/tasks/migrate/setup_postgresql.rake +++ b/lib/tasks/migrate/setup_postgresql.rake @@ -1,23 +1,9 @@ desc 'GitLab | Sets up PostgreSQL' task setup_postgresql: :environment do - require Rails.root.join('db/migrate/20151007120511_namespaces_projects_path_lower_indexes') - require Rails.root.join('db/migrate/20151008110232_add_users_lower_username_email_indexes') - require Rails.root.join('db/migrate/20161212142807_add_lower_path_index_to_routes') - require Rails.root.join('db/migrate/20170317203554_index_routes_path_for_like') - require Rails.root.join('db/migrate/20170724214302_add_lower_path_index_to_redirect_routes') - require Rails.root.join('db/migrate/20170503185032_index_redirect_routes_path_for_like') - require Rails.root.join('db/migrate/20171220191323_add_index_on_namespaces_lower_name.rb') require Rails.root.join('db/migrate/20180215181245_users_name_lower_index.rb') require Rails.root.join('db/migrate/20180504195842_project_name_lower_index.rb') require Rails.root.join('db/post_migrate/20180306164012_add_path_index_to_redirect_routes.rb') - NamespacesProjectsPathLowerIndexes.new.up - AddUsersLowerUsernameEmailIndexes.new.up - AddLowerPathIndexToRoutes.new.up - IndexRoutesPathForLike.new.up - AddLowerPathIndexToRedirectRoutes.new.up - IndexRedirectRoutesPathForLike.new.up - AddIndexOnNamespacesLowerName.new.up UsersNameLowerIndex.new.up ProjectNameLowerIndex.new.up AddPathIndexToRedirectRoutes.new.up diff --git a/lib/tasks/yarn.rake b/lib/tasks/yarn.rake index 2ac88a039e7..32061ad4a57 100644 --- a/lib/tasks/yarn.rake +++ b/lib/tasks/yarn.rake @@ -24,7 +24,7 @@ namespace :yarn do desc 'Install Node dependencies with Yarn' task install: ['yarn:available'] do - unless system('yarn install --pure-lockfile --ignore-engines') + unless system('yarn install --pure-lockfile --ignore-engines --prefer-offline') abort 'Error: Unable to install node modules.'.color(:red) end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 3268f8e8e2a..2f729921fb2 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -231,6 +231,9 @@ msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags" msgstr[0] "" msgstr[1] "" +msgid "%{tabname} changed" +msgstr "" + msgid "%{text} %{files}" msgid_plural "%{text} %{files} files" msgstr[0] "" @@ -348,9 +351,6 @@ msgstr "" msgid "2FA" msgstr "" -msgid "2FA enabled" -msgstr "" - msgid "2FADevice|Registered On" msgstr "" @@ -2215,6 +2215,9 @@ msgstr "" msgid "Close" msgstr "" +msgid "Close %{tabname}" +msgstr "" + msgid "Close milestone" msgstr "" @@ -2943,25 +2946,19 @@ msgstr "" msgid "Container registry images" msgstr "" -msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" +msgid "ContainerRegistry|Container Registry" msgstr "" -msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" - -msgid "ContainerRegistry|How to use the Container Registry" +msgid "ContainerRegistry|Docker connection error" msgstr "" msgid "ContainerRegistry|Last Updated" msgstr "" -msgid "ContainerRegistry|Learn more about" -msgstr "" - msgid "ContainerRegistry|No tags in Container Registry for this container image." msgstr "" -msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" +msgid "ContainerRegistry|Quick Start" msgstr "" msgid "ContainerRegistry|Remove image" @@ -2982,10 +2979,16 @@ msgstr "" msgid "ContainerRegistry|Tag ID" msgstr "" -msgid "ContainerRegistry|Use different image names" +msgid "ContainerRegistry|There are no container images stored for this project" +msgstr "" + +msgid "ContainerRegistry|We are having trouble connecting to Docker, which could be due to an issue with your project name or path. For more information, please review the %{docLinkStart}Container Registry documentation%{docLinkEnd}." +msgstr "" + +msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. Learn more about the %{docLinkStart}Container Registry%{docLinkEnd}." msgstr "" -msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." +msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images. Learn more about the %{docLinkStart}Container Registry%{docLinkEnd}." msgstr "" msgid "ContainerRegistry|You are about to delete the image <b>%{title}</b>. This will delete the image and all tags pointing to this image." @@ -2994,7 +2997,7 @@ msgstr "" msgid "ContainerRegistry|You are about to remove repository <b>%{title}</b>. Once you confirm, this repository will be permanently deleted." msgstr "" -msgid "ContainerRegistry|You can also use a %{deploy_token} for read-only access to the registry images." +msgid "ContainerRegistry|You can add an image to this registry with the following commands:" msgstr "" msgid "Contents of .gitlab-ci.yml" @@ -3560,6 +3563,9 @@ msgstr "" msgid "DeployTokens|Created" msgstr "" +msgid "DeployTokens|Default format is \"gitlab+deploy-token-{n}\". Enter custom username if you want to change it." +msgstr "" + msgid "DeployTokens|Deploy Tokens" msgstr "" @@ -4226,6 +4232,9 @@ msgstr "" msgid "Error saving label update." msgstr "" +msgid "Error setting up editor. Please try again." +msgstr "" + msgid "Error updating %{issuableType}" msgstr "" @@ -5610,6 +5619,21 @@ msgstr "" msgid "IssueBoards|Boards" msgstr "" +msgid "IssueTracker|Bugzilla issue tracker" +msgstr "" + +msgid "IssueTracker|Custom issue tracker" +msgstr "" + +msgid "IssueTracker|GitLab issue tracker" +msgstr "" + +msgid "IssueTracker|Redmine issue tracker" +msgstr "" + +msgid "IssueTracker|YouTrack issue tracker" +msgstr "" + msgid "Issues" msgstr "" @@ -6073,6 +6097,9 @@ msgstr "" msgid "Locked" msgstr "" +msgid "Locked by %{fileLockUserName}" +msgstr "" + msgid "Locked to current projects" msgstr "" @@ -6750,9 +6777,6 @@ msgstr "" msgid "No connection could be made to a Gitaly Server, please check your logs!" msgstr "" -msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" - msgid "No contributions" msgstr "" @@ -7040,6 +7064,9 @@ msgstr "" msgid "Open in Xcode" msgstr "" +msgid "Open in file view" +msgstr "" + msgid "Open issues" msgstr "" @@ -7547,9 +7574,6 @@ msgstr "" msgid "Please wait while we import the repository for you. Refresh at will." msgstr "" -msgid "Pre-release" -msgstr "" - msgid "Preferences" msgstr "" @@ -9803,6 +9827,9 @@ msgstr "" msgid "Start a %{new_merge_request} with these changes" msgstr "" +msgid "Start a new discussion..." +msgstr "" + msgid "Start a new merge request" msgstr "" @@ -11360,6 +11387,9 @@ msgstr "" msgid "Upcoming" msgstr "" +msgid "Upcoming Release" +msgstr "" + msgid "Update" msgstr "" @@ -12462,9 +12492,6 @@ msgstr[1] "" msgid "deleted" msgstr "" -msgid "deploy token" -msgstr "" - msgid "detached" msgstr "" @@ -12858,9 +12885,6 @@ msgstr[1] "" msgid "password" msgstr "" -msgid "personal access token" -msgstr "" - msgid "private" msgstr "" diff --git a/package.json b/package.json index da2ac7d64ef..e645eb8ed1c 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,6 @@ "gettext-extractor": "^3.4.3", "gettext-extractor-vue": "^4.0.2", "graphql-tag": "^2.10.0", - "istanbul": "^0.4.5", "jasmine-core": "^2.9.0", "jasmine-diff": "^0.1.3", "jasmine-jquery": "^2.1.1", diff --git a/qa/qa/page/project/operations/kubernetes/show.rb b/qa/qa/page/project/operations/kubernetes/show.rb index c81e13e9b91..4f625c5f0f0 100644 --- a/qa/qa/page/project/operations/kubernetes/show.rb +++ b/qa/qa/page/project/operations/kubernetes/show.rb @@ -28,12 +28,16 @@ module QA end end - def await_installed(application_name) + def await_installed(application_name, button_text: 'Installed') within(".js-cluster-application-row-#{application_name}") do - page.has_text?('Installed', wait: 300) + page.has_text?(button_text, wait: 300) end end + def await_uninstallable(application_name) + await_installed(application_name, button_text: 'Uninstall') + end + def ingress_ip # We need to wait longer since it can take some time before the # ip address is assigned for the ingress controller diff --git a/qa/qa/resource/kubernetes_cluster.rb b/qa/qa/resource/kubernetes_cluster.rb index 27ab7b60211..1dd93dd5b88 100644 --- a/qa/qa/resource/kubernetes_cluster.rb +++ b/qa/qa/resource/kubernetes_cluster.rb @@ -47,7 +47,7 @@ module QA page.install!(:runner) if @install_runner page.await_installed(:ingress) if @install_ingress - page.await_installed(:prometheus) if @install_prometheus + page.await_uninstallable(:prometheus) if @install_prometheus page.await_installed(:runner) if @install_runner if @install_ingress diff --git a/spec/controllers/projects/settings/repository_controller_spec.rb b/spec/controllers/projects/settings/repository_controller_spec.rb index b34053fc993..7f67f67e775 100644 --- a/spec/controllers/projects/settings/repository_controller_spec.rb +++ b/spec/controllers/projects/settings/repository_controller_spec.rb @@ -32,4 +32,24 @@ describe Projects::Settings::RepositoryController do expect(RepositoryCleanupWorker).to have_received(:perform_async).once end end + + describe 'POST create_deploy_token' do + let(:deploy_token_params) do + { + name: 'deployer_token', + expires_at: 1.month.from_now.to_date.to_s, + username: 'deployer', + read_repository: '1' + } + end + + subject(:create_deploy_token) { post :create_deploy_token, params: { namespace_id: project.namespace, project_id: project, deploy_token: deploy_token_params } } + + it 'creates deploy token' do + expect { create_deploy_token }.to change { DeployToken.active.count }.by(1) + + expect(response).to have_gitlab_http_status(200) + expect(response).to render_template(:show) + end + end end diff --git a/spec/factories/project_statistics.rb b/spec/factories/project_statistics.rb index 2d0f698475d..3d4174eb852 100644 --- a/spec/factories/project_statistics.rb +++ b/spec/factories/project_statistics.rb @@ -6,5 +6,20 @@ FactoryBot.define do # statistics are automatically created when a project is created project&.statistics || new end + + transient do + with_data { false } + size_multiplier { 1 } + end + + after(:build) do |project_statistics, evaluator| + if evaluator.with_data + project_statistics.repository_size = evaluator.size_multiplier + project_statistics.wiki_size = evaluator.size_multiplier * 2 + project_statistics.lfs_objects_size = evaluator.size_multiplier * 3 + project_statistics.build_artifacts_size = evaluator.size_multiplier * 4 + project_statistics.packages_size = evaluator.size_multiplier * 5 + end + end end end diff --git a/spec/factories/releases.rb b/spec/factories/releases.rb index cab6b4a811f..4cacc77c182 100644 --- a/spec/factories/releases.rb +++ b/spec/factories/releases.rb @@ -6,6 +6,7 @@ FactoryBot.define do description "Awesome release" project author + released_at { Time.zone.parse('2018-10-20T18:00:00Z') } trait :legacy do sha nil diff --git a/spec/factories/services.rb b/spec/factories/services.rb index 763909f30bd..ecb481ed84a 100644 --- a/spec/factories/services.rb +++ b/spec/factories/services.rb @@ -6,8 +6,6 @@ FactoryBot.define do factory :custom_issue_tracker_service, class: CustomIssueTrackerService do project - type 'CustomIssueTrackerService' - category 'issue_tracker' active true properties( project_url: 'https://project.url.com', @@ -54,6 +52,38 @@ FactoryBot.define do ) end + factory :bugzilla_service do + project + active true + issue_tracker + end + + factory :redmine_service do + project + active true + issue_tracker + end + + factory :youtrack_service do + project + active true + issue_tracker + end + + factory :gitlab_issue_tracker_service do + project + active true + issue_tracker + end + + trait :issue_tracker do + properties( + project_url: 'http://issue-tracker.example.com', + issues_url: 'http://issue-tracker.example.com', + new_issue_url: 'http://issue-tracker.example.com' + ) + end + factory :jira_cloud_service, class: JiraService do project active true diff --git a/spec/features/container_registry_spec.rb b/spec/features/container_registry_spec.rb index 21d97aba0c5..1b5943bd5d8 100644 --- a/spec/features/container_registry_spec.rb +++ b/spec/features/container_registry_spec.rb @@ -19,7 +19,7 @@ describe "Container Registry", :js do it 'user visits container registry main page' do visit_container_registry - expect(page).to have_content 'No container images' + expect(page).to have_content 'no container images' end end diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb index c000165ccd9..0ada530781c 100644 --- a/spec/features/groups/issues_spec.rb +++ b/spec/features/groups/issues_spec.rb @@ -150,6 +150,25 @@ describe 'Group issues page' do check_issue_order end + it 'issues should not be draggable when user is not logged in', :js do + sign_out(user_in_group) + + visit issues_group_path(group, sort: 'relative_position') + + drag_to(selector: '.manual-ordering', + from_index: 0, + to_index: 2) + + wait_for_requests + + # Issue order should remain the same + page.within('.manual-ordering') do + expect(find('.issue:nth-child(1) .title')).to have_content('Issue #1') + expect(find('.issue:nth-child(2) .title')).to have_content('Issue #2') + expect(find('.issue:nth-child(3) .title')).to have_content('Issue #3') + end + end + def check_issue_order page.within('.manual-ordering') do expect(find('.issue:nth-child(1) .title')).to have_content('Issue #2') diff --git a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb index 0d946182c6f..1b1a31d0723 100644 --- a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb @@ -54,7 +54,7 @@ describe 'Resolve an open thread in a merge request by creating an issue', :js d context 'creating the issue' do before do - find(resolve_discussion_selector).click + find(resolve_discussion_selector, match: :first).click end it 'has a hidden field for the thread' do diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb index a6b846edd54..10fe60cb075 100644 --- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb +++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb @@ -368,8 +368,8 @@ describe 'Merge request > User resolves diff notes and threads', :js do all_discussion_replies = page.all('.discussion-reply-holder') expect(all_discussion_replies.count).to eq(2) - expect(all_discussion_replies.first.all('.discussion-next-btn').count).to eq(1) - expect(all_discussion_replies.last.all('.discussion-next-btn').count).to eq(1) + expect(all_discussion_replies.first.all('.discussion-next-btn').count).to eq(2) + expect(all_discussion_replies.last.all('.discussion-next-btn').count).to eq(2) end it 'displays next thread even if hidden' do diff --git a/spec/features/projects/clusters/applications_spec.rb b/spec/features/projects/clusters/applications_spec.rb index 527508b3519..c75259d1b0c 100644 --- a/spec/features/projects/clusters/applications_spec.rb +++ b/spec/features/projects/clusters/applications_spec.rb @@ -21,8 +21,7 @@ describe 'Clusters Applications', :js do it 'user is unable to install applications' do page.within('.js-cluster-application-row-helm') do - expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true') - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Install') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Install') end end end @@ -53,19 +52,16 @@ describe 'Clusters Applications', :js do it 'they see status transition' do page.within('.js-cluster-application-row-helm') do # FE sends request and gets the response, then the buttons is "Installing" - expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true') - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installing') Clusters::Cluster.last.application_helm.make_installing! # FE starts polling and update the buttons to "Installing" - expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true') - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installing') Clusters::Cluster.last.application_helm.make_installed! - expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true') - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installed') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installed') end expect(page).to have_content('Helm Tiller was successfully installed on your Kubernetes cluster') @@ -212,26 +208,25 @@ describe 'Clusters Applications', :js do it 'they see status transition' do page.within('.js-cluster-application-row-ingress') do # FE sends request and gets the response, then the buttons is "Installing" - expect(page).to have_css('.js-cluster-application-install-button[disabled]') - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installing') Clusters::Cluster.last.application_ingress.make_installing! # FE starts polling and update the buttons to "Installing" - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing') - expect(page).to have_css('.js-cluster-application-install-button[disabled]') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installing') # The application becomes installed but we keep waiting for external IP address Clusters::Cluster.last.application_ingress.make_installed! - expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installed') - expect(page).to have_css('.js-cluster-application-install-button[disabled]') + expect(page).to have_css('.js-cluster-application-install-button[disabled]', exact_text: 'Installed') expect(page).to have_selector('.js-no-endpoint-message') expect(page).to have_selector('.js-ingress-ip-loading-icon') # We receive the external IP address and display Clusters::Cluster.last.application_ingress.update!(external_ip: '192.168.1.100') + expect(page).not_to have_css('.js-cluster-application-install-button') + expect(page).to have_css('.js-cluster-application-uninstall-button:not([disabled])', exact_text: 'Uninstall') expect(page).not_to have_selector('.js-no-endpoint-message') expect(page.find('.js-endpoint').value).to eq('192.168.1.100') end diff --git a/spec/features/projects/releases/user_views_releases_spec.rb b/spec/features/projects/releases/user_views_releases_spec.rb index 317ffb6a2ff..725d7173bce 100644 --- a/spec/features/projects/releases/user_views_releases_spec.rb +++ b/spec/features/projects/releases/user_views_releases_spec.rb @@ -16,6 +16,7 @@ describe 'User views releases', :js do expect(page).to have_content(release.name) expect(page).to have_content(release.tag) + expect(page).not_to have_content('Upcoming Release') end context 'when there is a link as an asset' do @@ -43,4 +44,15 @@ describe 'User views releases', :js do end end end + + context 'with an upcoming release' do + let(:tomorrow) { Time.zone.now + 1.day } + let!(:release) { create(:release, project: project, released_at: tomorrow ) } + + it 'sees the upcoming tag' do + visit project_releases_path(project) + + expect(page).to have_content('Upcoming Release') + end + end end diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb index 8c7bc192c50..1edfee705c8 100644 --- a/spec/features/projects/settings/repository_settings_spec.rb +++ b/spec/features/projects/settings/repository_settings_spec.rb @@ -112,11 +112,17 @@ describe 'Projects > Settings > Repository settings' do it 'add a new deploy token' do fill_in 'deploy_token_name', with: 'new_deploy_key' fill_in 'deploy_token_expires_at', with: (Date.today + 1.month).to_s + fill_in 'deploy_token_username', with: 'deployer' check 'deploy_token_read_repository' check 'deploy_token_read_registry' click_button 'Create deploy token' expect(page).to have_content('Your new project deploy token has been created') + + within('.created-deploy-token-container') do + expect(page).to have_selector("input[name='deploy-token-user'][value='deployer']") + expect(page).to have_selector("input[name='deploy-token'][readonly='readonly']") + end end end diff --git a/spec/finders/releases_finder_spec.rb b/spec/finders/releases_finder_spec.rb index 32ee15134a2..5ffb8c74bf5 100644 --- a/spec/finders/releases_finder_spec.rb +++ b/spec/finders/releases_finder_spec.rb @@ -12,8 +12,8 @@ describe ReleasesFinder do subject { described_class.new(project, user)} before do - v1_0_0.update_attribute(:created_at, 2.days.ago) - v1_1_0.update_attribute(:created_at, 1.day.ago) + v1_0_0.update_attribute(:released_at, 2.days.ago) + v1_1_0.update_attribute(:released_at, 1.day.ago) end describe '#execute' do @@ -30,7 +30,7 @@ describe ReleasesFinder do project.add_developer(user) end - it 'sorts by creation date' do + it 'sorts by release date' do releases = subject.execute expect(releases).to be_present diff --git a/spec/fixtures/api/schemas/public_api/v4/release.json b/spec/fixtures/api/schemas/public_api/v4/release.json index 6ea0781c1ed..ec3fa59cdb1 100644 --- a/spec/fixtures/api/schemas/public_api/v4/release.json +++ b/spec/fixtures/api/schemas/public_api/v4/release.json @@ -1,12 +1,14 @@ { "type": "object", - "required": ["name", "tag_name", "commit"], + "required": ["name", "tag_name", "commit", "released_at"], "properties": { "name": { "type": "string" }, "tag_name": { "type": "string" }, "description": { "type": "string" }, "description_html": { "type": "string" }, "created_at": { "type": "date" }, + "released_at": { "type": "date" }, + "upcoming_release": { "type": "boolean" }, "commit": { "oneOf": [{ "type": "null" }, { "$ref": "commit/basic.json" }] }, diff --git a/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json b/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json index e78398ad1d5..0c1e8fd5fb3 100644 --- a/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json +++ b/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json @@ -1,11 +1,13 @@ { "type": "object", - "required": ["name"], + "required": ["name", "released_at"], "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "description_html": { "type": "string" }, "created_at": { "type": "date" }, + "released_at": { "type": "date" }, + "upcoming_release": { "type": "boolean" }, "author": { "oneOf": [{ "type": "null" }, { "$ref": "../user/basic.json" }] }, diff --git a/spec/frontend/diffs/components/diff_discussion_reply_spec.js b/spec/frontend/diffs/components/diff_discussion_reply_spec.js new file mode 100644 index 00000000000..28689ab07de --- /dev/null +++ b/spec/frontend/diffs/components/diff_discussion_reply_spec.js @@ -0,0 +1,90 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import Vuex from 'vuex'; +import DiffDiscussionReply from '~/diffs/components/diff_discussion_reply.vue'; +import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue'; +import NoteSignedOutWidget from '~/notes/components/note_signed_out_widget.vue'; + +const localVue = createLocalVue(); +localVue.use(Vuex); + +describe('DiffDiscussionReply', () => { + let wrapper; + let getters; + let store; + + const createComponent = (props = {}, slots = {}) => { + wrapper = shallowMount(DiffDiscussionReply, { + store, + localVue, + sync: false, + propsData: { + ...props, + }, + slots: { + ...slots, + }, + }); + }; + + afterEach(() => { + wrapper.destroy(); + }); + + describe('if user can reply', () => { + beforeEach(() => { + getters = { + userCanReply: () => true, + getUserData: () => ({ + path: 'test-path', + avatar_url: 'avatar_url', + name: 'John Doe', + }), + }; + + store = new Vuex.Store({ + getters, + }); + }); + + it('should render a form if component has form', () => { + createComponent( + { + renderReplyPlaceholder: false, + hasForm: true, + }, + { + form: `<div id="test-form"></div>`, + }, + ); + + expect(wrapper.find('#test-form').exists()).toBe(true); + }); + + it('should render a reply placeholder if there is no form', () => { + createComponent({ + renderReplyPlaceholder: true, + hasForm: false, + }); + + expect(wrapper.find(ReplyPlaceholder).exists()).toBe(true); + }); + }); + + it('renders a signed out widget when user is not logged in', () => { + getters = { + userCanReply: () => false, + getUserData: () => null, + }; + + store = new Vuex.Store({ + getters, + }); + + createComponent({ + renderReplyPlaceholder: false, + hasForm: false, + }); + + expect(wrapper.find(NoteSignedOutWidget).exists()).toBe(true); + }); +}); diff --git a/spec/frontend/diffs/components/diff_gutter_avatars_spec.js b/spec/frontend/diffs/components/diff_gutter_avatars_spec.js new file mode 100644 index 00000000000..48ee5c63f35 --- /dev/null +++ b/spec/frontend/diffs/components/diff_gutter_avatars_spec.js @@ -0,0 +1,113 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import DiffGutterAvatars from '~/diffs/components/diff_gutter_avatars.vue'; +import discussionsMockData from '../mock_data/diff_discussions'; + +const localVue = createLocalVue(); +const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)]; + +describe('DiffGutterAvatars', () => { + let wrapper; + + const findCollapseButton = () => wrapper.find('.diff-notes-collapse'); + const findMoreCount = () => wrapper.find('.diff-comments-more-count'); + const findUserAvatars = () => wrapper.findAll('.diff-comment-avatar'); + + const createComponent = (props = {}) => { + wrapper = shallowMount(DiffGutterAvatars, { + localVue, + sync: false, + propsData: { + ...props, + }, + }); + }; + + afterEach(() => { + wrapper.destroy(); + }); + + describe('when expanded', () => { + beforeEach(() => { + createComponent({ + discussions: getDiscussionsMockData(), + discussionsExpanded: true, + }); + }); + + it('renders a collapse button when discussions are expanded', () => { + expect(findCollapseButton().exists()).toBe(true); + }); + + it('should emit toggleDiscussions event on button click', () => { + findCollapseButton().trigger('click'); + + expect(wrapper.emitted().toggleLineDiscussions).toBeTruthy(); + }); + }); + + describe('when collapsed', () => { + beforeEach(() => { + createComponent({ + discussions: getDiscussionsMockData(), + discussionsExpanded: false, + }); + }); + + it('renders user avatars and moreCount text', () => { + expect(findUserAvatars().exists()).toBe(true); + expect(findMoreCount().exists()).toBe(true); + }); + + it('renders correct amount of user avatars', () => { + expect(findUserAvatars().length).toBe(3); + }); + + it('renders correct moreCount number', () => { + expect(findMoreCount().text()).toBe('+2'); + }); + + it('should emit toggleDiscussions event on avatars click', () => { + findUserAvatars() + .at(0) + .trigger('click'); + + expect(wrapper.emitted().toggleLineDiscussions).toBeTruthy(); + }); + + it('should emit toggleDiscussions event on more count text click', () => { + findMoreCount().trigger('click'); + + expect(wrapper.emitted().toggleLineDiscussions).toBeTruthy(); + }); + }); + + it('renders an empty more count string if there are no discussions', () => { + createComponent({ + discussions: [], + discussionsExpanded: false, + }); + + expect(findMoreCount().exists()).toBe(false); + }); + + describe('tooltip text', () => { + beforeEach(() => { + createComponent({ + discussions: getDiscussionsMockData(), + discussionsExpanded: false, + }); + }); + + it('returns original comment if it is shorter than max length', () => { + const note = wrapper.vm.discussions[0].notes[0]; + + expect(wrapper.vm.getTooltipText(note)).toEqual('Administrator: comment 1'); + }); + + it('returns truncated version of comment if it is longer than max length', () => { + const note = wrapper.vm.discussions[0].notes[1]; + + expect(wrapper.vm.getTooltipText(note)).toEqual('Fatih Acet: comment 2 is r...'); + }); + }); +}); diff --git a/spec/frontend/diffs/mock_data/diff_discussions.js b/spec/frontend/diffs/mock_data/diff_discussions.js new file mode 100644 index 00000000000..711ab543411 --- /dev/null +++ b/spec/frontend/diffs/mock_data/diff_discussions.js @@ -0,0 +1,529 @@ +export default { + id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + reply_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + position: { + old_line: null, + new_line: 2, + old_path: 'CHANGELOG', + new_path: 'CHANGELOG', + base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a', + start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962', + head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13', + }, + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2', + expanded: true, + notes: [ + { + id: '1749', + type: 'DiffNote', + attachment: null, + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + created_at: '2018-04-03T21:06:21.521Z', + updated_at: '2018-04-08T08:50:41.762Z', + system: false, + noteable_id: 51, + noteable_type: 'MergeRequest', + noteable_iid: 20, + human_access: 'Owner', + note: 'comment 1', + note_html: '<p dir="auto">comment 1</p>', + last_edited_at: '2018-04-08T08:50:41.762Z', + last_edited_by: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + current_user: { + can_edit: true, + can_award_emoji: true, + }, + resolved: false, + resolvable: true, + resolved_by: null, + discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + emoji_awardable: true, + award_emoji: [], + toggle_award_path: '/gitlab-org/gitlab-test/notes/1749/toggle_award_emoji', + report_abuse_path: + '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1749&user_id=1', + path: '/gitlab-org/gitlab-test/notes/1749', + noteable_note_url: 'http://localhost:3000/gitlab-org/gitlab-test/merge_requests/20#note_1749', + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + }, + { + id: '1753', + type: 'DiffNote', + attachment: null, + author: { + id: 1, + name: 'Fatih Acet', + username: 'fatihacet', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/fatihacevt', + }, + created_at: '2018-04-08T08:49:35.804Z', + updated_at: '2018-04-08T08:50:45.915Z', + system: false, + noteable_id: 51, + noteable_type: 'MergeRequest', + noteable_iid: 20, + human_access: 'Owner', + note: 'comment 2 is really long one', + note_html: '<p dir="auto">comment 2 is really long one</p>', + last_edited_at: '2018-04-08T08:50:45.915Z', + last_edited_by: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + current_user: { + can_edit: true, + can_award_emoji: true, + }, + resolved: false, + resolvable: true, + resolved_by: null, + discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + emoji_awardable: true, + award_emoji: [], + toggle_award_path: '/gitlab-org/gitlab-test/notes/1753/toggle_award_emoji', + report_abuse_path: + '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1753&user_id=1', + path: '/gitlab-org/gitlab-test/notes/1753', + noteable_note_url: 'http://localhost:3000/gitlab-org/gitlab-test/merge_requests/20#note_1753', + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + }, + { + id: '1754', + type: 'DiffNote', + attachment: null, + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + created_at: '2018-04-08T08:50:48.294Z', + updated_at: '2018-04-08T08:50:48.294Z', + system: false, + noteable_id: 51, + noteable_type: 'MergeRequest', + noteable_iid: 20, + human_access: 'Owner', + note: 'comment 3', + note_html: '<p dir="auto">comment 3</p>', + current_user: { + can_edit: true, + can_award_emoji: true, + }, + resolved: false, + resolvable: true, + resolved_by: null, + discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + emoji_awardable: true, + award_emoji: [], + toggle_award_path: '/gitlab-org/gitlab-test/notes/1754/toggle_award_emoji', + report_abuse_path: + '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1754&user_id=1', + path: '/gitlab-org/gitlab-test/notes/1754', + noteable_note_url: 'http://localhost:3000/gitlab-org/gitlab-test/merge_requests/20#note_1754', + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + }, + { + id: '1755', + type: 'DiffNote', + attachment: null, + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + created_at: '2018-04-08T08:50:50.911Z', + updated_at: '2018-04-08T08:50:50.911Z', + system: false, + noteable_id: 51, + noteable_type: 'MergeRequest', + noteable_iid: 20, + human_access: 'Owner', + note: 'comment 4', + note_html: '<p dir="auto">comment 4</p>', + current_user: { + can_edit: true, + can_award_emoji: true, + }, + resolved: false, + resolvable: true, + resolved_by: null, + discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + emoji_awardable: true, + award_emoji: [], + toggle_award_path: '/gitlab-org/gitlab-test/notes/1755/toggle_award_emoji', + report_abuse_path: + '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1755&user_id=1', + path: '/gitlab-org/gitlab-test/notes/1755', + noteable_note_url: 'http://localhost:3000/gitlab-org/gitlab-test/merge_requests/20#note_1755', + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + }, + { + id: '1756', + type: 'DiffNote', + attachment: null, + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + path: '/root', + }, + created_at: '2018-04-08T08:50:53.895Z', + updated_at: '2018-04-08T08:50:53.895Z', + system: false, + noteable_id: 51, + noteable_type: 'MergeRequest', + noteable_iid: 20, + human_access: 'Owner', + note: 'comment 5', + note_html: '<p dir="auto">comment 5</p>', + current_user: { + can_edit: true, + can_award_emoji: true, + }, + resolved: false, + resolvable: true, + resolved_by: null, + discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8', + emoji_awardable: true, + award_emoji: [], + toggle_award_path: '/gitlab-org/gitlab-test/notes/1756/toggle_award_emoji', + report_abuse_path: + '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1756&user_id=1', + path: '/gitlab-org/gitlab-test/notes/1756', + noteable_note_url: 'http://localhost:3000/gitlab-org/gitlab-test/merge_requests/20#note_1756', + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + }, + ], + individual_note: false, + resolvable: true, + resolved: false, + resolve_path: + '/gitlab-org/gitlab-test/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve', + resolve_with_issue_path: + '/gitlab-org/gitlab-test/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20', + diff_file: { + submodule: false, + submodule_link: null, + blob: { + id: '9e10516ca50788acf18c518a231914a21e5f16f7', + path: 'CHANGELOG', + name: 'CHANGELOG', + mode: '100644', + readable_text: true, + icon: 'file-text-o', + }, + blob_path: 'CHANGELOG', + blob_name: 'CHANGELOG', + blob_icon: '<i aria-hidden="true" data-hidden="true" class="fa fa-file-text-o fa-fw"></i>', + file_hash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a', + file_path: 'CHANGELOG.rb', + new_file: false, + deleted_file: false, + renamed_file: false, + old_path: 'CHANGELOG', + new_path: 'CHANGELOG', + mode_changed: false, + a_mode: '100644', + b_mode: '100644', + text: true, + added_lines: 2, + removed_lines: 0, + diff_refs: { + base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a', + start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962', + head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13', + }, + content_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13', + stored_externally: null, + external_storage: null, + old_path_html: 'CHANGELOG_OLD', + new_path_html: 'CHANGELOG', + is_fully_expanded: true, + context_lines_path: + '/gitlab-org/gitlab-test/blob/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG/diff', + highlighted_diff_lines: [ + { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1', + type: 'new', + old_line: null, + new_line: 1, + text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n', + rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n', + meta_data: null, + }, + { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2', + type: 'new', + old_line: null, + new_line: 2, + text: '<span id="LC2" class="line" lang="plaintext"></span>\n', + rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n', + meta_data: null, + }, + { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3', + type: null, + old_line: 1, + new_line: 3, + text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + meta_data: null, + }, + { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4', + type: null, + old_line: 2, + new_line: 4, + text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + meta_data: null, + }, + { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5', + type: null, + old_line: 3, + new_line: 5, + text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + meta_data: null, + }, + { + line_code: null, + type: 'match', + old_line: null, + new_line: null, + text: '', + rich_text: '', + meta_data: { + old_pos: 3, + new_pos: 5, + }, + }, + { + line_code: null, + type: 'match', + old_line: null, + new_line: null, + text: '', + rich_text: '', + meta_data: { + old_pos: 3, + new_pos: 5, + }, + }, + { + line_code: null, + type: 'match', + old_line: null, + new_line: null, + text: '', + rich_text: '', + meta_data: { + old_pos: 3, + new_pos: 5, + }, + }, + ], + parallel_diff_lines: [ + { + left: null, + right: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1', + type: 'new', + old_line: null, + new_line: 1, + text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n', + rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n', + meta_data: null, + }, + }, + { + left: null, + right: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2', + type: 'new', + old_line: null, + new_line: 2, + text: '<span id="LC2" class="line" lang="plaintext"></span>\n', + rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n', + meta_data: null, + }, + }, + { + left: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3', + type: null, + old_line: 1, + new_line: 3, + text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + meta_data: null, + }, + right: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3', + type: null, + old_line: 1, + new_line: 3, + text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n', + meta_data: null, + }, + }, + { + left: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4', + type: null, + old_line: 2, + new_line: 4, + text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + meta_data: null, + }, + right: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4', + type: null, + old_line: 2, + new_line: 4, + text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n', + meta_data: null, + }, + }, + { + left: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5', + type: null, + old_line: 3, + new_line: 5, + text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + meta_data: null, + }, + right: { + line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5', + type: null, + old_line: 3, + new_line: 5, + text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n', + meta_data: null, + }, + }, + { + left: { + line_code: null, + type: 'match', + old_line: null, + new_line: null, + text: '', + rich_text: '', + meta_data: { + old_pos: 3, + new_pos: 5, + }, + }, + right: { + line_code: null, + type: 'match', + old_line: null, + new_line: null, + text: '', + rich_text: '', + meta_data: { + old_pos: 3, + new_pos: 5, + }, + }, + }, + ], + viewer: { + name: 'text', + error: null, + }, + }, + diff_discussion: true, + truncated_diff_lines: [ + { + text: 'line', + rich_text: + '<tr class="line_holder new" id="">\n<td class="diff-line-num new old_line" data-linenumber="1">\n \n</td>\n<td class="diff-line-num new new_line" data-linenumber="1">\n1\n</td>\n<td class="line_content new"><span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n</td>\n</tr>\n<tr class="line_holder new" id="">\n<td class="diff-line-num new old_line" data-linenumber="1">\n \n</td>\n<td class="diff-line-num new new_line" data-linenumber="2">\n2\n</td>\n<td class="line_content new"><span id="LC2" class="line" lang="plaintext"></span>\n</td>\n</tr>\n', + can_receive_suggestion: true, + line_code: '6f209374f7e565f771b95720abf46024c41d1885_1_1', + type: 'new', + old_line: null, + new_line: 1, + meta_data: null, + }, + ], +}; + +export const imageDiffDiscussions = [ + { + id: '1', + position: { + x: 10, + y: 10, + width: 100, + height: 200, + }, + }, + { + id: '2', + position: { + x: 5, + y: 5, + width: 100, + height: 200, + }, + }, +]; diff --git a/spec/frontend/lib/utils/text_utility_spec.js b/spec/frontend/lib/utils/text_utility_spec.js index 9e920d59093..dc886d0db3b 100644 --- a/spec/frontend/lib/utils/text_utility_spec.js +++ b/spec/frontend/lib/utils/text_utility_spec.js @@ -55,9 +55,24 @@ describe('text_utility', () => { }); }); - describe('slugifyWithHyphens', () => { + describe('slugify', () => { + it('should remove accents and convert to lower case', () => { + expect(textUtils.slugify('João')).toEqual('jo-o'); + }); it('should replaces whitespaces with hyphens and convert to lower case', () => { - expect(textUtils.slugifyWithHyphens('My Input String')).toEqual('my-input-string'); + expect(textUtils.slugify('My Input String')).toEqual('my-input-string'); + }); + it('should remove trailing whitespace and replace whitespaces within string with a hyphen', () => { + expect(textUtils.slugify(' a new project ')).toEqual('a-new-project'); + }); + it('should only remove non-allowed special characters', () => { + expect(textUtils.slugify('test!_pro-ject~')).toEqual('test-_pro-ject-'); + }); + it('should squash multiple hypens', () => { + expect(textUtils.slugify('test!!!!_pro-ject~')).toEqual('test-_pro-ject-'); + }); + it('should return empty string if only non-allowed characters', () => { + expect(textUtils.slugify('здрасти')).toEqual(''); }); }); diff --git a/spec/frontend/notes/components/discussion_notes_spec.js b/spec/frontend/notes/components/discussion_notes_spec.js index 394666403ee..58d367077e8 100644 --- a/spec/frontend/notes/components/discussion_notes_spec.js +++ b/spec/frontend/notes/components/discussion_notes_spec.js @@ -87,7 +87,7 @@ describe('DiscussionNotes', () => { discussion.notes[0], ]; discussion.notes = notesData; - createComponent({ discussion }); + createComponent({ discussion, shouldRenderDiffs: true }); const notes = wrapper.findAll('.notes > li'); expect(notes.at(0).is(PlaceholderSystemNote)).toBe(true); diff --git a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js index 07a366cf339..e008f4ed093 100644 --- a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js +++ b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js @@ -2,13 +2,19 @@ import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vu import { shallowMount, createLocalVue } from '@vue/test-utils'; const localVue = createLocalVue(); +const buttonText = 'Test Button Text'; describe('ReplyPlaceholder', () => { let wrapper; + const findButton = () => wrapper.find({ ref: 'button' }); + beforeEach(() => { wrapper = shallowMount(ReplyPlaceholder, { localVue, + propsData: { + buttonText, + }, }); }); @@ -17,9 +23,7 @@ describe('ReplyPlaceholder', () => { }); it('emits onClick even on button click', () => { - const button = wrapper.find({ ref: 'button' }); - - button.trigger('click'); + findButton().trigger('click'); expect(wrapper.emitted()).toEqual({ onClick: [[]], @@ -27,8 +31,6 @@ describe('ReplyPlaceholder', () => { }); it('should render reply button', () => { - const button = wrapper.find({ ref: 'button' }); - - expect(button.text()).toEqual('Reply...'); + expect(findButton().text()).toEqual(buttonText); }); }); diff --git a/spec/javascripts/diffs/components/diff_file_header_spec.js b/spec/javascripts/diffs/components/diff_file_header_spec.js index 596a1ba5ad2..d4280d3ec2c 100644 --- a/spec/javascripts/diffs/components/diff_file_header_spec.js +++ b/spec/javascripts/diffs/components/diff_file_header_spec.js @@ -521,7 +521,7 @@ describe('diff_file_header', () => { }); describe('with discussions', () => { - it('dispatches toggleFileDiscussions when user clicks on toggle discussions button', () => { + it('dispatches toggleFileDiscussionWrappers when user clicks on toggle discussions button', () => { const propsCopy = Object.assign({}, props); propsCopy.diffFile.submodule = false; propsCopy.diffFile.blob = { @@ -552,11 +552,11 @@ describe('diff_file_header', () => { }), }); - spyOn(vm, 'toggleFileDiscussions'); + spyOn(vm, 'toggleFileDiscussionWrappers'); vm.$el.querySelector('.js-btn-vue-toggle-comments').click(); - expect(vm.toggleFileDiscussions).toHaveBeenCalled(); + expect(vm.toggleFileDiscussionWrappers).toHaveBeenCalled(); }); }); }); diff --git a/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js b/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js deleted file mode 100644 index cdd30919b09..00000000000 --- a/spec/javascripts/diffs/components/diff_gutter_avatars_spec.js +++ /dev/null @@ -1,146 +0,0 @@ -import Vue from 'vue'; -import DiffGutterAvatarsComponent from '~/diffs/components/diff_gutter_avatars.vue'; -import { COUNT_OF_AVATARS_IN_GUTTER } from '~/diffs/constants'; -import store from '~/mr_notes/stores'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import discussionsMockData from '../mock_data/diff_discussions'; - -describe('DiffGutterAvatars', () => { - let component; - const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)]; - - beforeEach(() => { - component = createComponentWithStore(Vue.extend(DiffGutterAvatarsComponent), store, { - discussions: getDiscussionsMockData(), - }).$mount(); - }); - - describe('computed', () => { - describe('discussionsExpanded', () => { - it('should return true when all discussions are expanded', () => { - expect(component.discussionsExpanded).toEqual(true); - }); - - it('should return false when all discussions are not expanded', () => { - component.discussions[0].expanded = false; - - expect(component.discussionsExpanded).toEqual(false); - }); - }); - - describe('allDiscussions', () => { - it('should return an array of notes', () => { - expect(component.allDiscussions).toEqual([...component.discussions[0].notes]); - }); - }); - - describe('notesInGutter', () => { - it('should return a subset of discussions to show in gutter', () => { - expect(component.notesInGutter.length).toEqual(COUNT_OF_AVATARS_IN_GUTTER); - expect(component.notesInGutter[0]).toEqual({ - note: component.discussions[0].notes[0].note, - author: component.discussions[0].notes[0].author, - }); - }); - }); - - describe('moreCount', () => { - it('should return count of remaining discussions from gutter', () => { - expect(component.moreCount).toEqual(2); - }); - }); - - describe('moreText', () => { - it('should return proper text if moreCount > 0', () => { - expect(component.moreText).toEqual('2 more comments'); - }); - - it('should return empty string if there is no discussion', () => { - component.discussions = []; - - expect(component.moreText).toEqual(''); - }); - }); - }); - - describe('methods', () => { - describe('getTooltipText', () => { - it('should return original comment if it is shorter than max length', () => { - const note = component.discussions[0].notes[0]; - - expect(component.getTooltipText(note)).toEqual('Administrator: comment 1'); - }); - - it('should return truncated version of comment', () => { - const note = component.discussions[0].notes[1]; - - expect(component.getTooltipText(note)).toEqual('Fatih Acet: comment 2 is r...'); - }); - }); - - describe('toggleDiscussions', () => { - it('should toggle all discussions', () => { - expect(component.discussions[0].expanded).toEqual(true); - - component.$store.dispatch('setInitialNotes', getDiscussionsMockData()); - component.discussions = component.$store.state.notes.discussions; - component.toggleDiscussions(); - - expect(component.discussions[0].expanded).toEqual(false); - component.$store.dispatch('setInitialNotes', []); - }); - - it('forces expansion of all discussions', () => { - spyOn(component.$store, 'dispatch'); - - component.discussions[0].expanded = true; - component.discussions.push({ - ...component.discussions[0], - id: '123test', - expanded: false, - }); - - component.toggleDiscussions(); - - expect(component.$store.dispatch.calls.argsFor(0)).toEqual([ - 'toggleDiscussion', - { - discussionId: component.discussions[0].id, - forceExpanded: true, - }, - ]); - - expect(component.$store.dispatch.calls.argsFor(1)).toEqual([ - 'toggleDiscussion', - { - discussionId: component.discussions[1].id, - forceExpanded: true, - }, - ]); - }); - }); - }); - - describe('template', () => { - const buttonSelector = '.js-diff-comment-button'; - const svgSelector = `${buttonSelector} svg`; - const avatarSelector = '.js-diff-comment-avatar'; - const plusCountSelector = '.js-diff-comment-plus'; - - it('should have button to collapse discussions when the discussions expanded', () => { - expect(component.$el.querySelector(buttonSelector)).toBeDefined(); - expect(component.$el.querySelector(svgSelector)).toBeDefined(); - }); - - it('should have user avatars when discussions collapsed', () => { - component.discussions[0].expanded = false; - - Vue.nextTick(() => { - expect(component.$el.querySelector(buttonSelector)).toBeNull(); - expect(component.$el.querySelectorAll(avatarSelector).length).toEqual(4); - expect(component.$el.querySelector(plusCountSelector)).toBeDefined(); - expect(component.$el.querySelector(plusCountSelector).textContent).toEqual('+2'); - }); - }); - }); -}); diff --git a/spec/javascripts/diffs/components/inline_diff_view_spec.js b/spec/javascripts/diffs/components/inline_diff_view_spec.js index 4452106580a..0b3890b68d6 100644 --- a/spec/javascripts/diffs/components/inline_diff_view_spec.js +++ b/spec/javascripts/diffs/components/inline_diff_view_spec.js @@ -36,10 +36,11 @@ describe('InlineDiffView', () => { it('should render discussions', done => { const el = component.$el; component.diffLines[1].discussions = getDiscussionsMockData(); + component.diffLines[1].discussionsExpanded = true; Vue.nextTick(() => { expect(el.querySelectorAll('.notes_holder').length).toEqual(1); - expect(el.querySelectorAll('.notes_holder .note-discussion li').length).toEqual(5); + expect(el.querySelectorAll('.notes_holder .note-discussion li').length).toEqual(6); expect(el.innerText.indexOf('comment 5')).toBeGreaterThan(-1); component.$store.dispatch('setInitialNotes', []); diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js index f973728cfe1..f8872a3eb13 100644 --- a/spec/javascripts/diffs/store/actions_spec.js +++ b/spec/javascripts/diffs/store/actions_spec.js @@ -206,6 +206,7 @@ describe('DiffsStoreActions', () => { position_type: 'text', }, }, + hash: 'diff-content-1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a', }, }, ], diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js index c98366dd54f..74805ca8c00 100644 --- a/spec/javascripts/notes/components/noteable_discussion_spec.js +++ b/spec/javascripts/notes/components/noteable_discussion_spec.js @@ -36,6 +36,12 @@ describe('noteable_discussion component', () => { }); it('should render user avatar', () => { + const discussion = { ...discussionMock }; + discussion.diff_file = mockDiffFile; + discussion.diff_discussion = true; + + wrapper.setProps({ discussion, renderDiffFile: true }); + expect(wrapper.find('.user-avatar-link').exists()).toBe(true); }); diff --git a/spec/javascripts/notes/stores/actions_spec.js b/spec/javascripts/notes/stores/actions_spec.js index 7a9f32ddcff..65f72a135aa 100644 --- a/spec/javascripts/notes/stores/actions_spec.js +++ b/spec/javascripts/notes/stores/actions_spec.js @@ -373,7 +373,7 @@ describe('Actions Notes Store', () => { type: 'updateMergeRequestWidget', }, { - type: 'updateResolvableDiscussonsCounts', + type: 'updateResolvableDiscussionsCounts', }, ], done, @@ -400,7 +400,7 @@ describe('Actions Notes Store', () => { type: 'updateMergeRequestWidget', }, { - type: 'updateResolvableDiscussonsCounts', + type: 'updateResolvableDiscussionsCounts', }, { type: 'diffs/removeDiscussionsFromDiff', @@ -452,7 +452,7 @@ describe('Actions Notes Store', () => { type: 'startTaskList', }, { - type: 'updateResolvableDiscussonsCounts', + type: 'updateResolvableDiscussionsCounts', }, ], done, @@ -527,7 +527,7 @@ describe('Actions Notes Store', () => { ], [ { - type: 'updateResolvableDiscussonsCounts', + type: 'updateResolvableDiscussionsCounts', }, { type: 'updateMergeRequestWidget', @@ -552,7 +552,7 @@ describe('Actions Notes Store', () => { ], [ { - type: 'updateResolvableDiscussonsCounts', + type: 'updateResolvableDiscussionsCounts', }, { type: 'updateMergeRequestWidget', @@ -587,10 +587,10 @@ describe('Actions Notes Store', () => { }); }); - describe('updateResolvableDiscussonsCounts', () => { + describe('updateResolvableDiscussionsCounts', () => { it('commits UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS', done => { testAction( - actions.updateResolvableDiscussonsCounts, + actions.updateResolvableDiscussionsCounts, null, {}, [{ type: 'UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS' }], @@ -712,7 +712,7 @@ describe('Actions Notes Store', () => { [ { type: 'updateMergeRequestWidget' }, { type: 'startTaskList' }, - { type: 'updateResolvableDiscussonsCounts' }, + { type: 'updateResolvableDiscussionsCounts' }, ], done, ); diff --git a/spec/javascripts/performance_bar/components/simple_metric_spec.js b/spec/javascripts/performance_bar/components/simple_metric_spec.js deleted file mode 100644 index 98b843e9711..00000000000 --- a/spec/javascripts/performance_bar/components/simple_metric_spec.js +++ /dev/null @@ -1,47 +0,0 @@ -import Vue from 'vue'; -import simpleMetric from '~/performance_bar/components/simple_metric.vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; - -describe('simpleMetric', () => { - let vm; - - afterEach(() => { - vm.$destroy(); - }); - - describe('when the current request has no details', () => { - beforeEach(() => { - vm = mountComponent(Vue.extend(simpleMetric), { - currentRequest: {}, - metric: 'gitaly', - }); - }); - - it('does not display details', () => { - expect(vm.$el.innerText).not.toContain('/'); - }); - - it('displays the metric name', () => { - expect(vm.$el.innerText).toContain('gitaly'); - }); - }); - - describe('when the current request has details', () => { - beforeEach(() => { - vm = mountComponent(Vue.extend(simpleMetric), { - currentRequest: { - details: { gitaly: { duration: '123ms', calls: '456' } }, - }, - metric: 'gitaly', - }); - }); - - it('diplays details', () => { - expect(vm.$el.innerText.replace(/\s+/g, ' ')).toContain('123ms / 456'); - }); - - it('displays the metric name', () => { - expect(vm.$el.innerText).toContain('gitaly'); - }); - }); -}); diff --git a/spec/javascripts/registry/components/app_spec.js b/spec/javascripts/registry/components/app_spec.js index 76a17e6fb31..87237d2853d 100644 --- a/spec/javascripts/registry/components/app_spec.js +++ b/spec/javascripts/registry/components/app_spec.js @@ -8,6 +8,13 @@ import { reposServerResponse } from '../mock_data'; describe('Registry List', () => { const Component = Vue.extend(registry); + const props = { + endpoint: `${TEST_HOST}/foo`, + helpPagePath: 'foo', + noContainersImage: 'foo', + containersErrorImage: 'foo', + repositoryUrl: 'foo', + }; let vm; let mock; @@ -24,7 +31,7 @@ describe('Registry List', () => { beforeEach(() => { mock.onGet(`${TEST_HOST}/foo`).replyOnce(200, reposServerResponse); - vm = mountComponent(Component, { endpoint: `${TEST_HOST}/foo` }); + vm = mountComponent(Component, { ...props }); }); it('should render a list of repos', done => { @@ -72,7 +79,7 @@ describe('Registry List', () => { beforeEach(() => { mock.onGet(`${TEST_HOST}/foo`).replyOnce(200, []); - vm = mountComponent(Component, { endpoint: `${TEST_HOST}/foo` }); + vm = mountComponent(Component, { ...props }); }); it('should render empty message', done => { @@ -83,7 +90,7 @@ describe('Registry List', () => { .textContent.trim() .replace(/[\r\n]+/g, ' '), ).toEqual( - 'No container images stored for this project. Add one by following the instructions above.', + 'With the Container Registry, every project can have its own space to store its Docker images. Learn more about the Container Registry.', ); done(); }, 0); @@ -94,7 +101,7 @@ describe('Registry List', () => { beforeEach(() => { mock.onGet(`${TEST_HOST}/foo`).replyOnce(200, []); - vm = mountComponent(Component, { endpoint: `${TEST_HOST}/foo` }); + vm = mountComponent(Component, { ...props }); }); it('should render a loading spinner', done => { @@ -104,4 +111,22 @@ describe('Registry List', () => { }); }); }); + + describe('invalid characters in path', () => { + beforeEach(() => { + mock.onGet(`${TEST_HOST}/foo`).replyOnce(200, []); + + vm = mountComponent(Component, { + ...props, + characterError: true, + }); + }); + + it('should render invalid characters error message', done => { + setTimeout(() => { + expect(vm.$el.querySelector('.container-message')).not.toBe(null); + done(); + }); + }); + }); }); diff --git a/spec/javascripts/releases/components/release_block_spec.js b/spec/javascripts/releases/components/release_block_spec.js index e98c665f99d..f761a18e326 100644 --- a/spec/javascripts/releases/components/release_block_spec.js +++ b/spec/javascripts/releases/components/release_block_spec.js @@ -14,7 +14,7 @@ describe('Release block', () => { description_html: '<div><h2>changelog</h2><ul><li>line1</li<li>line 2</li></ul></div>', author_name: 'Release bot', author_email: 'release-bot@example.com', - created_at: '2012-05-28T05:00:00-07:00', + released_at: '2012-05-28T05:00:00-07:00', author: { avatar_url: 'uploads/-/system/user/avatar/johndoe/avatar.png', id: 482476, @@ -101,7 +101,7 @@ describe('Release block', () => { }); it('renders release date', () => { - expect(vm.$el.textContent).toContain(timeagoMixin.methods.timeFormated(release.created_at)); + expect(vm.$el.textContent).toContain(timeagoMixin.methods.timeFormated(release.released_at)); }); it('renders number of assets provided', () => { @@ -152,13 +152,13 @@ describe('Release block', () => { }); }); - describe('with pre_release flag', () => { + describe('with upcoming_release flag', () => { beforeEach(() => { - vm = factory(Object.assign({}, release, { pre_release: true })); + vm = factory(Object.assign({}, release, { upcoming_release: true })); }); - it('renders pre-release badge', () => { - expect(vm.$el.textContent).toContain('Pre-release'); + it('renders upcoming release badge', () => { + expect(vm.$el.textContent).toContain('Upcoming Release'); }); }); }); diff --git a/spec/lib/feature_spec.rb b/spec/lib/feature_spec.rb index 6f05914f915..403e0785d1b 100644 --- a/spec/lib/feature_spec.rb +++ b/spec/lib/feature_spec.rb @@ -40,7 +40,7 @@ describe Feature do .once .and_call_original - expect(Rails.cache) + expect(Gitlab::ThreadMemoryCache.cache_backend) .to receive(:fetch) .once .with('flipper:persisted_names', expires_in: 1.minute) diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb index 3b5ca7c950c..d9c73cff01e 100644 --- a/spec/lib/gitlab/auth_spec.rb +++ b/spec/lib/gitlab/auth_spec.rb @@ -309,6 +309,15 @@ describe Gitlab::Auth do .to eq(auth_success) end + it 'succeeds when custom login and token are valid' do + deploy_token = create(:deploy_token, username: 'deployer', read_registry: false, projects: [project]) + auth_success = Gitlab::Auth::Result.new(deploy_token, project, :deploy_token, [:download_code]) + + expect(gl_auth).to receive(:rate_limit!).with('ip', success: true, login: 'deployer') + expect(gl_auth.find_for_git_client('deployer', deploy_token.token, project: project, ip: 'ip')) + .to eq(auth_success) + end + it 'fails when login is not valid' do expect(gl_auth).to receive(:rate_limit!).with('ip', success: false, login: 'random_login') expect(gl_auth.find_for_git_client('random_login', deploy_token.token, project: project, ip: 'ip')) diff --git a/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb b/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb deleted file mode 100644 index 5076996474f..00000000000 --- a/spec/lib/gitlab/background_migration/create_fork_network_memberships_range_spec.rb +++ /dev/null @@ -1,125 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BackgroundMigration::CreateForkNetworkMembershipsRange, :migration, schema: 20170929131201 do - let(:migration) { described_class.new } - let(:projects) { table(:projects) } - - let(:base1) { projects.create } - let(:base1_fork1) { projects.create } - let(:base1_fork2) { projects.create } - - let(:base2) { projects.create } - let(:base2_fork1) { projects.create } - let(:base2_fork2) { projects.create } - - let(:fork_of_fork) { projects.create } - let(:fork_of_fork2) { projects.create } - let(:second_level_fork) { projects.create } - let(:third_level_fork) { projects.create } - - let(:fork_network1) { fork_networks.find_by(root_project_id: base1.id) } - let(:fork_network2) { fork_networks.find_by(root_project_id: base2.id) } - - let!(:forked_project_links) { table(:forked_project_links) } - let!(:fork_networks) { table(:fork_networks) } - let!(:fork_network_members) { table(:fork_network_members) } - - before do - # The fork-network relation created for the forked project - fork_networks.create(id: 1, root_project_id: base1.id) - fork_network_members.create(project_id: base1.id, fork_network_id: 1) - fork_networks.create(id: 2, root_project_id: base2.id) - fork_network_members.create(project_id: base2.id, fork_network_id: 2) - - # Normal fork links - forked_project_links.create(id: 1, forked_from_project_id: base1.id, forked_to_project_id: base1_fork1.id) - forked_project_links.create(id: 2, forked_from_project_id: base1.id, forked_to_project_id: base1_fork2.id) - forked_project_links.create(id: 3, forked_from_project_id: base2.id, forked_to_project_id: base2_fork1.id) - forked_project_links.create(id: 4, forked_from_project_id: base2.id, forked_to_project_id: base2_fork2.id) - - # Fork links - forked_project_links.create(id: 5, forked_from_project_id: base1_fork1.id, forked_to_project_id: fork_of_fork.id) - forked_project_links.create(id: 6, forked_from_project_id: base1_fork1.id, forked_to_project_id: fork_of_fork2.id) - - # Forks 3 levels down - forked_project_links.create(id: 7, forked_from_project_id: fork_of_fork.id, forked_to_project_id: second_level_fork.id) - forked_project_links.create(id: 8, forked_from_project_id: second_level_fork.id, forked_to_project_id: third_level_fork.id) - - migration.perform(1, 8) - end - - it 'creates a memberships for the direct forks' do - base1_fork1_membership = fork_network_members.find_by(fork_network_id: fork_network1.id, - project_id: base1_fork1.id) - base1_fork2_membership = fork_network_members.find_by(fork_network_id: fork_network1.id, - project_id: base1_fork2.id) - base2_fork1_membership = fork_network_members.find_by(fork_network_id: fork_network2.id, - project_id: base2_fork1.id) - base2_fork2_membership = fork_network_members.find_by(fork_network_id: fork_network2.id, - project_id: base2_fork2.id) - - expect(base1_fork1_membership.forked_from_project_id).to eq(base1.id) - expect(base1_fork2_membership.forked_from_project_id).to eq(base1.id) - expect(base2_fork1_membership.forked_from_project_id).to eq(base2.id) - expect(base2_fork2_membership.forked_from_project_id).to eq(base2.id) - end - - it 'adds the fork network members for forks of forks' do - fork_of_fork_membership = fork_network_members.find_by(project_id: fork_of_fork.id, - fork_network_id: fork_network1.id) - fork_of_fork2_membership = fork_network_members.find_by(project_id: fork_of_fork2.id, - fork_network_id: fork_network1.id) - second_level_fork_membership = fork_network_members.find_by(project_id: second_level_fork.id, - fork_network_id: fork_network1.id) - third_level_fork_membership = fork_network_members.find_by(project_id: third_level_fork.id, - fork_network_id: fork_network1.id) - - expect(fork_of_fork_membership.forked_from_project_id).to eq(base1_fork1.id) - expect(fork_of_fork2_membership.forked_from_project_id).to eq(base1_fork1.id) - expect(second_level_fork_membership.forked_from_project_id).to eq(fork_of_fork.id) - expect(third_level_fork_membership.forked_from_project_id).to eq(second_level_fork.id) - end - - it 'reschedules itself when there are missing members' do - allow(migration).to receive(:missing_members?).and_return(true) - - expect(BackgroundMigrationWorker) - .to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, "CreateForkNetworkMembershipsRange", [1, 3]) - - migration.perform(1, 3) - end - - it 'can be repeated without effect' do - expect { fork_network_members.count }.not_to change { migration.perform(1, 7) } - end - - it 'knows it is finished for this range' do - expect(migration.missing_members?(1, 8)).to be_falsy - end - - it 'does not miss members for forks of forks for which the root was deleted' do - forked_project_links.create(id: 9, forked_from_project_id: base1_fork1.id, forked_to_project_id: projects.create.id) - base1.destroy - - expect(migration.missing_members?(7, 10)).to be_falsy - end - - context 'with more forks' do - before do - forked_project_links.create(id: 9, forked_from_project_id: fork_of_fork.id, forked_to_project_id: projects.create.id) - forked_project_links.create(id: 10, forked_from_project_id: fork_of_fork.id, forked_to_project_id: projects.create.id) - end - - it 'only processes a single batch of links at a time' do - expect(fork_network_members.count).to eq(10) - - migration.perform(8, 10) - - expect(fork_network_members.count).to eq(12) - end - - it 'knows when not all memberships within a batch have been created' do - expect(migration.missing_members?(8, 10)).to be_truthy - end - end -end diff --git a/spec/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range_spec.rb b/spec/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range_spec.rb deleted file mode 100644 index 9bae7e53b71..00000000000 --- a/spec/lib/gitlab/background_migration/delete_conflicting_redirect_routes_range_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BackgroundMigration::DeleteConflictingRedirectRoutesRange, :migration, schema: 20170907170235 do - let!(:redirect_routes) { table(:redirect_routes) } - let!(:routes) { table(:routes) } - - before do - routes.create!(id: 1, source_id: 1, source_type: 'Namespace', path: 'foo1') - routes.create!(id: 2, source_id: 2, source_type: 'Namespace', path: 'foo2') - routes.create!(id: 3, source_id: 3, source_type: 'Namespace', path: 'foo3') - routes.create!(id: 4, source_id: 4, source_type: 'Namespace', path: 'foo4') - routes.create!(id: 5, source_id: 5, source_type: 'Namespace', path: 'foo5') - - # Valid redirects - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'bar') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'bar2') - redirect_routes.create!(source_id: 2, source_type: 'Namespace', path: 'bar3') - - # Conflicting redirects - redirect_routes.create!(source_id: 2, source_type: 'Namespace', path: 'foo1') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo2') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo3') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo4') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo5') - end - - # No-op. See https://gitlab.com/gitlab-com/infrastructure/issues/3460#note_53223252 - it 'NO-OP: does not delete any redirect_routes' do - expect(redirect_routes.count).to eq(8) - - described_class.new.perform(1, 5) - - expect(redirect_routes.count).to eq(8) - end -end diff --git a/spec/lib/gitlab/background_migration/migrate_events_to_push_event_payloads_spec.rb b/spec/lib/gitlab/background_migration/migrate_events_to_push_event_payloads_spec.rb deleted file mode 100644 index 188969951a6..00000000000 --- a/spec/lib/gitlab/background_migration/migrate_events_to_push_event_payloads_spec.rb +++ /dev/null @@ -1,433 +0,0 @@ -require 'spec_helper' - -# rubocop:disable RSpec/FactoriesInMigrationSpecs -describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads::Event, :migration, schema: 20170608152748 do - describe '#commit_title' do - it 'returns nil when there are no commits' do - expect(described_class.new.commit_title).to be_nil - end - - it 'returns nil when there are commits without commit messages' do - event = described_class.new - - allow(event).to receive(:commits).and_return([{ id: '123' }]) - - expect(event.commit_title).to be_nil - end - - it 'returns the commit message when it is less than 70 characters long' do - event = described_class.new - - allow(event).to receive(:commits).and_return([{ message: 'Hello world' }]) - - expect(event.commit_title).to eq('Hello world') - end - - it 'returns the first line of a commit message if multiple lines are present' do - event = described_class.new - - allow(event).to receive(:commits).and_return([{ message: "Hello\n\nworld" }]) - - expect(event.commit_title).to eq('Hello') - end - - it 'truncates the commit to 70 characters when it is too long' do - event = described_class.new - - allow(event).to receive(:commits).and_return([{ message: 'a' * 100 }]) - - expect(event.commit_title).to eq(('a' * 67) + '...') - end - end - - describe '#commit_from_sha' do - it 'returns nil when pushing to a new ref' do - event = described_class.new - - allow(event).to receive(:create?).and_return(true) - - expect(event.commit_from_sha).to be_nil - end - - it 'returns the ID of the first commit when pushing to an existing ref' do - event = described_class.new - - allow(event).to receive(:create?).and_return(false) - allow(event).to receive(:data).and_return(before: '123') - - expect(event.commit_from_sha).to eq('123') - end - end - - describe '#commit_to_sha' do - it 'returns nil when removing an existing ref' do - event = described_class.new - - allow(event).to receive(:remove?).and_return(true) - - expect(event.commit_to_sha).to be_nil - end - - it 'returns the ID of the last commit when pushing to an existing ref' do - event = described_class.new - - allow(event).to receive(:remove?).and_return(false) - allow(event).to receive(:data).and_return(after: '123') - - expect(event.commit_to_sha).to eq('123') - end - end - - describe '#data' do - it 'returns the deserialized data' do - event = described_class.new(data: { before: '123' }) - - expect(event.data).to eq(before: '123') - end - - it 'returns an empty hash when no data is present' do - event = described_class.new - - expect(event.data).to eq({}) - end - end - - describe '#commits' do - it 'returns an Array of commits' do - event = described_class.new(data: { commits: [{ id: '123' }] }) - - expect(event.commits).to eq([{ id: '123' }]) - end - - it 'returns an empty array when no data is present' do - event = described_class.new - - expect(event.commits).to eq([]) - end - end - - describe '#commit_count' do - it 'returns the number of commits' do - event = described_class.new(data: { total_commits_count: 2 }) - - expect(event.commit_count).to eq(2) - end - - it 'returns 0 when no data is present' do - event = described_class.new - - expect(event.commit_count).to eq(0) - end - end - - describe '#ref' do - it 'returns the name of the ref' do - event = described_class.new(data: { ref: 'refs/heads/master' }) - - expect(event.ref).to eq('refs/heads/master') - end - end - - describe '#trimmed_ref_name' do - it 'returns the trimmed ref name for a branch' do - event = described_class.new(data: { ref: 'refs/heads/master' }) - - expect(event.trimmed_ref_name).to eq('master') - end - - it 'returns the trimmed ref name for a tag' do - event = described_class.new(data: { ref: 'refs/tags/v1.2' }) - - expect(event.trimmed_ref_name).to eq('v1.2') - end - end - - describe '#create?' do - it 'returns true when creating a new ref' do - event = described_class.new(data: { before: described_class::BLANK_REF }) - - expect(event.create?).to eq(true) - end - - it 'returns false when pushing to an existing ref' do - event = described_class.new(data: { before: '123' }) - - expect(event.create?).to eq(false) - end - end - - describe '#remove?' do - it 'returns true when removing an existing ref' do - event = described_class.new(data: { after: described_class::BLANK_REF }) - - expect(event.remove?).to eq(true) - end - - it 'returns false when pushing to an existing ref' do - event = described_class.new(data: { after: '123' }) - - expect(event.remove?).to eq(false) - end - end - - describe '#push_action' do - let(:event) { described_class.new } - - it 'returns :created when creating a new ref' do - allow(event).to receive(:create?).and_return(true) - - expect(event.push_action).to eq(:created) - end - - it 'returns :removed when removing an existing ref' do - allow(event).to receive(:create?).and_return(false) - allow(event).to receive(:remove?).and_return(true) - - expect(event.push_action).to eq(:removed) - end - - it 'returns :pushed when pushing to an existing ref' do - allow(event).to receive(:create?).and_return(false) - allow(event).to receive(:remove?).and_return(false) - - expect(event.push_action).to eq(:pushed) - end - end - - describe '#ref_type' do - let(:event) { described_class.new } - - it 'returns :tag for a tag' do - allow(event).to receive(:ref).and_return('refs/tags/1.2') - - expect(event.ref_type).to eq(:tag) - end - - it 'returns :branch for a branch' do - allow(event).to receive(:ref).and_return('refs/heads/1.2') - - expect(event.ref_type).to eq(:branch) - end - end -end - -## -# The background migration relies on a temporary table, hence we're migrating -# to a specific version of the database where said table is still present. -# -describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads, :migration, schema: 20170825154015 do - let(:user_class) do - Class.new(ActiveRecord::Base) do - self.table_name = 'users' - end - end - - let(:migration) { described_class.new } - let(:user_class) { table(:users) } - let(:author) { build(:user).becomes(user_class).tap(&:save!).becomes(User) } - let(:namespace) { create(:namespace, owner: author) } - let(:projects) { table(:projects) } - let(:project) { projects.create(namespace_id: namespace.id, creator_id: author.id) } - - # We can not rely on FactoryBot as the state of Event may change in ways that - # the background migration does not expect, hence we use the Event class of - # the migration itself. - def create_push_event(project, author, data = nil) - klass = Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads::Event - - klass.create!( - action: klass::PUSHED, - project_id: project.id, - author_id: author.id, - data: data - ) - end - - describe '#perform' do - it 'returns if data should not be migrated' do - allow(migration).to receive(:migrate?).and_return(false) - - expect(migration).not_to receive(:find_events) - - migration.perform(1, 10) - end - - it 'migrates the range of events if data is to be migrated' do - event1 = create_push_event(project, author, { commits: [] }) - event2 = create_push_event(project, author, { commits: [] }) - - allow(migration).to receive(:migrate?).and_return(true) - - expect(migration).to receive(:process_event).twice - - migration.perform(event1.id, event2.id) - end - end - - describe '#process_event' do - it 'processes a regular event' do - event = double(:event, push_event?: false) - - expect(migration).to receive(:replicate_event) - expect(migration).not_to receive(:create_push_event_payload) - - migration.process_event(event) - end - - it 'processes a push event' do - event = double(:event, push_event?: true) - - expect(migration).to receive(:replicate_event) - expect(migration).to receive(:create_push_event_payload) - - migration.process_event(event) - end - - it 'handles an error gracefully' do - event1 = create_push_event(project, author, { commits: [] }) - - expect(migration).to receive(:replicate_event).and_call_original - expect(migration).to receive(:create_push_event_payload).and_raise(ActiveRecord::InvalidForeignKey, 'invalid foreign key') - - migration.process_event(event1) - - expect(described_class::EventForMigration.all.count).to eq(0) - end - end - - describe '#replicate_event' do - it 'replicates the event to the "events_for_migration" table' do - event = create_push_event( - project, - author, - data: { commits: [] }, - title: 'bla' - ) - - attributes = event - .attributes.with_indifferent_access.except(:title, :data) - - expect(described_class::EventForMigration) - .to receive(:create!) - .with(attributes) - - migration.replicate_event(event) - end - end - - describe '#create_push_event_payload' do - let(:push_data) do - { - commits: [], - ref: 'refs/heads/master', - before: '156e0e9adc587a383a7eeb5b21ddecb9044768a8', - after: '0' * 40, - total_commits_count: 1 - } - end - - let(:event) do - create_push_event(project, author, push_data) - end - - before do - # The foreign key in push_event_payloads at this point points to the - # "events_for_migration" table so we need to make sure a row exists in - # said table. - migration.replicate_event(event) - end - - it 'creates a push event payload for an event' do - payload = migration.create_push_event_payload(event) - - expect(PushEventPayload.count).to eq(1) - expect(payload.valid?).to eq(true) - end - - it 'does not create push event payloads for removed events' do - allow(event).to receive(:id).and_return(-1) - - expect { migration.create_push_event_payload(event) }.to raise_error(ActiveRecord::InvalidForeignKey) - - expect(PushEventPayload.count).to eq(0) - end - - it 'encodes and decodes the commit IDs from and to binary data' do - payload = migration.create_push_event_payload(event) - packed = migration.pack(push_data[:before]) - - expect(payload.commit_from).to eq(packed) - expect(payload.commit_to).to be_nil - end - end - - describe '#find_events' do - it 'returns the events for the given ID range' do - event1 = create_push_event(project, author, { commits: [] }) - event2 = create_push_event(project, author, { commits: [] }) - event3 = create_push_event(project, author, { commits: [] }) - events = migration.find_events(event1.id, event2.id) - - expect(events.length).to eq(2) - expect(events.pluck(:id)).not_to include(event3.id) - end - end - - describe '#migrate?' do - it 'returns true when data should be migrated' do - allow(described_class::Event) - .to receive(:table_exists?).and_return(true) - - allow(described_class::PushEventPayload) - .to receive(:table_exists?).and_return(true) - - allow(described_class::EventForMigration) - .to receive(:table_exists?).and_return(true) - - expect(migration.migrate?).to eq(true) - end - - it 'returns false if the "events" table does not exist' do - allow(described_class::Event) - .to receive(:table_exists?).and_return(false) - - expect(migration.migrate?).to eq(false) - end - - it 'returns false if the "push_event_payloads" table does not exist' do - allow(described_class::Event) - .to receive(:table_exists?).and_return(true) - - allow(described_class::PushEventPayload) - .to receive(:table_exists?).and_return(false) - - expect(migration.migrate?).to eq(false) - end - - it 'returns false when the "events_for_migration" table does not exist' do - allow(described_class::Event) - .to receive(:table_exists?).and_return(true) - - allow(described_class::PushEventPayload) - .to receive(:table_exists?).and_return(true) - - allow(described_class::EventForMigration) - .to receive(:table_exists?).and_return(false) - - expect(migration.migrate?).to eq(false) - end - end - - describe '#pack' do - it 'packs a SHA1 into a 20 byte binary string' do - packed = migration.pack('156e0e9adc587a383a7eeb5b21ddecb9044768a8') - - expect(packed.bytesize).to eq(20) - end - - it 'returns nil if the input value is nil' do - expect(migration.pack(nil)).to be_nil - end - end -end -# rubocop:enable RSpec/FactoriesInMigrationSpecs diff --git a/spec/lib/gitlab/background_migration/migrate_stage_status_spec.rb b/spec/lib/gitlab/background_migration/migrate_stage_status_spec.rb deleted file mode 100644 index 89b56906ed0..00000000000 --- a/spec/lib/gitlab/background_migration/migrate_stage_status_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe Gitlab::BackgroundMigration::MigrateStageStatus, :migration, schema: 20170711145320 do - let(:projects) { table(:projects) } - let(:pipelines) { table(:ci_pipelines) } - let(:stages) { table(:ci_stages) } - let(:jobs) { table(:ci_builds) } - - let(:statuses) do - { - created: 0, - pending: 1, - running: 2, - success: 3, - failed: 4, - canceled: 5, - skipped: 6, - manual: 7 - } - end - - before do - projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1') - pipelines.create!(id: 1, project_id: 1, ref: 'master', sha: 'adf43c3a') - stages.create!(id: 1, pipeline_id: 1, project_id: 1, name: 'test', status: nil) - stages.create!(id: 2, pipeline_id: 1, project_id: 1, name: 'deploy', status: nil) - end - - context 'when stage status is known' do - before do - create_job(project: 1, pipeline: 1, stage: 'test', status: 'success') - create_job(project: 1, pipeline: 1, stage: 'test', status: 'running') - create_job(project: 1, pipeline: 1, stage: 'deploy', status: 'failed') - end - - it 'sets a correct stage status' do - described_class.new.perform(1, 2) - - expect(stages.first.status).to eq statuses[:running] - expect(stages.second.status).to eq statuses[:failed] - end - end - - context 'when stage status is not known' do - it 'sets a skipped stage status' do - described_class.new.perform(1, 2) - - expect(stages.first.status).to eq statuses[:skipped] - expect(stages.second.status).to eq statuses[:skipped] - end - end - - context 'when stage status includes status of a retried job' do - before do - create_job(project: 1, pipeline: 1, stage: 'test', status: 'canceled') - create_job(project: 1, pipeline: 1, stage: 'deploy', status: 'failed', retried: true) - create_job(project: 1, pipeline: 1, stage: 'deploy', status: 'success') - end - - it 'sets a correct stage status' do - described_class.new.perform(1, 2) - - expect(stages.first.status).to eq statuses[:canceled] - expect(stages.second.status).to eq statuses[:success] - end - end - - context 'when some job in the stage is blocked / manual' do - before do - create_job(project: 1, pipeline: 1, stage: 'test', status: 'failed') - create_job(project: 1, pipeline: 1, stage: 'test', status: 'manual') - create_job(project: 1, pipeline: 1, stage: 'deploy', status: 'success', when: 'manual') - end - - it 'sets a correct stage status' do - described_class.new.perform(1, 2) - - expect(stages.first.status).to eq statuses[:manual] - expect(stages.second.status).to eq statuses[:success] - end - end - - def create_job(project:, pipeline:, stage:, status:, **opts) - stages = { test: 1, build: 2, deploy: 3 } - - jobs.create!(project_id: project, commit_id: pipeline, - stage_idx: stages[stage.to_sym], stage: stage, - status: status, **opts) - end -end diff --git a/spec/lib/gitlab/background_migration/normalize_ldap_extern_uids_range_spec.rb b/spec/lib/gitlab/background_migration/normalize_ldap_extern_uids_range_spec.rb deleted file mode 100644 index dfbf1bb681a..00000000000 --- a/spec/lib/gitlab/background_migration/normalize_ldap_extern_uids_range_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BackgroundMigration::NormalizeLdapExternUidsRange, :migration, schema: 20170921101004 do - let!(:identities) { table(:identities) } - - before do - # LDAP identities - (1..4).each do |i| - identities.create!(id: i, provider: 'ldapmain', extern_uid: " uid = foo #{i}, ou = People, dc = example, dc = com ", user_id: i) - end - - # Non-LDAP identity - identities.create!(id: 5, provider: 'foo', extern_uid: " uid = foo 5, ou = People, dc = example, dc = com ", user_id: 5) - - # Another LDAP identity - identities.create!(id: 6, provider: 'ldapmain', extern_uid: " uid = foo 6, ou = People, dc = example, dc = com ", user_id: 6) - end - - it 'normalizes the LDAP identities in the range' do - described_class.new.perform(1, 3) - expect(identities.find(1).extern_uid).to eq("uid=foo 1,ou=people,dc=example,dc=com") - expect(identities.find(2).extern_uid).to eq("uid=foo 2,ou=people,dc=example,dc=com") - expect(identities.find(3).extern_uid).to eq("uid=foo 3,ou=people,dc=example,dc=com") - expect(identities.find(4).extern_uid).to eq(" uid = foo 4, ou = People, dc = example, dc = com ") - expect(identities.find(5).extern_uid).to eq(" uid = foo 5, ou = People, dc = example, dc = com ") - expect(identities.find(6).extern_uid).to eq(" uid = foo 6, ou = People, dc = example, dc = com ") - - described_class.new.perform(4, 6) - expect(identities.find(1).extern_uid).to eq("uid=foo 1,ou=people,dc=example,dc=com") - expect(identities.find(2).extern_uid).to eq("uid=foo 2,ou=people,dc=example,dc=com") - expect(identities.find(3).extern_uid).to eq("uid=foo 3,ou=people,dc=example,dc=com") - expect(identities.find(4).extern_uid).to eq("uid=foo 4,ou=people,dc=example,dc=com") - expect(identities.find(5).extern_uid).to eq(" uid = foo 5, ou = People, dc = example, dc = com ") - expect(identities.find(6).extern_uid).to eq("uid=foo 6,ou=people,dc=example,dc=com") - end -end diff --git a/spec/lib/gitlab/background_migration/populate_fork_networks_range_spec.rb b/spec/lib/gitlab/background_migration/populate_fork_networks_range_spec.rb deleted file mode 100644 index 0e73c8c59c9..00000000000 --- a/spec/lib/gitlab/background_migration/populate_fork_networks_range_spec.rb +++ /dev/null @@ -1,97 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BackgroundMigration::PopulateForkNetworksRange, :migration, schema: 20170929131201 do - let(:migration) { described_class.new } - let(:projects) { table(:projects) } - let(:base1) { projects.create } - - let(:base2) { projects.create } - let(:base2_fork1) { projects.create } - - let!(:forked_project_links) { table(:forked_project_links) } - let!(:fork_networks) { table(:fork_networks) } - let!(:fork_network_members) { table(:fork_network_members) } - - let(:fork_network1) { fork_networks.find_by(root_project_id: base1.id) } - let(:fork_network2) { fork_networks.find_by(root_project_id: base2.id) } - - before do - # A normal fork link - forked_project_links.create(id: 1, - forked_from_project_id: base1.id, - forked_to_project_id: projects.create.id) - forked_project_links.create(id: 2, - forked_from_project_id: base1.id, - forked_to_project_id: projects.create.id) - forked_project_links.create(id: 3, - forked_from_project_id: base2.id, - forked_to_project_id: base2_fork1.id) - - # create a fork of a fork - forked_project_links.create(id: 4, - forked_from_project_id: base2_fork1.id, - forked_to_project_id: projects.create.id) - forked_project_links.create(id: 5, - forked_from_project_id: projects.create.id, - forked_to_project_id: projects.create.id) - - # Stub out the calls to the other migrations - allow(BackgroundMigrationWorker).to receive(:perform_in) - - migration.perform(1, 3) - end - - it 'creates the fork network' do - expect(fork_network1).not_to be_nil - expect(fork_network2).not_to be_nil - end - - it 'does not create a fork network for a fork-of-fork' do - # perfrom the entire batch - migration.perform(1, 5) - - expect(fork_networks.find_by(root_project_id: base2_fork1.id)).to be_nil - end - - it 'creates memberships for the root of fork networks' do - base1_membership = fork_network_members.find_by(fork_network_id: fork_network1.id, - project_id: base1.id) - base2_membership = fork_network_members.find_by(fork_network_id: fork_network2.id, - project_id: base2.id) - - expect(base1_membership).not_to be_nil - expect(base2_membership).not_to be_nil - end - - it 'creates a fork network for the fork of which the source was deleted' do - fork = projects.create - forked_project_links.create(id: 6, forked_from_project_id: 99999, forked_to_project_id: fork.id) - - migration.perform(5, 8) - - expect(fork_networks.find_by(root_project_id: 99999)).to be_nil - expect(fork_networks.find_by(root_project_id: fork.id)).not_to be_nil - expect(fork_network_members.find_by(project_id: fork.id)).not_to be_nil - end - - it 'schedules a job for inserting memberships for forks-of-forks' do - delay = Gitlab::BackgroundMigration::CreateForkNetworkMembershipsRange::RESCHEDULE_DELAY - - expect(BackgroundMigrationWorker) - .to receive(:perform_in).with(delay, "CreateForkNetworkMembershipsRange", [1, 3]) - - migration.perform(1, 3) - end - - it 'only processes a single batch of links at a time' do - expect(fork_networks.count).to eq(2) - - migration.perform(3, 5) - - expect(fork_networks.count).to eq(3) - end - - it 'can be repeated without effect' do - expect { migration.perform(1, 3) }.not_to change { fork_network_members.count } - end -end diff --git a/spec/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id_spec.rb b/spec/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id_spec.rb deleted file mode 100644 index 0cb753c5853..00000000000 --- a/spec/lib/gitlab/background_migration/populate_merge_requests_latest_merge_request_diff_id_spec.rb +++ /dev/null @@ -1,62 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BackgroundMigration::PopulateMergeRequestsLatestMergeRequestDiffId, :migration, schema: 20171026082505 do - let(:projects_table) { table(:projects) } - let(:merge_requests_table) { table(:merge_requests) } - let(:merge_request_diffs_table) { table(:merge_request_diffs) } - - let(:project) { projects_table.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce') } - - def create_mr!(name, diffs: 0) - merge_request = - merge_requests_table.create!(target_project_id: project.id, - target_branch: 'master', - source_project_id: project.id, - source_branch: name, - title: name) - - diffs.times do - merge_request_diffs_table.create!(merge_request_id: merge_request.id) - end - - merge_request - end - - def diffs_for(merge_request) - merge_request_diffs_table.where(merge_request_id: merge_request.id) - end - - describe '#perform' do - it 'ignores MRs without diffs' do - merge_request_without_diff = create_mr!('without_diff') - mr_id = merge_request_without_diff.id - - expect(merge_request_without_diff.latest_merge_request_diff_id).to be_nil - - expect { subject.perform(mr_id, mr_id) } - .not_to change { merge_request_without_diff.reload.latest_merge_request_diff_id } - end - - it 'ignores MRs that have a diff ID already set' do - merge_request_with_multiple_diffs = create_mr!('with_multiple_diffs', diffs: 3) - diff_id = diffs_for(merge_request_with_multiple_diffs).minimum(:id) - mr_id = merge_request_with_multiple_diffs.id - - merge_request_with_multiple_diffs.update!(latest_merge_request_diff_id: diff_id) - - expect { subject.perform(mr_id, mr_id) } - .not_to change { merge_request_with_multiple_diffs.reload.latest_merge_request_diff_id } - end - - it 'migrates multiple MR diffs to the correct values' do - merge_requests = Array.new(3).map.with_index { |_, i| create_mr!(i, diffs: 3) } - - subject.perform(merge_requests.first.id, merge_requests.last.id) - - merge_requests.each do |merge_request| - expect(merge_request.reload.latest_merge_request_diff_id) - .to eq(diffs_for(merge_request).maximum(:id)) - end - end - end -end diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index a406c25b1d8..28b187c3676 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -123,6 +123,7 @@ Release: - project_id - created_at - updated_at +- released_at Releases::Link: - id - release_id @@ -429,6 +430,7 @@ Service: - confidential_issues_events - confidential_note_events - deployment_events +- description ProjectHook: - id - url diff --git a/spec/lib/gitlab/legacy_github_import/importer_spec.rb b/spec/lib/gitlab/legacy_github_import/importer_spec.rb index a0c664da185..9163019514b 100644 --- a/spec/lib/gitlab/legacy_github_import/importer_spec.rb +++ b/spec/lib/gitlab/legacy_github_import/importer_spec.rb @@ -132,6 +132,7 @@ describe Gitlab::LegacyGithubImport::Importer do body: 'Release v1.0.0', draft: false, created_at: created_at, + published_at: created_at, updated_at: updated_at, url: "#{api_root}/repos/octocat/Hello-World/releases/1" ) @@ -144,6 +145,7 @@ describe Gitlab::LegacyGithubImport::Importer do body: nil, draft: false, created_at: created_at, + published_at: created_at, updated_at: updated_at, url: "#{api_root}/repos/octocat/Hello-World/releases/2" ) diff --git a/spec/lib/gitlab/legacy_github_import/release_formatter_spec.rb b/spec/lib/gitlab/legacy_github_import/release_formatter_spec.rb index c57b96fb00d..534cf219520 100644 --- a/spec/lib/gitlab/legacy_github_import/release_formatter_spec.rb +++ b/spec/lib/gitlab/legacy_github_import/release_formatter_spec.rb @@ -4,6 +4,7 @@ describe Gitlab::LegacyGithubImport::ReleaseFormatter do let!(:project) { create(:project, namespace: create(:namespace, path: 'octocat')) } let(:octocat) { double(id: 123456, login: 'octocat') } let(:created_at) { DateTime.strptime('2011-01-26T19:01:12Z') } + let(:published_at) { DateTime.strptime('2011-01-26T20:00:00Z') } let(:base_data) do { @@ -11,7 +12,7 @@ describe Gitlab::LegacyGithubImport::ReleaseFormatter do name: 'First release', draft: false, created_at: created_at, - published_at: created_at, + published_at: published_at, body: 'Release v1.0.0' } end @@ -28,6 +29,7 @@ describe Gitlab::LegacyGithubImport::ReleaseFormatter do name: 'First release', description: 'Release v1.0.0', created_at: created_at, + released_at: published_at, updated_at: created_at } diff --git a/spec/migrations/add_foreign_key_to_merge_requests_spec.rb b/spec/migrations/add_foreign_key_to_merge_requests_spec.rb deleted file mode 100644 index d9ad9a585f0..00000000000 --- a/spec/migrations/add_foreign_key_to_merge_requests_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170713104829_add_foreign_key_to_merge_requests.rb') - -describe AddForeignKeyToMergeRequests, :migration do - let(:projects) { table(:projects) } - let(:merge_requests) { table(:merge_requests) } - let(:pipelines) { table(:ci_pipelines) } - - before do - projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce') - pipelines.create!(project_id: projects.first.id, - ref: 'some-branch', - sha: 'abc12345') - - # merge request without a pipeline - create_merge_request(head_pipeline_id: nil) - - # merge request with non-existent pipeline - create_merge_request(head_pipeline_id: 1234) - - # merge reqeust with existing pipeline assigned - create_merge_request(head_pipeline_id: pipelines.first.id) - end - - it 'correctly adds a foreign key to head_pipeline_id' do - migrate! - - expect(merge_requests.first.head_pipeline_id).to be_nil - expect(merge_requests.second.head_pipeline_id).to be_nil - expect(merge_requests.third.head_pipeline_id).to eq pipelines.first.id - end - - def create_merge_request(**opts) - merge_requests.create!(source_project_id: projects.first.id, - target_project_id: projects.first.id, - source_branch: 'some-branch', - target_branch: 'master', **opts) - end -end diff --git a/spec/migrations/add_head_pipeline_for_each_merge_request_spec.rb b/spec/migrations/add_head_pipeline_for_each_merge_request_spec.rb deleted file mode 100644 index 13dc62595b5..00000000000 --- a/spec/migrations/add_head_pipeline_for_each_merge_request_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170508170547_add_head_pipeline_for_each_merge_request.rb') - -describe AddHeadPipelineForEachMergeRequest, :migration do - let(:migration) { described_class.new } - - let!(:project) { table(:projects).create! } - let!(:other_project) { table(:projects).create! } - - let!(:pipeline_1) { table(:ci_pipelines).create!(project_id: project.id, ref: "branch_1") } - let!(:pipeline_2) { table(:ci_pipelines).create!(project_id: other_project.id, ref: "branch_1") } - let!(:pipeline_3) { table(:ci_pipelines).create!(project_id: other_project.id, ref: "branch_1") } - let!(:pipeline_4) { table(:ci_pipelines).create!(project_id: project.id, ref: "branch_2") } - - let!(:mr_1) { table(:merge_requests).create!(source_project_id: project.id, target_project_id: project.id, source_branch: "branch_1", target_branch: "target_1") } - let!(:mr_2) { table(:merge_requests).create!(source_project_id: other_project.id, target_project_id: project.id, source_branch: "branch_1", target_branch: "target_2") } - let!(:mr_3) { table(:merge_requests).create!(source_project_id: project.id, target_project_id: project.id, source_branch: "branch_2", target_branch: "master") } - let!(:mr_4) { table(:merge_requests).create!(source_project_id: project.id, target_project_id: project.id, source_branch: "branch_3", target_branch: "master") } - - context "#up" do - context "when source_project and source_branch of pipeline are the same of merge request" do - it "sets head_pipeline_id of given merge requests" do - migration.up - - expect(mr_1.reload.head_pipeline_id).to eq(pipeline_1.id) - expect(mr_2.reload.head_pipeline_id).to eq(pipeline_3.id) - expect(mr_3.reload.head_pipeline_id).to eq(pipeline_4.id) - expect(mr_4.reload.head_pipeline_id).to be_nil - end - end - end -end diff --git a/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb b/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb new file mode 100644 index 00000000000..9cae1daacea --- /dev/null +++ b/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' +require Rails.root.join('db', 'migrate', '20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb') + +describe BackfillAndAddNotNullConstraintToReleasedAtColumnOnReleasesTable, :migration do + let(:releases) { table(:releases) } + let(:namespaces) { table(:namespaces) } + let(:projects) { table(:projects) } + + subject(:migration) { described_class.new } + + it 'fills released_at with the value of created_at' do + created_at_a = Time.zone.parse('2019-02-10T08:00:00Z') + created_at_b = Time.zone.parse('2019-03-10T18:00:00Z') + namespace = namespaces.create(name: 'foo', path: 'foo') + project = projects.create!(namespace_id: namespace.id) + release_a = releases.create!(project_id: project.id, created_at: created_at_a) + release_b = releases.create!(project_id: project.id, created_at: created_at_b) + + disable_migrations_output { migration.up } + + release_a.reload + release_b.reload + expect(release_a.released_at).to eq(created_at_a) + expect(release_b.released_at).to eq(created_at_b) + end +end diff --git a/spec/migrations/calculate_conv_dev_index_percentages_spec.rb b/spec/migrations/calculate_conv_dev_index_percentages_spec.rb deleted file mode 100644 index 09c78d02890..00000000000 --- a/spec/migrations/calculate_conv_dev_index_percentages_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170803090603_calculate_conv_dev_index_percentages.rb') - -describe CalculateConvDevIndexPercentages, :migration do - let(:migration) { described_class.new } - let!(:conv_dev_index) do - table(:conversational_development_index_metrics).create!( - leader_issues: 9.256, - leader_notes: 0, - leader_milestones: 16.2456, - leader_boards: 5.2123, - leader_merge_requests: 1.2, - leader_ci_pipelines: 12.1234, - leader_environments: 3.3333, - leader_deployments: 1.200, - leader_projects_prometheus_active: 0.111, - leader_service_desk_issues: 15.891, - instance_issues: 1.234, - instance_notes: 28.123, - instance_milestones: 0, - instance_boards: 3.254, - instance_merge_requests: 0.6, - instance_ci_pipelines: 2.344, - instance_environments: 2.2222, - instance_deployments: 0.771, - instance_projects_prometheus_active: 0.109, - instance_service_desk_issues: 13.345, - percentage_issues: 0, - percentage_notes: 0, - percentage_milestones: 0, - percentage_boards: 0, - percentage_merge_requests: 0, - percentage_ci_pipelines: 0, - percentage_environments: 0, - percentage_deployments: 0, - percentage_projects_prometheus_active: 0, - percentage_service_desk_issues: 0) - end - - describe '#up' do - it 'calculates percentages correctly' do - migration.up - conv_dev_index.reload - - expect(conv_dev_index.percentage_issues).to be_within(0.1).of(13.3) - expect(conv_dev_index.percentage_notes).to be_zero # leader 0 - expect(conv_dev_index.percentage_milestones).to be_zero # instance 0 - expect(conv_dev_index.percentage_boards).to be_within(0.1).of(62.4) - expect(conv_dev_index.percentage_merge_requests).to eq(50.0) - expect(conv_dev_index.percentage_ci_pipelines).to be_within(0.1).of(19.3) - expect(conv_dev_index.percentage_environments).to be_within(0.1).of(66.7) - expect(conv_dev_index.percentage_deployments).to be_within(0.1).of(64.2) - expect(conv_dev_index.percentage_projects_prometheus_active).to be_within(0.1).of(98.2) - expect(conv_dev_index.percentage_service_desk_issues).to be_within(0.1).of(84.0) - end - end -end diff --git a/spec/migrations/clean_appearance_symlinks_spec.rb b/spec/migrations/clean_appearance_symlinks_spec.rb deleted file mode 100644 index 9225dc0d894..00000000000 --- a/spec/migrations/clean_appearance_symlinks_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170613111224_clean_appearance_symlinks.rb') - -describe CleanAppearanceSymlinks do - let(:migration) { described_class.new } - let(:test_dir) { File.join(Rails.root, "tmp", "tests", "clean_appearance_test") } - let(:uploads_dir) { File.join(test_dir, "public", "uploads") } - let(:new_uploads_dir) { File.join(uploads_dir, "system") } - let(:original_path) { File.join(new_uploads_dir, 'appearance') } - let(:symlink_path) { File.join(uploads_dir, 'appearance') } - - before do - FileUtils.remove_dir(test_dir) if File.directory?(test_dir) - FileUtils.mkdir_p(uploads_dir) - allow(migration).to receive(:base_directory).and_return(test_dir) - allow(migration).to receive(:say) - end - - describe "#up" do - before do - FileUtils.mkdir_p(original_path) - FileUtils.ln_s(original_path, symlink_path) - end - - it 'removes the symlink' do - migration.up - - expect(File.symlink?(symlink_path)).to be(false) - end - end - - describe '#down' do - before do - FileUtils.mkdir_p(File.join(original_path)) - FileUtils.touch(File.join(original_path, 'dummy.file')) - end - - it 'creates a symlink' do - expected_path = File.join(symlink_path, "dummy.file") - migration.down - - expect(File.exist?(expected_path)).to be(true) - expect(File.symlink?(symlink_path)).to be(true) - end - end -end diff --git a/spec/migrations/clean_stage_id_reference_migration_spec.rb b/spec/migrations/clean_stage_id_reference_migration_spec.rb deleted file mode 100644 index 9a581df28a2..00000000000 --- a/spec/migrations/clean_stage_id_reference_migration_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170710083355_clean_stage_id_reference_migration.rb') - -describe CleanStageIdReferenceMigration, :migration, :sidekiq, :redis do - let(:migration_class) { 'MigrateBuildStageIdReference' } - let(:migration) { spy('migration') } - - before do - allow(Gitlab::BackgroundMigration.const_get(migration_class)) - .to receive(:new).and_return(migration) - end - - context 'when there are pending background migrations' do - it 'processes pending jobs synchronously' do - Sidekiq::Testing.disable! do - BackgroundMigrationWorker.perform_in(2.minutes, migration_class, [1, 1]) - BackgroundMigrationWorker.perform_async(migration_class, [1, 1]) - - migrate! - - expect(migration).to have_received(:perform).with(1, 1).twice - end - end - end - context 'when there are no background migrations pending' do - it 'does nothing' do - Sidekiq::Testing.disable! do - migrate! - - expect(migration).not_to have_received(:perform) - end - end - end -end diff --git a/spec/migrations/clean_stages_statuses_migration_spec.rb b/spec/migrations/clean_stages_statuses_migration_spec.rb deleted file mode 100644 index 38705f8eaae..00000000000 --- a/spec/migrations/clean_stages_statuses_migration_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170912113435_clean_stages_statuses_migration.rb') - -describe CleanStagesStatusesMigration, :migration, :sidekiq, :redis do - let(:migration) { spy('migration') } - - before do - allow(Gitlab::BackgroundMigration::MigrateStageStatus) - .to receive(:new).and_return(migration) - end - - context 'when there are pending background migrations' do - it 'processes pending jobs synchronously' do - Sidekiq::Testing.disable! do - BackgroundMigrationWorker - .perform_in(2.minutes, 'MigrateStageStatus', [1, 1]) - BackgroundMigrationWorker - .perform_async('MigrateStageStatus', [1, 1]) - - migrate! - - expect(migration).to have_received(:perform).with(1, 1).twice - end - end - end - - context 'when there are no background migrations pending' do - it 'does nothing' do - Sidekiq::Testing.disable! do - migrate! - - expect(migration).not_to have_received(:perform) - end - end - end - - context 'when there are still unmigrated stages afterwards' do - let(:stages) { table('ci_stages') } - - before do - stages.create!(status: nil, name: 'build') - stages.create!(status: nil, name: 'test') - end - - it 'migrates statuses sequentially in batches' do - migrate! - - expect(migration).to have_received(:perform).once - end - end -end diff --git a/spec/migrations/clean_upload_symlinks_spec.rb b/spec/migrations/clean_upload_symlinks_spec.rb deleted file mode 100644 index 26653b9c008..00000000000 --- a/spec/migrations/clean_upload_symlinks_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170406111121_clean_upload_symlinks.rb') - -describe CleanUploadSymlinks do - let(:migration) { described_class.new } - let(:test_dir) { File.join(Rails.root, "tmp", "tests", "move_uploads_test") } - let(:uploads_dir) { File.join(test_dir, "public", "uploads") } - let(:new_uploads_dir) { File.join(uploads_dir, "-", "system") } - let(:original_path) { File.join(new_uploads_dir, 'user') } - let(:symlink_path) { File.join(uploads_dir, 'user') } - - before do - FileUtils.remove_dir(test_dir) if File.directory?(test_dir) - FileUtils.mkdir_p(uploads_dir) - allow(migration).to receive(:base_directory).and_return(test_dir) - allow(migration).to receive(:say) - end - - describe "#up" do - before do - FileUtils.mkdir_p(original_path) - FileUtils.ln_s(original_path, symlink_path) - end - - it 'removes the symlink' do - migration.up - - expect(File.symlink?(symlink_path)).to be(false) - end - end - - describe '#down' do - before do - FileUtils.mkdir_p(File.join(original_path)) - FileUtils.touch(File.join(original_path, 'dummy.file')) - end - - it 'creates a symlink' do - expected_path = File.join(symlink_path, "dummy.file") - migration.down - - expect(File.exist?(expected_path)).to be(true) - expect(File.symlink?(symlink_path)).to be(true) - end - end -end diff --git a/spec/migrations/cleanup_move_system_upload_folder_symlink_spec.rb b/spec/migrations/cleanup_move_system_upload_folder_symlink_spec.rb deleted file mode 100644 index 3a9fa8c7113..00000000000 --- a/spec/migrations/cleanup_move_system_upload_folder_symlink_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' -require Rails.root.join("db", "post_migrate", "20170717111152_cleanup_move_system_upload_folder_symlink.rb") - -describe CleanupMoveSystemUploadFolderSymlink do - let(:migration) { described_class.new } - let(:test_base) { File.join(Rails.root, 'tmp', 'tests', 'move-system-upload-folder') } - let(:test_folder) { File.join(test_base, '-', 'system') } - - before do - allow(migration).to receive(:base_directory).and_return(test_base) - FileUtils.rm_rf(test_base) - FileUtils.mkdir_p(test_folder) - allow(migration).to receive(:say) - end - - describe '#up' do - before do - FileUtils.ln_s(test_folder, File.join(test_base, 'system')) - end - - it 'removes the symlink' do - migration.up - - expect(File.exist?(File.join(test_base, 'system'))).to be_falsey - end - end - - describe '#down' do - it 'creates the symlink' do - migration.down - - expect(File.symlink?(File.join(test_base, 'system'))).to be_truthy - end - end -end diff --git a/spec/migrations/cleanup_nonexisting_namespace_pending_delete_projects_spec.rb b/spec/migrations/cleanup_nonexisting_namespace_pending_delete_projects_spec.rb deleted file mode 100644 index 0e6bded29b4..00000000000 --- a/spec/migrations/cleanup_nonexisting_namespace_pending_delete_projects_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb') - -describe CleanupNonexistingNamespacePendingDeleteProjects, :migration do - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - - describe '#up' do - let!(:some_project) { projects.create! } - let(:namespace) { namespaces.create!(name: 'test', path: 'test') } - - it 'only cleans up when namespace does not exist' do - projects.create!(pending_delete: true, namespace_id: namespace.id) - project = projects.create!(pending_delete: true, namespace_id: 0) - - expect(NamespacelessProjectDestroyWorker).to receive(:bulk_perform_async).with([[project.id]]) - - described_class.new.up - end - - it 'does nothing when no pending delete projects without namespace found' do - projects.create!(pending_delete: true, namespace_id: namespace.id) - - expect(NamespacelessProjectDestroyWorker).not_to receive(:bulk_perform_async) - - described_class.new.up - end - end -end diff --git a/spec/migrations/convert_custom_notification_settings_to_columns_spec.rb b/spec/migrations/convert_custom_notification_settings_to_columns_spec.rb deleted file mode 100644 index d1bf6bdf9d6..00000000000 --- a/spec/migrations/convert_custom_notification_settings_to_columns_spec.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170607121233_convert_custom_notification_settings_to_columns') - -describe ConvertCustomNotificationSettingsToColumns, :migration do - let(:user_class) { table(:users) } - - let(:settings_params) do - [ - { level: 0, events: [:new_note] }, # disabled, single event - { level: 3, events: [:new_issue, :reopen_issue, :close_issue, :reassign_issue] }, # global, multiple events - { level: 5, events: described_class::EMAIL_EVENTS }, # custom, all events - { level: 5, events: [] } # custom, no events - ] - end - - let(:notification_settings_before) do - settings_params.map do |params| - events = {} - - params[:events].each do |event| - events[event] = true - end - - user = user_class.create!(email: "user-#{SecureRandom.hex}@example.org", username: "user-#{SecureRandom.hex}", encrypted_password: '12345678') - create_params = { user_id: user.id, level: params[:level], events: events } - notification_setting = described_class::NotificationSetting.create(create_params) - - [notification_setting, params] - end - end - - let(:notification_settings_after) do - settings_params.map do |params| - events = {} - - params[:events].each do |event| - events[event] = true - end - - user = user_class.create!(email: "user-#{SecureRandom.hex}@example.org", username: "user-#{SecureRandom.hex}", encrypted_password: '12345678') - create_params = events.merge(user_id: user.id, level: params[:level]) - notification_setting = described_class::NotificationSetting.create(create_params) - - [notification_setting, params] - end - end - - describe '#up' do - it 'migrates all settings where a custom event is enabled, even if they are not currently using the custom level' do - notification_settings_before - - described_class.new.up - - notification_settings_before.each do |(notification_setting, params)| - notification_setting.reload - - expect(notification_setting.read_attribute_before_type_cast(:events)).to be_nil - expect(notification_setting.level).to eq(params[:level]) - - described_class::EMAIL_EVENTS.each do |event| - # We don't set the others to false, just let them default to nil - expected = params[:events].include?(event) || nil - - expect(notification_setting.read_attribute(event)).to eq(expected) - end - end - end - end - - describe '#down' do - it 'creates a custom events hash for all settings where at least one event is enabled' do - notification_settings_after - - described_class.new.down - - notification_settings_after.each do |(notification_setting, params)| - notification_setting.reload - - expect(notification_setting.level).to eq(params[:level]) - - if params[:events].empty? - # We don't migrate empty settings - expect(notification_setting.events).to eq({}) - else - described_class::EMAIL_EVENTS.each do |event| - expected = params[:events].include?(event) - - expect(notification_setting.events[event]).to eq(expected) - expect(notification_setting.read_attribute(event)).to be_nil - end - end - end - end - - it 'reverts the database to the state it was in before' do - notification_settings_before - - described_class.new.up - described_class.new.down - - notification_settings_before.each do |(notification_setting, params)| - notification_setting.reload - - expect(notification_setting.level).to eq(params[:level]) - - if params[:events].empty? - # We don't migrate empty settings - expect(notification_setting.events).to eq({}) - else - described_class::EMAIL_EVENTS.each do |event| - expected = params[:events].include?(event) - - expect(notification_setting.events[event]).to eq(expected) - expect(notification_setting.read_attribute(event)).to be_nil - end - end - end - end - end -end diff --git a/spec/migrations/delete_conflicting_redirect_routes_spec.rb b/spec/migrations/delete_conflicting_redirect_routes_spec.rb deleted file mode 100644 index 8a191bd7139..00000000000 --- a/spec/migrations/delete_conflicting_redirect_routes_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170907170235_delete_conflicting_redirect_routes') - -describe DeleteConflictingRedirectRoutes, :migration, :sidekiq do - let!(:redirect_routes) { table(:redirect_routes) } - let!(:routes) { table(:routes) } - - around do |example| - Timecop.freeze { example.run } - end - - before do - routes.create!(id: 1, source_id: 1, source_type: 'Namespace', path: 'foo1') - routes.create!(id: 2, source_id: 2, source_type: 'Namespace', path: 'foo2') - routes.create!(id: 3, source_id: 3, source_type: 'Namespace', path: 'foo3') - routes.create!(id: 4, source_id: 4, source_type: 'Namespace', path: 'foo4') - routes.create!(id: 5, source_id: 5, source_type: 'Namespace', path: 'foo5') - - # Valid redirects - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'bar') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'bar2') - redirect_routes.create!(source_id: 2, source_type: 'Namespace', path: 'bar3') - - # Conflicting redirects - redirect_routes.create!(source_id: 2, source_type: 'Namespace', path: 'foo1') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo2') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo3') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo4') - redirect_routes.create!(source_id: 1, source_type: 'Namespace', path: 'foo5') - end - - # No-op. See https://gitlab.com/gitlab-com/infrastructure/issues/3460#note_53223252 - it 'NO-OP: does not schedule any background migrations' do - Sidekiq::Testing.fake! do - Timecop.freeze do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq 0 - end - end - end -end diff --git a/spec/migrations/fix_wrongly_renamed_routes_spec.rb b/spec/migrations/fix_wrongly_renamed_routes_spec.rb deleted file mode 100644 index 543cf55f076..00000000000 --- a/spec/migrations/fix_wrongly_renamed_routes_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170518231126_fix_wrongly_renamed_routes.rb') - -describe FixWronglyRenamedRoutes, :migration do - let(:subject) { described_class.new } - let(:namespaces_table) { table(:namespaces) } - let(:projects_table) { table(:projects) } - let(:routes_table) { table(:routes) } - let(:broken_namespace) do - namespaces_table.create!(name: 'apiis', path: 'apiis').tap do |namespace| - routes_table.create!(source_type: 'Namespace', source_id: namespace.id, name: 'api0is', path: 'api0is') - end - end - let(:broken_namespace_route) { routes_table.where(source_type: 'Namespace', source_id: broken_namespace.id).first } - - describe '#wrongly_renamed' do - it "includes routes that have names that don't match their namespace" do - broken_namespace - other_namespace = namespaces_table.create!(name: 'api0', path: 'api0') - routes_table.create!(source_type: 'Namespace', source_id: other_namespace.id, name: 'api0', path: 'api0') - - expect(subject.wrongly_renamed.map(&:id)) - .to contain_exactly(broken_namespace_route.id) - end - end - - describe "#paths_and_corrections" do - it 'finds the wrong path and gets the correction from the namespace' do - broken_namespace - namespaces_table.create!(name: 'uploads-test', path: 'uploads-test').tap do |namespace| - routes_table.create!(source_type: 'Namespace', source_id: namespace.id, name: 'uploads-test', path: 'uploads0-test') - end - - expected_result = [ - { 'namespace_path' => 'apiis', 'path' => 'api0is' }, - { 'namespace_path' => 'uploads-test', 'path' => 'uploads0-test' } - ] - - expect(subject.paths_and_corrections).to include(*expected_result) - end - end - - describe '#routes_in_namespace_query' do - it 'includes only the required routes' do - namespace = namespaces_table.create!(name: 'hello', path: 'hello') - namespace_route = routes_table.create!(source_type: 'Namespace', source_id: namespace.id, name: 'hello', path: 'hello') - project = projects_table.new(name: 'my-project', path: 'my-project', namespace_id: namespace.id).tap do |project| - project.save!(validate: false) - end - routes_table.create!(source_type: 'Project', source_id: project.id, name: 'my-project', path: 'hello/my-project') - _other_namespace = namespaces_table.create!(name: 'hello0', path: 'hello0') - - result = routes_table.where(subject.routes_in_namespace_query('hello')) - project_route = routes_table.where(source_type: 'Project', source_id: project.id).first - - expect(result).to contain_exactly(namespace_route, project_route) - end - end - - describe '#up' do - it 'renames incorrectly named routes' do - broken_project = - projects_table.new(name: 'broken-project', path: 'broken-project', namespace_id: broken_namespace.id).tap do |project| - project.save!(validate: false) - routes_table.create!(source_type: 'Project', source_id: project.id, name: 'broken-project', path: 'api0is/broken-project') - end - - subject.up - - broken_project_route = routes_table.where(source_type: 'Project', source_id: broken_project.id).first - - expect(broken_project_route.path).to eq('apiis/broken-project') - expect(broken_namespace_route.reload.path).to eq('apiis') - end - - it "doesn't touch namespaces that look like something that should be renamed" do - namespaces_table.create!(name: 'apiis', path: 'apiis') - namespace = namespaces_table.create!(name: 'hello', path: 'api0') - namespace_route = routes_table.create!(source_type: 'Namespace', source_id: namespace.id, name: 'hello', path: 'api0') - - subject.up - - expect(namespace_route.reload.path).to eq('api0') - end - end -end diff --git a/spec/migrations/issues_moved_to_id_foreign_key_spec.rb b/spec/migrations/issues_moved_to_id_foreign_key_spec.rb deleted file mode 100644 index 71a4e71ac8a..00000000000 --- a/spec/migrations/issues_moved_to_id_foreign_key_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20171106151218_issues_moved_to_id_foreign_key.rb') - -describe IssuesMovedToIdForeignKey, :migration do - let(:issues) { table(:issues) } - - let!(:issue_third) { issues.create! } - let!(:issue_second) { issues.create!(moved_to_id: issue_third.id) } - let!(:issue_first) { issues.create!(moved_to_id: issue_second.id) } - - subject { described_class.new } - - it 'removes the orphaned moved_to_id' do - subject.down - - issue_third.update!(moved_to_id: 0) - - subject.up - - expect(issue_first.reload.moved_to_id).to eq(issue_second.id) - expect(issue_second.reload.moved_to_id).to eq(issue_third.id) - expect(issue_third.reload.moved_to_id).to be_nil - end -end diff --git a/spec/migrations/migrate_build_stage_reference_again_spec.rb b/spec/migrations/migrate_build_stage_reference_again_spec.rb deleted file mode 100644 index 6be480ce58e..00000000000 --- a/spec/migrations/migrate_build_stage_reference_again_spec.rb +++ /dev/null @@ -1,62 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170526190000_migrate_build_stage_reference_again.rb') - -describe MigrateBuildStageReferenceAgain, :migration do - ## - # Create test data - pipeline and CI/CD jobs. - # - - let(:jobs) { table(:ci_builds) } - let(:stages) { table(:ci_stages) } - let(:pipelines) { table(:ci_pipelines) } - let(:projects) { table(:projects) } - - before do - # Create projects - # - projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 456, name: 'gitlab2', path: 'gitlab2') - - # Create CI/CD pipelines - # - pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a') - pipelines.create!(id: 2, project_id: 456, ref: 'feature', sha: '21a3deb') - - # Create CI/CD jobs - # - jobs.create!(id: 1, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 3, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test') - jobs.create!(id: 4, commit_id: 1, project_id: 123, stage_idx: 3, stage: 'deploy') - jobs.create!(id: 5, commit_id: 2, project_id: 456, stage_idx: 2, stage: 'test:2') - jobs.create!(id: 6, commit_id: 2, project_id: 456, stage_idx: 1, stage: 'test:1') - jobs.create!(id: 7, commit_id: 2, project_id: 456, stage_idx: 1, stage: 'test:1') - jobs.create!(id: 8, commit_id: 3, project_id: 789, stage_idx: 3, stage: 'deploy') - - # Create CI/CD stages - # - stages.create(id: 101, pipeline_id: 1, project_id: 123, name: 'test') - stages.create(id: 102, pipeline_id: 1, project_id: 123, name: 'build') - stages.create(id: 103, pipeline_id: 1, project_id: 123, name: 'deploy') - stages.create(id: 104, pipeline_id: 2, project_id: 456, name: 'test:1') - stages.create(id: 105, pipeline_id: 2, project_id: 456, name: 'test:2') - stages.create(id: 106, pipeline_id: 2, project_id: 456, name: 'deploy') - end - - it 'correctly migrate build stage references' do - expect(jobs.where(stage_id: nil).count).to eq 8 - - migrate! - - expect(jobs.where(stage_id: nil).count).to eq 1 - - expect(jobs.find(1).stage_id).to eq 102 - expect(jobs.find(2).stage_id).to eq 102 - expect(jobs.find(3).stage_id).to eq 101 - expect(jobs.find(4).stage_id).to eq 103 - expect(jobs.find(5).stage_id).to eq 105 - expect(jobs.find(6).stage_id).to eq 104 - expect(jobs.find(7).stage_id).to eq 104 - expect(jobs.find(8).stage_id).to eq nil - end -end diff --git a/spec/migrations/migrate_gcp_clusters_to_new_clusters_architectures_spec.rb b/spec/migrations/migrate_gcp_clusters_to_new_clusters_architectures_spec.rb deleted file mode 100644 index ba4c66057d4..00000000000 --- a/spec/migrations/migrate_gcp_clusters_to_new_clusters_architectures_spec.rb +++ /dev/null @@ -1,181 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20171013104327_migrate_gcp_clusters_to_new_clusters_architectures.rb') - -describe MigrateGcpClustersToNewClustersArchitectures, :migration do - let(:projects) { table(:projects) } - let(:project) { projects.create } - let(:users) { table(:users) } - let(:user) { users.create! } - let(:service) { GcpMigrationSpec::KubernetesService.create!(project_id: project.id) } - - module GcpMigrationSpec - class KubernetesService < ActiveRecord::Base - self.table_name = 'services' - - serialize :properties, JSON - - default_value_for :active, true - default_value_for :type, 'KubernetesService' - default_value_for :properties, { - api_url: 'https://kubernetes.example.com', - token: 'a' * 40 - } - end - end - - context 'when cluster is being created' do - let(:project_id) { project.id } - let(:user_id) { user.id } - let(:service_id) { service.id } - let(:status) { 2 } # creating - let(:gcp_cluster_size) { 1 } - let(:created_at) { "'2017-10-17 20:24:02'" } - let(:updated_at) { "'2017-10-17 20:28:44'" } - let(:enabled) { true } - let(:status_reason) { "''" } - let(:project_namespace) { "'sample-app'" } - let(:endpoint) { 'NULL' } - let(:ca_cert) { 'NULL' } - let(:encrypted_kubernetes_token) { 'NULL' } - let(:encrypted_kubernetes_token_iv) { 'NULL' } - let(:username) { 'NULL' } - let(:encrypted_password) { 'NULL' } - let(:encrypted_password_iv) { 'NULL' } - let(:gcp_project_id) { "'gcp_project_id'" } - let(:gcp_cluster_zone) { "'gcp_cluster_zone'" } - let(:gcp_cluster_name) { "'gcp_cluster_name'" } - let(:gcp_machine_type) { "'gcp_machine_type'" } - let(:gcp_operation_id) { 'NULL' } - let(:encrypted_gcp_token) { "'encrypted_gcp_token'" } - let(:encrypted_gcp_token_iv) { "'encrypted_gcp_token_iv'" } - - let(:cluster) { described_class::Cluster.last } - let(:cluster_id) { cluster.id } - - before do - ActiveRecord::Base.connection.execute <<-SQL - INSERT INTO gcp_clusters (project_id, user_id, service_id, status, gcp_cluster_size, created_at, updated_at, enabled, status_reason, project_namespace, endpoint, ca_cert, encrypted_kubernetes_token, encrypted_kubernetes_token_iv, username, encrypted_password, encrypted_password_iv, gcp_project_id, gcp_cluster_zone, gcp_cluster_name, gcp_machine_type, gcp_operation_id, encrypted_gcp_token, encrypted_gcp_token_iv) - VALUES (#{project_id}, #{user_id}, #{service_id}, #{status}, #{gcp_cluster_size}, #{created_at}, #{updated_at}, #{enabled}, #{status_reason}, #{project_namespace}, #{endpoint}, #{ca_cert}, #{encrypted_kubernetes_token}, #{encrypted_kubernetes_token_iv}, #{username}, #{encrypted_password}, #{encrypted_password_iv}, #{gcp_project_id}, #{gcp_cluster_zone}, #{gcp_cluster_name}, #{gcp_machine_type}, #{gcp_operation_id}, #{encrypted_gcp_token}, #{encrypted_gcp_token_iv}); - SQL - end - - it 'correctly migrate to new clusters architectures' do - migrate! - - expect(described_class::Cluster.count).to eq(1) - expect(described_class::ClustersProject.count).to eq(1) - expect(described_class::ProvidersGcp.count).to eq(1) - expect(described_class::PlatformsKubernetes.count).to eq(1) - - expect(cluster.user_id).to eq(user.id) - expect(cluster.enabled).to be_truthy - expect(cluster.name).to eq(gcp_cluster_name.delete!("'")) - expect(cluster.provider_type).to eq('gcp') - expect(cluster.platform_type).to eq('kubernetes') - - expect(cluster.project_ids).to include(project.id) - - expect(cluster.provider_gcp.cluster_id).to eq(cluster.id) - expect(cluster.provider_gcp.status).to eq(status) - expect(cluster.provider_gcp.status_reason).to eq(tr(status_reason)) - expect(cluster.provider_gcp.gcp_project_id).to eq(tr(gcp_project_id)) - expect(cluster.provider_gcp.zone).to eq(tr(gcp_cluster_zone)) - expect(cluster.provider_gcp.num_nodes).to eq(gcp_cluster_size) - expect(cluster.provider_gcp.machine_type).to eq(tr(gcp_machine_type)) - expect(cluster.provider_gcp.operation_id).to be_nil - expect(cluster.provider_gcp.endpoint).to be_nil - expect(cluster.provider_gcp.encrypted_access_token).to eq(tr(encrypted_gcp_token)) - expect(cluster.provider_gcp.encrypted_access_token_iv).to eq(tr(encrypted_gcp_token_iv)) - - expect(cluster.platform_kubernetes.cluster_id).to eq(cluster.id) - expect(cluster.platform_kubernetes.api_url).to be_nil - expect(cluster.platform_kubernetes.ca_cert).to be_nil - expect(cluster.platform_kubernetes.namespace).to eq(tr(project_namespace)) - expect(cluster.platform_kubernetes.username).to be_nil - expect(cluster.platform_kubernetes.encrypted_password).to be_nil - expect(cluster.platform_kubernetes.encrypted_password_iv).to be_nil - expect(cluster.platform_kubernetes.encrypted_token).to be_nil - expect(cluster.platform_kubernetes.encrypted_token_iv).to be_nil - end - end - - context 'when cluster has been created' do - let(:project_id) { project.id } - let(:user_id) { user.id } - let(:service_id) { service.id } - let(:status) { 3 } # created - let(:gcp_cluster_size) { 1 } - let(:created_at) { "'2017-10-17 20:24:02'" } - let(:updated_at) { "'2017-10-17 20:28:44'" } - let(:enabled) { true } - let(:status_reason) { "'general error'" } - let(:project_namespace) { "'sample-app'" } - let(:endpoint) { "'111.111.111.111'" } - let(:ca_cert) { "'ca_cert'" } - let(:encrypted_kubernetes_token) { "'encrypted_kubernetes_token'" } - let(:encrypted_kubernetes_token_iv) { "'encrypted_kubernetes_token_iv'" } - let(:username) { "'username'" } - let(:encrypted_password) { "'encrypted_password'" } - let(:encrypted_password_iv) { "'encrypted_password_iv'" } - let(:gcp_project_id) { "'gcp_project_id'" } - let(:gcp_cluster_zone) { "'gcp_cluster_zone'" } - let(:gcp_cluster_name) { "'gcp_cluster_name'" } - let(:gcp_machine_type) { "'gcp_machine_type'" } - let(:gcp_operation_id) { "'gcp_operation_id'" } - let(:encrypted_gcp_token) { "'encrypted_gcp_token'" } - let(:encrypted_gcp_token_iv) { "'encrypted_gcp_token_iv'" } - - let(:cluster) { described_class::Cluster.last } - let(:cluster_id) { cluster.id } - - before do - ActiveRecord::Base.connection.execute <<-SQL - INSERT INTO gcp_clusters (project_id, user_id, service_id, status, gcp_cluster_size, created_at, updated_at, enabled, status_reason, project_namespace, endpoint, ca_cert, encrypted_kubernetes_token, encrypted_kubernetes_token_iv, username, encrypted_password, encrypted_password_iv, gcp_project_id, gcp_cluster_zone, gcp_cluster_name, gcp_machine_type, gcp_operation_id, encrypted_gcp_token, encrypted_gcp_token_iv) - VALUES (#{project_id}, #{user_id}, #{service_id}, #{status}, #{gcp_cluster_size}, #{created_at}, #{updated_at}, #{enabled}, #{status_reason}, #{project_namespace}, #{endpoint}, #{ca_cert}, #{encrypted_kubernetes_token}, #{encrypted_kubernetes_token_iv}, #{username}, #{encrypted_password}, #{encrypted_password_iv}, #{gcp_project_id}, #{gcp_cluster_zone}, #{gcp_cluster_name}, #{gcp_machine_type}, #{gcp_operation_id}, #{encrypted_gcp_token}, #{encrypted_gcp_token_iv}); - SQL - end - - it 'correctly migrate to new clusters architectures' do - migrate! - - expect(described_class::Cluster.count).to eq(1) - expect(described_class::ClustersProject.count).to eq(1) - expect(described_class::ProvidersGcp.count).to eq(1) - expect(described_class::PlatformsKubernetes.count).to eq(1) - - expect(cluster.user_id).to eq(user.id) - expect(cluster.enabled).to be_truthy - expect(cluster.name).to eq(tr(gcp_cluster_name)) - expect(cluster.provider_type).to eq('gcp') - expect(cluster.platform_type).to eq('kubernetes') - - expect(cluster.project_ids).to include(project.id) - - expect(cluster.provider_gcp.cluster_id).to eq(cluster.id) - expect(cluster.provider_gcp.status).to eq(status) - expect(cluster.provider_gcp.status_reason).to eq(tr(status_reason)) - expect(cluster.provider_gcp.gcp_project_id).to eq(tr(gcp_project_id)) - expect(cluster.provider_gcp.zone).to eq(tr(gcp_cluster_zone)) - expect(cluster.provider_gcp.num_nodes).to eq(gcp_cluster_size) - expect(cluster.provider_gcp.machine_type).to eq(tr(gcp_machine_type)) - expect(cluster.provider_gcp.operation_id).to eq(tr(gcp_operation_id)) - expect(cluster.provider_gcp.endpoint).to eq(tr(endpoint)) - expect(cluster.provider_gcp.encrypted_access_token).to eq(tr(encrypted_gcp_token)) - expect(cluster.provider_gcp.encrypted_access_token_iv).to eq(tr(encrypted_gcp_token_iv)) - - expect(cluster.platform_kubernetes.cluster_id).to eq(cluster.id) - expect(cluster.platform_kubernetes.api_url).to eq('https://' + tr(endpoint)) - expect(cluster.platform_kubernetes.ca_cert).to eq(tr(ca_cert)) - expect(cluster.platform_kubernetes.namespace).to eq(tr(project_namespace)) - expect(cluster.platform_kubernetes.username).to eq(tr(username)) - expect(cluster.platform_kubernetes.encrypted_password).to eq(tr(encrypted_password)) - expect(cluster.platform_kubernetes.encrypted_password_iv).to eq(tr(encrypted_password_iv)) - expect(cluster.platform_kubernetes.encrypted_token).to eq(tr(encrypted_kubernetes_token)) - expect(cluster.platform_kubernetes.encrypted_token_iv).to eq(tr(encrypted_kubernetes_token_iv)) - end - end - - def tr(str) - str.delete("'") - end -end diff --git a/spec/migrations/migrate_issues_to_ghost_user_spec.rb b/spec/migrations/migrate_issues_to_ghost_user_spec.rb deleted file mode 100644 index 0016f058a17..00000000000 --- a/spec/migrations/migrate_issues_to_ghost_user_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170825104051_migrate_issues_to_ghost_user.rb') - -describe MigrateIssuesToGhostUser, :migration do - describe '#up' do - let(:projects) { table(:projects) } - let(:issues) { table(:issues) } - let(:users) { table(:users) } - - before do - project = projects.create!(name: 'gitlab', namespace_id: 1) - user = users.create(email: 'test@example.com') - issues.create(title: 'Issue 1', author_id: nil, project_id: project.id) - issues.create(title: 'Issue 2', author_id: user.id, project_id: project.id) - end - - context 'when ghost user exists' do - let!(:ghost) { users.create(ghost: true, email: 'ghost@example.com') } - - it 'does not create a new user' do - expect { migrate! }.not_to change { User.count } - end - - it 'migrates issues where author = nil to the ghost user' do - migrate! - - expect(issues.first.reload.author_id).to eq(ghost.id) - end - - it 'does not change issues authored by an existing user' do - expect { migrate! }.not_to change { issues.second.reload.author_id} - end - end - - context 'when ghost user does not exist' do - it 'creates a new user' do - expect { migrate! }.to change { User.count }.by(1) - end - - it 'migrates issues where author = nil to the ghost user' do - migrate! - - expect(issues.first.reload.author_id).to eq(User.ghost.id) - end - - it 'does not change issues authored by an existing user' do - expect { migrate! }.not_to change { issues.second.reload.author_id} - end - end - end -end diff --git a/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb b/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb deleted file mode 100644 index df0015b6dd3..00000000000 --- a/spec/migrations/migrate_kubernetes_service_to_new_clusters_architectures_spec.rb +++ /dev/null @@ -1,312 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb') - -describe MigrateKubernetesServiceToNewClustersArchitectures, :migration do - context 'when unique KubernetesService exists' do - shared_examples 'KubernetesService migration' do - let(:sample_num) { 2 } - - let(:projects) do - (1..sample_num).each_with_object([]) do |n, array| - array << MigrateKubernetesServiceToNewClustersArchitectures::Project.create! - end - end - - let!(:kubernetes_services) do - projects.map do |project| - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: active, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"namespace\":\"prod\",\"api_url\":\"https://kubernetes#{project.id}.com\",\"ca_pem\":\"ca_pem#{project.id}\",\"token\":\"token#{project.id}\"}") - end - end - - it 'migrates the KubernetesService to Platform::Kubernetes' do - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(sample_num) - - projects.each do |project| - project.clusters.last.tap do |cluster| - expect(cluster.enabled).to eq(active) - expect(cluster.platform_kubernetes.api_url).to eq(project.kubernetes_service.api_url) - expect(cluster.platform_kubernetes.ca_cert).to eq(project.kubernetes_service.ca_pem) - expect(cluster.platform_kubernetes.token).to eq(project.kubernetes_service.token) - expect(project.kubernetes_service).not_to be_active - end - end - end - end - - context 'when KubernetesService is active' do - let(:active) { true } - - it_behaves_like 'KubernetesService migration' - end - end - - context 'when unique KubernetesService spawned from Service Template' do - let(:sample_num) { 2 } - - let(:projects) do - (1..sample_num).each_with_object([]) do |n, array| - array << MigrateKubernetesServiceToNewClustersArchitectures::Project.create! - end - end - - let!(:kubernetes_service_template) do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - template: true, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"namespace\":\"prod\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}") - end - - let!(:kubernetes_services) do - projects.map do |project| - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"namespace\":\"prod\",\"api_url\":\"#{kubernetes_service_template.api_url}\",\"ca_pem\":\"#{kubernetes_service_template.ca_pem}\",\"token\":\"#{kubernetes_service_template.token}\"}") - end - end - - it 'migrates the KubernetesService to Platform::Kubernetes without template' do - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(sample_num) - - projects.each do |project| - project.clusters.last.tap do |cluster| - expect(cluster.platform_kubernetes.api_url).to eq(project.kubernetes_service.api_url) - expect(cluster.platform_kubernetes.ca_cert).to eq(project.kubernetes_service.ca_pem) - expect(cluster.platform_kubernetes.token).to eq(project.kubernetes_service.token) - expect(project.kubernetes_service).not_to be_active - end - end - end - end - - context 'when managed KubernetesService exists' do - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - let(:cluster) do - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create!( - projects: [project], - name: 'sample-cluster', - platform_type: :kubernetes, - provider_type: :user, - platform_kubernetes_attributes: { - api_url: 'https://sample.kubernetes.com', - ca_cert: 'ca_pem-sample', - token: 'token-sample' - } ) - end - - let!(:kubernetes_service) do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: cluster.enabled, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"api_url\":\"#{cluster.platform_kubernetes.api_url}\"}") - end - - it 'does not migrate the KubernetesService and disables the kubernetes_service' do # Because the corresponding Platform::Kubernetes already exists - expect { migrate! }.not_to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count } - - kubernetes_service.reload - expect(kubernetes_service).not_to be_active - end - end - - context 'when production cluster has already been existed' do # i.e. There are no environment_scope conflicts - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - let(:cluster) do - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create!( - projects: [project], - name: 'sample-cluster', - platform_type: :kubernetes, - provider_type: :user, - environment_scope: 'production/*', - platform_kubernetes_attributes: { - api_url: 'https://sample.kubernetes.com', - ca_cert: 'ca_pem-sample', - token: 'token-sample' - } ) - end - - let!(:kubernetes_service) do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: true, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"api_url\":\"https://debug.kube.com\"}") - end - - it 'migrates the KubernetesService to Platform::Kubernetes' do - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(1) - - kubernetes_service.reload - project.clusters.last.tap do |cluster| - expect(cluster.environment_scope).to eq('*') - expect(cluster.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) - expect(cluster.platform_kubernetes.ca_cert).to eq(kubernetes_service.ca_pem) - expect(cluster.platform_kubernetes.token).to eq(kubernetes_service.token) - expect(kubernetes_service).not_to be_active - end - end - end - - context 'when default cluster has already been existed' do - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - let!(:cluster) do - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create!( - projects: [project], - name: 'sample-cluster', - platform_type: :kubernetes, - provider_type: :user, - environment_scope: '*', - platform_kubernetes_attributes: { - api_url: 'https://sample.kubernetes.com', - ca_cert: 'ca_pem-sample', - token: 'token-sample' - } ) - end - - let!(:kubernetes_service) do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: true, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"api_url\":\"https://debug.kube.com\"}") - end - - it 'migrates the KubernetesService to Platform::Kubernetes with dedicated environment_scope' do # Because environment_scope is duplicated - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(1) - - kubernetes_service.reload - project.clusters.last.tap do |cluster| - expect(cluster.environment_scope).to eq('migrated/*') - expect(cluster.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) - expect(cluster.platform_kubernetes.ca_cert).to eq(kubernetes_service.ca_pem) - expect(cluster.platform_kubernetes.token).to eq(kubernetes_service.token) - expect(kubernetes_service).not_to be_active - end - end - end - - context 'when default cluster and migrated cluster has already been existed' do - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - let!(:cluster) do - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create!( - projects: [project], - name: 'sample-cluster', - platform_type: :kubernetes, - provider_type: :user, - environment_scope: '*', - platform_kubernetes_attributes: { - api_url: 'https://sample.kubernetes.com', - ca_cert: 'ca_pem-sample', - token: 'token-sample' - } ) - end - - let!(:migrated_cluster) do - MigrateKubernetesServiceToNewClustersArchitectures::Cluster.create!( - projects: [project], - name: 'sample-cluster', - platform_type: :kubernetes, - provider_type: :user, - environment_scope: 'migrated/*', - platform_kubernetes_attributes: { - api_url: 'https://sample.kubernetes.com', - ca_cert: 'ca_pem-sample', - token: 'token-sample' - } ) - end - - let!(:kubernetes_service) do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: true, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"api_url\":\"https://debug.kube.com\"}") - end - - it 'migrates the KubernetesService to Platform::Kubernetes with dedicated environment_scope' do # Because environment_scope is duplicated - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(1) - - kubernetes_service.reload - project.clusters.last.tap do |cluster| - expect(cluster.environment_scope).to eq('migrated0/*') - expect(cluster.platform_kubernetes.api_url).to eq(kubernetes_service.api_url) - expect(cluster.platform_kubernetes.ca_cert).to eq(kubernetes_service.ca_pem) - expect(cluster.platform_kubernetes.token).to eq(kubernetes_service.token) - expect(kubernetes_service).not_to be_active - end - end - end - - context 'when KubernetesService has nullified parameters' do - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - before do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: false, - category: 'deployment', - type: 'KubernetesService', - properties: "{}") - end - - it 'does not migrate the KubernetesService and disables the kubernetes_service' do - expect { migrate! }.not_to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count } - - expect(project.kubernetes_service).not_to be_active - end - end - - # Platforms::Kubernetes validates `token` reagdless of the activeness, - # whereas KubernetesService validates `token` if only it's activated - # However, in this migration file, there are no validations because of the re-defined model class - # therefore, we should safely add this raw to Platform::Kubernetes - context 'when KubernetesService has empty token' do - let(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - before do - MigrateKubernetesServiceToNewClustersArchitectures::Service.create!( - project: project, - active: false, - category: 'deployment', - type: 'KubernetesService', - properties: "{\"namespace\":\"prod\",\"api_url\":\"http://111.111.111.111\",\"ca_pem\":\"a\",\"token\":\"\"}") - end - - it 'does not migrate the KubernetesService and disables the kubernetes_service' do - expect { migrate! }.to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count }.by(1) - - project.clusters.last.tap do |cluster| - expect(cluster.environment_scope).to eq('*') - expect(cluster.platform_kubernetes.namespace).to eq('prod') - expect(cluster.platform_kubernetes.api_url).to eq('http://111.111.111.111') - expect(cluster.platform_kubernetes.ca_cert).to eq('a') - expect(cluster.platform_kubernetes.token).to be_empty - expect(project.kubernetes_service).not_to be_active - end - end - end - - context 'when KubernetesService does not exist' do - let!(:project) { MigrateKubernetesServiceToNewClustersArchitectures::Project.create! } - - it 'does not migrate the KubernetesService' do - expect { migrate! }.not_to change { MigrateKubernetesServiceToNewClustersArchitectures::Cluster.count } - end - end -end diff --git a/spec/migrations/migrate_old_artifacts_spec.rb b/spec/migrations/migrate_old_artifacts_spec.rb deleted file mode 100644 index bc826d91471..00000000000 --- a/spec/migrations/migrate_old_artifacts_spec.rb +++ /dev/null @@ -1,140 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170523083112_migrate_old_artifacts.rb') - -# Adding the ci_job_artifacts table (from the 20170918072948 schema) -# makes the use of model code below easier. -describe MigrateOldArtifacts, :migration, schema: 20170918072948 do - let(:migration) { described_class.new } - let!(:directory) { Dir.mktmpdir } - - before do - allow(Gitlab.config.artifacts).to receive(:path).and_return(directory) - end - - after do - FileUtils.remove_entry_secure(directory) - end - - context 'with migratable data' do - let(:projects) { table(:projects) } - let(:ci_pipelines) { table(:ci_pipelines) } - let(:ci_builds) { table(:ci_builds) } - - let!(:project1) { projects.create!(ci_id: 2) } - let!(:project2) { projects.create!(ci_id: 3) } - let!(:project3) { projects.create! } - - let!(:pipeline1) { ci_pipelines.create!(project_id: project1.id) } - let!(:pipeline2) { ci_pipelines.create!(project_id: project2.id) } - let!(:pipeline3) { ci_pipelines.create!(project_id: project3.id) } - - let!(:build_with_legacy_artifacts) { ci_builds.create!(commit_id: pipeline1.id, project_id: project1.id, type: 'Ci::Build').becomes(Ci::Build) } - let!(:build_without_artifacts) { ci_builds.create!(commit_id: pipeline1.id, project_id: project1.id, type: 'Ci::Build').becomes(Ci::Build) } - let!(:build2) { ci_builds.create!(commit_id: pipeline2.id, project_id: project2.id, type: 'Ci::Build').becomes(Ci::Build) } - let!(:build3) { ci_builds.create!(commit_id: pipeline3.id, project_id: project3.id, type: 'Ci::Build').becomes(Ci::Build) } - - before do - setup_builds(build2, build3) - - store_artifacts_in_legacy_path(build_with_legacy_artifacts) - end - - it "legacy artifacts are not accessible" do - expect(build_with_legacy_artifacts.artifacts?).to be_falsey - end - - describe '#min_id' do - subject { migration.send(:min_id) } - - it 'returns the newest build for which ci_id is not defined' do - is_expected.to eq(build3.id) - end - end - - describe '#builds_with_artifacts' do - subject { migration.send(:builds_with_artifacts).map(&:id) } - - it 'returns a list of builds that has artifacts and could be migrated' do - is_expected.to contain_exactly(build_with_legacy_artifacts.id, build2.id) - end - end - - describe '#up' do - context 'when migrating artifacts' do - before do - migration.up - end - - it 'all files do have artifacts' do - Ci::Build.with_artifacts_archive do |build| - expect(build).to have_artifacts - end - end - - it 'artifacts are no longer present on legacy path' do - expect(File.exist?(legacy_path(build_with_legacy_artifacts))).to eq(false) - end - end - - context 'when there are artifacts in old and new directory' do - before do - store_artifacts_in_legacy_path(build2) - - migration.up - end - - it 'does not move old files' do - expect(File.exist?(legacy_path(build2))).to eq(true) - end - end - end - - private - - def store_artifacts_in_legacy_path(build) - FileUtils.mkdir_p(legacy_path(build)) - - FileUtils.copy( - Rails.root.join('spec/fixtures/ci_build_artifacts.zip'), - File.join(legacy_path(build), "ci_build_artifacts.zip")) - - FileUtils.copy( - Rails.root.join('spec/fixtures/ci_build_artifacts_metadata.gz'), - File.join(legacy_path(build), "ci_build_artifacts_metadata.gz")) - - build.update_columns( - artifacts_file: 'ci_build_artifacts.zip', - artifacts_metadata: 'ci_build_artifacts_metadata.gz') - - build.reload - end - - def legacy_path(build) - File.join(directory, - build.created_at.utc.strftime('%Y_%m'), - build.project.ci_id.to_s, - build.id.to_s) - end - - def new_legacy_path(build) - File.join(directory, - build.created_at.utc.strftime('%Y_%m'), - build.project_id.to_s, - build.id.to_s) - end - - def setup_builds(*builds) - builds.each do |build| - FileUtils.mkdir_p(new_legacy_path(build)) - - build.update_columns( - artifacts_file: 'ci_build_artifacts.zip', - artifacts_metadata: 'ci_build_artifacts_metadata.gz') - - build.reload - end - end - end -end diff --git a/spec/migrations/migrate_pipeline_sidekiq_queues_spec.rb b/spec/migrations/migrate_pipeline_sidekiq_queues_spec.rb deleted file mode 100644 index e38044ccceb..00000000000 --- a/spec/migrations/migrate_pipeline_sidekiq_queues_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170822101017_migrate_pipeline_sidekiq_queues.rb') - -describe MigratePipelineSidekiqQueues, :sidekiq, :redis do - include Gitlab::Database::MigrationHelpers - include StubWorker - - context 'when there are jobs in the queues' do - it 'correctly migrates queue when migrating up' do - Sidekiq::Testing.disable! do - stub_worker(queue: :pipeline).perform_async('Something', [1]) - stub_worker(queue: :build).perform_async('Something', [1]) - - described_class.new.up - - expect(sidekiq_queue_length('pipeline')).to eq 0 - expect(sidekiq_queue_length('build')).to eq 0 - expect(sidekiq_queue_length('pipeline_default')).to eq 2 - end - end - - it 'correctly migrates queue when migrating down' do - Sidekiq::Testing.disable! do - stub_worker(queue: :pipeline_default).perform_async('Class', [1]) - stub_worker(queue: :pipeline_processing).perform_async('Class', [2]) - stub_worker(queue: :pipeline_hooks).perform_async('Class', [3]) - stub_worker(queue: :pipeline_cache).perform_async('Class', [4]) - - described_class.new.down - - expect(sidekiq_queue_length('pipeline')).to eq 4 - expect(sidekiq_queue_length('pipeline_default')).to eq 0 - expect(sidekiq_queue_length('pipeline_processing')).to eq 0 - expect(sidekiq_queue_length('pipeline_hooks')).to eq 0 - expect(sidekiq_queue_length('pipeline_cache')).to eq 0 - end - end - end - - context 'when there are no jobs in the queues' do - it 'does not raise error when migrating up' do - expect { described_class.new.up }.not_to raise_error - end - - it 'does not raise error when migrating down' do - expect { described_class.new.down }.not_to raise_error - end - end -end diff --git a/spec/migrations/migrate_pipeline_stages_spec.rb b/spec/migrations/migrate_pipeline_stages_spec.rb deleted file mode 100644 index c47f2bb8ff9..00000000000 --- a/spec/migrations/migrate_pipeline_stages_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170526185842_migrate_pipeline_stages.rb') - -describe MigratePipelineStages, :migration do - ## - # Create test data - pipeline and CI/CD jobs. - # - - let(:jobs) { table(:ci_builds) } - let(:stages) { table(:ci_stages) } - let(:pipelines) { table(:ci_pipelines) } - let(:projects) { table(:projects) } - - before do - # Create projects - # - projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 456, name: 'gitlab2', path: 'gitlab2') - - # Create CI/CD pipelines - # - pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a') - pipelines.create!(id: 2, project_id: 456, ref: 'feature', sha: '21a3deb') - - # Create CI/CD jobs - # - jobs.create!(id: 1, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 3, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test') - jobs.create!(id: 4, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test') - jobs.create!(id: 5, commit_id: 1, project_id: 123, stage_idx: 3, stage: 'deploy') - jobs.create!(id: 6, commit_id: 2, project_id: 456, stage_idx: 3, stage: 'deploy') - jobs.create!(id: 7, commit_id: 2, project_id: 456, stage_idx: 2, stage: 'test:2') - jobs.create!(id: 8, commit_id: 2, project_id: 456, stage_idx: 1, stage: 'test:1') - jobs.create!(id: 9, commit_id: 2, project_id: 456, stage_idx: 1, stage: 'test:1') - jobs.create!(id: 10, commit_id: 2, project_id: 456, stage_idx: 2, stage: 'test:2') - jobs.create!(id: 11, commit_id: 3, project_id: 456, stage_idx: 3, stage: 'deploy') - jobs.create!(id: 12, commit_id: 2, project_id: 789, stage_idx: 3, stage: 'deploy') - end - - it 'correctly migrates pipeline stages' do - expect(stages.count).to be_zero - - migrate! - - expect(stages.count).to eq 6 - expect(stages.all.pluck(:name)) - .to match_array %w[test build deploy test:1 test:2 deploy] - expect(stages.where(pipeline_id: 1).order(:id).pluck(:name)) - .to eq %w[test build deploy] - expect(stages.where(pipeline_id: 2).order(:id).pluck(:name)) - .to eq %w[test:1 test:2 deploy] - expect(stages.where(pipeline_id: 3).count).to be_zero - expect(stages.where(project_id: 789).count).to be_zero - end -end diff --git a/spec/migrations/migrate_process_commit_worker_jobs_spec.rb b/spec/migrations/migrate_process_commit_worker_jobs_spec.rb deleted file mode 100644 index 6219a67c900..00000000000 --- a/spec/migrations/migrate_process_commit_worker_jobs_spec.rb +++ /dev/null @@ -1,197 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20161124141322_migrate_process_commit_worker_jobs.rb') - -describe MigrateProcessCommitWorkerJobs do - set(:project) { create(:project, :legacy_storage, :repository) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - set(:user) { create(:user) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let(:commit) do - Gitlab::Git::Commit.last(project.repository.raw) - end - - describe 'Project' do - describe 'find_including_path' do - it 'returns Project instances' do - expect(described_class::Project.find_including_path(project.id)) - .to be_an_instance_of(described_class::Project) - end - - it 'selects the full path for every Project' do - migration_project = described_class::Project - .find_including_path(project.id) - - expect(migration_project[:path_with_namespace]) - .to eq(project.full_path) - end - end - - describe '#repository' do - it 'returns a mock implemention of ::Repository' do - migration_project = described_class::Project - .find_including_path(project.id) - - expect(migration_project.repository).to respond_to(:storage) - expect(migration_project.repository).to respond_to(:gitaly_repository) - end - end - end - - describe '#up', :clean_gitlab_redis_shared_state do - let(:migration) { described_class.new } - - def job_count - Sidekiq.redis { |r| r.llen('queue:process_commit') } - end - - def pop_job - JSON.parse(Sidekiq.redis { |r| r.lpop('queue:process_commit') }) - end - - before do - Sidekiq.redis do |redis| - job = JSON.dump(args: [project.id, user.id, commit.id]) - redis.lpush('queue:process_commit', job) - end - end - - it 'skips jobs using a project that no longer exists' do - allow(described_class::Project).to receive(:find_including_path) - .with(project.id) - .and_return(nil) - - migration.up - - expect(job_count).to eq(0) - end - - it 'skips jobs using commits that no longer exist' do - allow_any_instance_of(Gitlab::GitalyClient::CommitService) - .to receive(:find_commit) - .with(commit.id) - .and_return(nil) - - migration.up - - expect(job_count).to eq(0) - end - - it 'inserts migrated jobs back into the queue' do - migration.up - - expect(job_count).to eq(1) - end - - it 'encodes data to UTF-8' do - allow(commit).to receive(:body) - .and_return('김치'.force_encoding('BINARY')) - - migration.up - - job = pop_job - - # We don't care so much about what is being stored, instead we just want - # to make sure the encoding is right so that JSON encoding the data - # doesn't produce any errors. - expect(job['args'][2]['message'].encoding).to eq(Encoding::UTF_8) - end - - context 'a migrated job' do - let(:job) do - migration.up - pop_job - end - - let(:commit_hash) do - job['args'][2] - end - - it 'includes the project ID' do - expect(job['args'][0]).to eq(project.id) - end - - it 'includes the user ID' do - expect(job['args'][1]).to eq(user.id) - end - - it 'includes the commit ID' do - expect(commit_hash['id']).to eq(commit.id) - end - - it 'includes the commit message' do - expect(commit_hash['message']).to eq(commit.message) - end - - it 'includes the parent IDs' do - expect(commit_hash['parent_ids']).to eq(commit.parent_ids) - end - - it 'includes the author date' do - expect(commit_hash['authored_date']).to eq(commit.authored_date.to_s) - end - - it 'includes the author name' do - expect(commit_hash['author_name']).to eq(commit.author_name) - end - - it 'includes the author Email' do - expect(commit_hash['author_email']).to eq(commit.author_email) - end - - it 'includes the commit date' do - expect(commit_hash['committed_date']).to eq(commit.committed_date.to_s) - end - - it 'includes the committer name' do - expect(commit_hash['committer_name']).to eq(commit.committer_name) - end - - it 'includes the committer Email' do - expect(commit_hash['committer_email']).to eq(commit.committer_email) - end - end - end - - describe '#down', :clean_gitlab_redis_shared_state do - let(:migration) { described_class.new } - - def job_count - Sidekiq.redis { |r| r.llen('queue:process_commit') } - end - - before do - Sidekiq.redis do |redis| - job = JSON.dump(args: [project.id, user.id, commit.id]) - redis.lpush('queue:process_commit', job) - - migration.up - end - end - - it 'pushes migrated jobs back into the queue' do - migration.down - - expect(job_count).to eq(1) - end - - context 'a migrated job' do - let(:job) do - migration.down - - JSON.parse(Sidekiq.redis { |r| r.lpop('queue:process_commit') }) - end - - it 'includes the project ID' do - expect(job['args'][0]).to eq(project.id) - end - - it 'includes the user ID' do - expect(job['args'][1]).to eq(user.id) - end - - it 'includes the commit SHA' do - expect(job['args'][2]).to eq(commit.id) - end - end - end -end diff --git a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb deleted file mode 100644 index dd6f5325750..00000000000 --- a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170628080858_migrate_stage_id_reference_in_background') - -describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do - let(:jobs) { table(:ci_builds) } - let(:stages) { table(:ci_stages) } - let(:pipelines) { table(:ci_pipelines) } - let(:projects) { table(:projects) } - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 3) - stub_const("#{described_class.name}::RANGE_SIZE", 2) - - projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 345, name: 'gitlab2', path: 'gitlab2') - - pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a') - pipelines.create!(id: 2, project_id: 345, ref: 'feature', sha: 'cdf43c3c') - - jobs.create!(id: 1, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 2, stage: 'build') - jobs.create!(id: 3, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test') - jobs.create!(id: 4, commit_id: 1, project_id: 123, stage_idx: 3, stage: 'deploy') - jobs.create!(id: 5, commit_id: 2, project_id: 345, stage_idx: 1, stage: 'test') - - stages.create(id: 101, pipeline_id: 1, project_id: 123, name: 'test') - stages.create(id: 102, pipeline_id: 1, project_id: 123, name: 'build') - stages.create(id: 103, pipeline_id: 1, project_id: 123, name: 'deploy') - - jobs.create!(id: 6, commit_id: 2, project_id: 345, stage_id: 101, stage_idx: 1, stage: 'test') - end - - it 'correctly schedules background migrations' do - Sidekiq::Testing.fake! do - Timecop.freeze do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 1, 2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 3, 3) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 4, 5) - expect(BackgroundMigrationWorker.jobs.size).to eq 3 - end - end - end - - it 'schedules background migrations' do - perform_enqueued_jobs do - expect(jobs.where(stage_id: nil).count).to eq 5 - - migrate! - - expect(jobs.where(stage_id: nil).count).to eq 1 - end - end -end diff --git a/spec/migrations/migrate_stages_statuses_spec.rb b/spec/migrations/migrate_stages_statuses_spec.rb deleted file mode 100644 index 5483e24fce7..00000000000 --- a/spec/migrations/migrate_stages_statuses_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170711145558_migrate_stages_statuses.rb') - -describe MigrateStagesStatuses, :sidekiq, :migration do - let(:jobs) { table(:ci_builds) } - let(:stages) { table(:ci_stages) } - let(:pipelines) { table(:ci_pipelines) } - let(:projects) { table(:projects) } - - STATUSES = { created: 0, pending: 1, running: 2, success: 3, - failed: 4, canceled: 5, skipped: 6, manual: 7 }.freeze - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - stub_const("#{described_class.name}::RANGE_SIZE", 1) - - projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 2, name: 'gitlab2', path: 'gitlab2') - - pipelines.create!(id: 1, project_id: 1, ref: 'master', sha: 'adf43c3a') - pipelines.create!(id: 2, project_id: 2, ref: 'feature', sha: '21a3deb') - - create_job(project: 1, pipeline: 1, stage: 'test', status: 'success') - create_job(project: 1, pipeline: 1, stage: 'test', status: 'running') - create_job(project: 1, pipeline: 1, stage: 'build', status: 'success') - create_job(project: 1, pipeline: 1, stage: 'build', status: 'failed') - create_job(project: 2, pipeline: 2, stage: 'test', status: 'success') - create_job(project: 2, pipeline: 2, stage: 'test', status: 'success') - create_job(project: 2, pipeline: 2, stage: 'test', status: 'failed', retried: true) - - stages.create!(id: 1, pipeline_id: 1, project_id: 1, name: 'test', status: nil) - stages.create!(id: 2, pipeline_id: 1, project_id: 1, name: 'build', status: nil) - stages.create!(id: 3, pipeline_id: 2, project_id: 2, name: 'test', status: nil) - end - - it 'correctly migrates stages statuses' do - perform_enqueued_jobs do - expect(stages.where(status: nil).count).to eq 3 - - migrate! - - expect(stages.where(status: nil)).to be_empty - expect(stages.all.order('id ASC').pluck(:status)) - .to eq [STATUSES[:running], STATUSES[:failed], STATUSES[:success]] - end - end - - it 'correctly schedules background migrations' do - Sidekiq::Testing.fake! do - Timecop.freeze do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, 1, 1) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, 2, 2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(10.minutes, 3, 3) - expect(BackgroundMigrationWorker.jobs.size).to eq 3 - end - end - end - - def create_job(project:, pipeline:, stage:, status:, **opts) - stages = { test: 1, build: 2, deploy: 3 } - - jobs.create!(project_id: project, commit_id: pipeline, - stage_idx: stages[stage.to_sym], stage: stage, - status: status, **opts) - end -end diff --git a/spec/migrations/migrate_user_activities_to_users_last_activity_on_spec.rb b/spec/migrations/migrate_user_activities_to_users_last_activity_on_spec.rb deleted file mode 100644 index 88aef3b70b4..00000000000 --- a/spec/migrations/migrate_user_activities_to_users_last_activity_on_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170324160416_migrate_user_activities_to_users_last_activity_on.rb') - -describe MigrateUserActivitiesToUsersLastActivityOn, :clean_gitlab_redis_shared_state, :migration do - let(:migration) { described_class.new } - let!(:user_active_1) { table(:users).create!(email: 'test1', username: 'test1') } - let!(:user_active_2) { table(:users).create!(email: 'test2', username: 'test2') } - - def record_activity(user, time) - Gitlab::Redis::SharedState.with do |redis| - redis.zadd(described_class::USER_ACTIVITY_SET_KEY, time.to_i, user.username) - end - end - - around do |example| - Timecop.freeze { example.run } - end - - before do - record_activity(user_active_1, described_class::TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED + 2.months) - record_activity(user_active_2, described_class::TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED + 3.months) - mute_stdout { migration.up } - end - - describe '#up' do - it 'fills last_activity_on from the legacy Redis Sorted Set' do - expect(user_active_1.reload.last_activity_on).to eq((described_class::TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED + 2.months).to_date) - expect(user_active_2.reload.last_activity_on).to eq((described_class::TIME_WHEN_ACTIVITY_SET_WAS_INTRODUCED + 3.months).to_date) - end - end - - describe '#down' do - it 'sets last_activity_on to NULL for all users' do - mute_stdout { migration.down } - - expect(user_active_1.reload.last_activity_on).to be_nil - expect(user_active_2.reload.last_activity_on).to be_nil - end - end - - def mute_stdout - orig_stdout = $stdout - $stdout = StringIO.new - yield - $stdout = orig_stdout - end -end diff --git a/spec/migrations/migrate_user_authentication_token_to_personal_access_token_spec.rb b/spec/migrations/migrate_user_authentication_token_to_personal_access_token_spec.rb deleted file mode 100644 index b4834705011..00000000000 --- a/spec/migrations/migrate_user_authentication_token_to_personal_access_token_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20171012125712_migrate_user_authentication_token_to_personal_access_token.rb') - -describe MigrateUserAuthenticationTokenToPersonalAccessToken, :migration do - let(:users) { table(:users) } - let(:personal_access_tokens) { table(:personal_access_tokens) } - - let!(:user) { users.create!(id: 1, email: 'user@example.com', authentication_token: 'user-token', admin: false) } - let!(:admin) { users.create!(id: 2, email: 'admin@example.com', authentication_token: 'admin-token', admin: true) } - - it 'migrates private tokens to Personal Access Tokens' do - migrate! - - expect(personal_access_tokens.count).to eq(2) - - user_token = personal_access_tokens.find_by(user_id: user.id) - admin_token = personal_access_tokens.find_by(user_id: admin.id) - - expect(user_token.token).to eq('user-token') - expect(admin_token.token).to eq('admin-token') - - expect(user_token.scopes).to eq(%w[api].to_yaml) - expect(admin_token.scopes).to eq(%w[api sudo].to_yaml) - end -end diff --git a/spec/migrations/migrate_user_project_view_spec.rb b/spec/migrations/migrate_user_project_view_spec.rb deleted file mode 100644 index a0179ab3ceb..00000000000 --- a/spec/migrations/migrate_user_project_view_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170406142253_migrate_user_project_view.rb') - -describe MigrateUserProjectView, :migration do - let(:migration) { described_class.new } - let!(:user) { table(:users).create!(project_view: User.project_views['readme']) } - - describe '#up' do - it 'updates project view setting with new value' do - migration.up - - expect(user.reload.project_view).to eq(User.project_views['files']) - end - end -end diff --git a/spec/migrations/move_personal_snippets_files_spec.rb b/spec/migrations/move_personal_snippets_files_spec.rb deleted file mode 100644 index d94ae1e52f5..00000000000 --- a/spec/migrations/move_personal_snippets_files_spec.rb +++ /dev/null @@ -1,197 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170612071012_move_personal_snippets_files.rb') - -describe MovePersonalSnippetsFiles, :migration do - let(:migration) { described_class.new } - let(:test_dir) { File.join(Rails.root, "tmp", "tests", "move_snippet_files_test") } - let(:uploads_dir) { File.join(test_dir, 'uploads') } - let(:new_uploads_dir) { File.join(uploads_dir, '-', 'system') } - - let(:notes) { table(:notes) } - let(:snippets) { table(:snippets) } - let(:uploads) { table(:uploads) } - - let(:user) { table(:users).create!(email: 'user@example.com', projects_limit: 10) } - let(:project) { table(:projects).create!(name: 'gitlab', namespace_id: 1) } - - before do - allow(CarrierWave).to receive(:root).and_return(test_dir) - allow(migration).to receive(:base_directory).and_return(test_dir) - FileUtils.remove_dir(test_dir) if File.directory?(test_dir) - allow(migration).to receive(:say) - end - - describe "#up" do - let(:snippet) do - snippet = snippets.create!(author_id: user.id) - create_upload('picture.jpg', snippet) - snippet.update(description: markdown_linking_file('picture.jpg', snippet)) - snippet - end - - let(:snippet_with_missing_file) do - snippet = snippets.create!(author_id: user.id, project_id: project.id) - create_upload('picture.jpg', snippet, create_file: false) - snippet.update(description: markdown_linking_file('picture.jpg', snippet)) - snippet - end - - it 'moves the files' do - source_path = File.join(uploads_dir, model_file_path('picture.jpg', snippet)) - destination_path = File.join(new_uploads_dir, model_file_path('picture.jpg', snippet)) - - migration.up - - expect(File.exist?(source_path)).to be_falsy - expect(File.exist?(destination_path)).to be_truthy - end - - describe 'updating the markdown' do - it 'includes the new path when the file exists' do - secret = "secret#{snippet.id}" - file_location = "/uploads/-/system/personal_snippet/#{snippet.id}/#{secret}/picture.jpg" - - migration.up - - expect(snippet.reload.description).to include(file_location) - end - - it 'does not update the markdown when the file is missing' do - secret = "secret#{snippet_with_missing_file.id}" - file_location = "/uploads/personal_snippet/#{snippet_with_missing_file.id}/#{secret}/picture.jpg" - - migration.up - - expect(snippet_with_missing_file.reload.description).to include(file_location) - end - - it 'updates the note markdown' do - secret = "secret#{snippet.id}" - file_location = "/uploads/-/system/personal_snippet/#{snippet.id}/#{secret}/picture.jpg" - markdown = markdown_linking_file('picture.jpg', snippet) - note = notes.create!(noteable_id: snippet.id, - noteable_type: Snippet, - note: "with #{markdown}", - author_id: user.id) - - migration.up - - expect(note.reload.note).to include(file_location) - end - end - end - - describe "#down" do - let(:snippet) do - snippet = snippets.create!(author_id: user.id) - create_upload('picture.jpg', snippet, in_new_path: true) - snippet.update(description: markdown_linking_file('picture.jpg', snippet, in_new_path: true)) - snippet - end - - let(:snippet_with_missing_file) do - snippet = snippets.create!(author_id: user.id) - create_upload('picture.jpg', snippet, create_file: false, in_new_path: true) - snippet.update(description: markdown_linking_file('picture.jpg', snippet, in_new_path: true)) - snippet - end - - it 'moves the files' do - source_path = File.join(new_uploads_dir, model_file_path('picture.jpg', snippet)) - destination_path = File.join(uploads_dir, model_file_path('picture.jpg', snippet)) - - migration.down - - expect(File.exist?(source_path)).to be_falsey - expect(File.exist?(destination_path)).to be_truthy - end - - describe 'updating the markdown' do - it 'includes the new path when the file exists' do - secret = "secret#{snippet.id}" - file_location = "/uploads/personal_snippet/#{snippet.id}/#{secret}/picture.jpg" - - migration.down - - expect(snippet.reload.description).to include(file_location) - end - - it 'keeps the markdown as is when the file is missing' do - secret = "secret#{snippet_with_missing_file.id}" - file_location = "/uploads/-/system/personal_snippet/#{snippet_with_missing_file.id}/#{secret}/picture.jpg" - - migration.down - - expect(snippet_with_missing_file.reload.description).to include(file_location) - end - - it 'updates the note markdown' do - markdown = markdown_linking_file('picture.jpg', snippet, in_new_path: true) - secret = "secret#{snippet.id}" - file_location = "/uploads/personal_snippet/#{snippet.id}/#{secret}/picture.jpg" - note = notes.create!(noteable_id: snippet.id, - noteable_type: Snippet, - note: "with #{markdown}", - author_id: user.id) - - migration.down - - expect(note.reload.note).to include(file_location) - end - end - end - - describe '#update_markdown' do - it 'escapes sql in the snippet description' do - migration.instance_variable_set('@source_relative_location', '/uploads/personal_snippet') - migration.instance_variable_set('@destination_relative_location', '/uploads/system/personal_snippet') - - secret = '123456789' - filename = 'hello.jpg' - snippet = snippets.create!(author_id: user.id) - - path_before = "/uploads/personal_snippet/#{snippet.id}/#{secret}/#{filename}" - path_after = "/uploads/system/personal_snippet/#{snippet.id}/#{secret}/#{filename}" - description_before = "Hello world; ![image](#{path_before})'; select * from users;" - description_after = "Hello world; ![image](#{path_after})'; select * from users;" - - migration.update_markdown(snippet.id, secret, filename, description_before) - - expect(snippet.reload.description).to eq(description_after) - end - end - - def create_upload(filename, snippet, create_file: true, in_new_path: false) - secret = "secret#{snippet.id}" - absolute_path = if in_new_path - File.join(new_uploads_dir, model_file_path(filename, snippet)) - else - File.join(uploads_dir, model_file_path(filename, snippet)) - end - - if create_file - FileUtils.mkdir_p(File.dirname(absolute_path)) - FileUtils.touch(absolute_path) - end - - uploads.create!(model_id: snippet.id, - model_type: snippet.class, - path: "#{secret}/#{filename}", - uploader: PersonalFileUploader, - size: 100.kilobytes) - end - - def markdown_linking_file(filename, snippet, in_new_path: false) - markdown = "![#{filename.split('.')[0]}]" - markdown += '(/uploads' - markdown += '/-/system' if in_new_path - markdown += "/#{model_file_path(filename, snippet)})" - markdown - end - - def model_file_path(filename, snippet) - secret = "secret#{snippet.id}" - - File.join('personal_snippet', snippet.id.to_s, secret, filename) - end -end diff --git a/spec/migrations/move_system_upload_folder_spec.rb b/spec/migrations/move_system_upload_folder_spec.rb deleted file mode 100644 index d3180477db3..00000000000 --- a/spec/migrations/move_system_upload_folder_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' -require Rails.root.join("db", "migrate", "20170717074009_move_system_upload_folder.rb") - -describe MoveSystemUploadFolder do - let(:migration) { described_class.new } - let(:test_base) { File.join(Rails.root, 'tmp', 'tests', 'move-system-upload-folder') } - - before do - allow(migration).to receive(:base_directory).and_return(test_base) - FileUtils.rm_rf(test_base) - FileUtils.mkdir_p(test_base) - allow(migration).to receive(:say) - end - - describe '#up' do - let(:test_folder) { File.join(test_base, 'system') } - let(:test_file) { File.join(test_folder, 'file') } - - before do - FileUtils.mkdir_p(test_folder) - FileUtils.touch(test_file) - end - - it 'moves the related folder' do - migration.up - - expect(File.exist?(File.join(test_base, '-', 'system', 'file'))).to be_truthy - end - - it 'creates a symlink linking making the new folder available on the old path' do - migration.up - - expect(File.symlink?(File.join(test_base, 'system'))).to be_truthy - expect(File.exist?(File.join(test_base, 'system', 'file'))).to be_truthy - end - - it 'does not move if the target directory already exists' do - FileUtils.mkdir_p(File.join(test_base, '-', 'system')) - - expect(FileUtils).not_to receive(:mv) - expect(migration).to receive(:say).with(/already exists. No need to redo the move/) - - migration.up - end - end - - describe '#down' do - let(:test_folder) { File.join(test_base, '-', 'system') } - let(:test_file) { File.join(test_folder, 'file') } - - before do - FileUtils.mkdir_p(test_folder) - FileUtils.touch(test_file) - end - - it 'moves the system folder back to the old location' do - migration.down - - expect(File.exist?(File.join(test_base, 'system', 'file'))).to be_truthy - end - - it 'removes the symlink if it existed' do - FileUtils.ln_s(test_folder, File.join(test_base, 'system')) - - migration.down - - expect(File.directory?(File.join(test_base, 'system'))).to be_truthy - expect(File.symlink?(File.join(test_base, 'system'))).to be_falsey - end - - it 'does not move if the old directory already exists' do - FileUtils.mkdir_p(File.join(test_base, 'system')) - - expect(FileUtils).not_to receive(:mv) - expect(migration).to receive(:say).with(/already exists and is not a symlink, no need to revert/) - - migration.down - end - end -end diff --git a/spec/migrations/move_uploads_to_system_dir_spec.rb b/spec/migrations/move_uploads_to_system_dir_spec.rb deleted file mode 100644 index ca11a2004c5..00000000000 --- a/spec/migrations/move_uploads_to_system_dir_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require "spec_helper" -require Rails.root.join("db", "migrate", "20170316163845_move_uploads_to_system_dir.rb") - -describe MoveUploadsToSystemDir do - let(:migration) { described_class.new } - let(:test_dir) { File.join(Rails.root, "tmp", "move_uploads_test") } - let(:uploads_dir) { File.join(test_dir, "public", "uploads") } - let(:new_uploads_dir) { File.join(uploads_dir, "-", "system") } - - before do - FileUtils.remove_dir(test_dir) if File.directory?(test_dir) - FileUtils.mkdir_p(uploads_dir) - allow(migration).to receive(:base_directory).and_return(test_dir) - allow(migration).to receive(:say) - end - - describe "#up" do - before do - FileUtils.mkdir_p(File.join(uploads_dir, 'user')) - FileUtils.touch(File.join(uploads_dir, 'user', 'dummy.file')) - end - - it 'moves the directory to the new path' do - expected_path = File.join(new_uploads_dir, 'user', 'dummy.file') - - migration.up - - expect(File.exist?(expected_path)).to be(true) - end - - it 'creates a symlink in the old location' do - symlink_path = File.join(uploads_dir, 'user') - expected_path = File.join(symlink_path, 'dummy.file') - - migration.up - - expect(File.exist?(expected_path)).to be(true) - expect(File.symlink?(symlink_path)).to be(true) - end - end - - describe "#down" do - before do - FileUtils.mkdir_p(File.join(new_uploads_dir, 'user')) - FileUtils.touch(File.join(new_uploads_dir, 'user', 'dummy.file')) - end - - it 'moves the directory to the old path' do - expected_path = File.join(uploads_dir, 'user', 'dummy.file') - - migration.down - - expect(File.exist?(expected_path)).to be(true) - end - - it 'removes the symlink if it existed' do - FileUtils.ln_s(File.join(new_uploads_dir, 'user'), File.join(uploads_dir, 'user')) - - directory = File.join(uploads_dir, 'user') - expected_path = File.join(directory, 'dummy.file') - - migration.down - - expect(File.exist?(expected_path)).to be(true) - expect(File.symlink?(directory)).to be(false) - end - end -end diff --git a/spec/migrations/normalize_ldap_extern_uids_spec.rb b/spec/migrations/normalize_ldap_extern_uids_spec.rb deleted file mode 100644 index a23a5d54e0a..00000000000 --- a/spec/migrations/normalize_ldap_extern_uids_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170921101004_normalize_ldap_extern_uids') - -describe NormalizeLdapExternUids, :migration, :sidekiq do - let!(:identities) { table(:identities) } - - around do |example| - Timecop.freeze { example.run } - end - - before do - stub_const("Gitlab::Database::MigrationHelpers::BACKGROUND_MIGRATION_BATCH_SIZE", 2) - stub_const("Gitlab::Database::MigrationHelpers::BACKGROUND_MIGRATION_JOB_BUFFER_SIZE", 2) - - # LDAP identities - (1..4).each do |i| - identities.create!(id: i, provider: 'ldapmain', extern_uid: " uid = foo #{i}, ou = People, dc = example, dc = com ", user_id: i) - end - - # Non-LDAP identity - identities.create!(id: 5, provider: 'foo', extern_uid: " uid = foo 5, ou = People, dc = example, dc = com ", user_id: 5) - end - - it 'correctly schedules background migrations' do - Sidekiq::Testing.fake! do - Timecop.freeze do - migrate! - - expect(BackgroundMigrationWorker.jobs[0]['args']).to eq([described_class::MIGRATION, [1, 2]]) - expect(BackgroundMigrationWorker.jobs[0]['at']).to eq(2.minutes.from_now.to_f) - expect(BackgroundMigrationWorker.jobs[1]['args']).to eq([described_class::MIGRATION, [3, 4]]) - expect(BackgroundMigrationWorker.jobs[1]['at']).to eq(4.minutes.from_now.to_f) - expect(BackgroundMigrationWorker.jobs[2]['args']).to eq([described_class::MIGRATION, [5, 5]]) - expect(BackgroundMigrationWorker.jobs[2]['at']).to eq(6.minutes.from_now.to_f) - expect(BackgroundMigrationWorker.jobs.size).to eq 3 - end - end - end - - it 'migrates the LDAP identities' do - perform_enqueued_jobs do - migrate! - identities.where(id: 1..4).each do |identity| - expect(identity.extern_uid).to eq("uid=foo #{identity.id},ou=people,dc=example,dc=com") - end - end - end - - it 'does not modify non-LDAP identities' do - perform_enqueued_jobs do - migrate! - identity = identities.last - expect(identity.extern_uid).to eq(" uid = foo 5, ou = People, dc = example, dc = com ") - end - end -end diff --git a/spec/migrations/populate_can_push_from_deploy_keys_projects_spec.rb b/spec/migrations/populate_can_push_from_deploy_keys_projects_spec.rb deleted file mode 100644 index 0ff98933d5c..00000000000 --- a/spec/migrations/populate_can_push_from_deploy_keys_projects_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20171215113714_populate_can_push_from_deploy_keys_projects.rb') - -describe PopulateCanPushFromDeployKeysProjects, :migration do - let(:migration) { described_class.new } - let(:deploy_keys) { table(:keys) } - let(:deploy_keys_projects) { table(:deploy_keys_projects) } - let(:projects) { table(:projects) } - - before do - deploy_keys.inheritance_column = nil - - projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1') - (1..10).each do |index| - deploy_keys.create!(id: index, title: 'dummy', type: 'DeployKey', key: Spec::Support::Helpers::KeyGeneratorHelper.new(1024).generate + ' dummy@gitlab.com') - deploy_keys_projects.create!(id: index, deploy_key_id: index, project_id: 1) - end - end - - describe '#up' do - it 'migrates can_push from deploy_keys to deploy_keys_projects' do - deploy_keys.limit(5).update_all(can_push: true) - - expected = deploy_keys.order(:id).pluck(:id, :can_push) - - migration.up - - expect(deploy_keys_projects.order(:id).pluck(:deploy_key_id, :can_push)).to eq expected - end - end - - describe '#down' do - it 'migrates can_push from deploy_keys_projects to deploy_keys' do - deploy_keys_projects.limit(5).update_all(can_push: true) - - expected = deploy_keys_projects.order(:id).pluck(:deploy_key_id, :can_push) - - migration.down - - expect(deploy_keys.order(:id).pluck(:id, :can_push)).to eq expected - end - end -end diff --git a/spec/migrations/remove_assignee_id_from_issue_spec.rb b/spec/migrations/remove_assignee_id_from_issue_spec.rb deleted file mode 100644 index 2c6f992d3ae..00000000000 --- a/spec/migrations/remove_assignee_id_from_issue_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170523073948_remove_assignee_id_from_issue.rb') - -describe RemoveAssigneeIdFromIssue, :migration do - let(:issues) { table(:issues) } - let(:issue_assignees) { table(:issue_assignees) } - let(:users) { table(:users) } - - let!(:user_1) { users.create(email: 'email1@example.com') } - let!(:user_2) { users.create(email: 'email2@example.com') } - let!(:user_3) { users.create(email: 'email3@example.com') } - - def create_issue(assignees:) - issues.create.tap do |issue| - assignees.each do |assignee| - issue_assignees.create(issue_id: issue.id, user_id: assignee.id) - end - end - end - - let!(:issue_single_assignee) { create_issue(assignees: [user_1]) } - let!(:issue_no_assignee) { create_issue(assignees: []) } - let!(:issue_multiple_assignees) { create_issue(assignees: [user_2, user_3]) } - - describe '#down' do - it 'sets the assignee_id to a random matching assignee from the assignees table' do - migrate! - disable_migrations_output { described_class.new.down } - - expect(issue_single_assignee.reload.assignee_id).to eq(user_1.id) - expect(issue_no_assignee.reload.assignee_id).to be_nil - expect(issue_multiple_assignees.reload.assignee_id).to eq(user_2.id).or(user_3.id) - - disable_migrations_output { described_class.new.up } - end - end -end diff --git a/spec/migrations/remove_dot_git_from_usernames_spec.rb b/spec/migrations/remove_dot_git_from_usernames_spec.rb deleted file mode 100644 index f11880a83e9..00000000000 --- a/spec/migrations/remove_dot_git_from_usernames_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20161226122833_remove_dot_git_from_usernames.rb') - -describe RemoveDotGitFromUsernames do - let(:user) { create(:user) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let(:migration) { described_class.new } - - describe '#up' do - before do - update_namespace(user, 'test.git') - end - - it 'renames user with .git in username' do - migration.up - - expect(user.reload.username).to eq('test_git') - expect(user.namespace.reload.path).to eq('test_git') - expect(user.namespace.route.path).to eq('test_git') - end - end - - context 'when new path exists already' do - describe '#up' do - let(:user2) { create(:user) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - - before do - update_namespace(user, 'test.git') - update_namespace(user2, 'test_git') - - default_hash = Gitlab.config.repositories.storages.default.to_h - default_hash['path'] = 'tmp/tests/custom_repositories' - storages = { 'default' => Gitlab::GitalyClient::StorageSettings.new(default_hash) } - - allow(Gitlab.config.repositories).to receive(:storages).and_return(storages) - allow(migration).to receive(:route_exists?).with('test_git').and_return(true) - allow(migration).to receive(:route_exists?).with('test_git1').and_return(false) - end - - it 'renames user with .git in username' do - migration.up - - expect(user.reload.username).to eq('test_git1') - expect(user.namespace.reload.path).to eq('test_git1') - expect(user.namespace.route.path).to eq('test_git1') - end - end - end - - def update_namespace(user, path) - namespace = user.namespace - namespace.path = path - namespace.save!(validate: false) - - user.update_column(:username, path) - end -end diff --git a/spec/migrations/remove_duplicate_mr_events_spec.rb b/spec/migrations/remove_duplicate_mr_events_spec.rb deleted file mode 100644 index 2509ac6afd6..00000000000 --- a/spec/migrations/remove_duplicate_mr_events_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170815060945_remove_duplicate_mr_events.rb') - -describe RemoveDuplicateMrEvents, :delete do - let(:migration) { described_class.new } - - describe '#up' do - let(:user) { create(:user) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let(:merge_requests) { create_list(:merge_request, 2) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let(:issue) { create(:issue) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:events) do - [ - create(:event, :created, author: user, target: merge_requests.first), # rubocop:disable RSpec/FactoriesInMigrationSpecs - create(:event, :created, author: user, target: merge_requests.first), # rubocop:disable RSpec/FactoriesInMigrationSpecs - create(:event, :updated, author: user, target: merge_requests.first), # rubocop:disable RSpec/FactoriesInMigrationSpecs - create(:event, :created, author: user, target: merge_requests.second), # rubocop:disable RSpec/FactoriesInMigrationSpecs - create(:event, :created, author: user, target: issue), # rubocop:disable RSpec/FactoriesInMigrationSpecs - create(:event, :created, author: user, target: issue) # rubocop:disable RSpec/FactoriesInMigrationSpecs - ] - end - - it 'removes duplicated merge request create records' do - expect { migration.up }.to change { Event.count }.from(6).to(5) - end - end -end diff --git a/spec/migrations/remove_empty_fork_networks_spec.rb b/spec/migrations/remove_empty_fork_networks_spec.rb deleted file mode 100644 index f6d030ab25c..00000000000 --- a/spec/migrations/remove_empty_fork_networks_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20171114104051_remove_empty_fork_networks.rb') - -describe RemoveEmptyForkNetworks, :migration do - let!(:fork_networks) { table(:fork_networks) } - let!(:projects) { table(:projects) } - let!(:fork_network_members) { table(:fork_network_members) } - - let(:deleted_project) { projects.create! } - let!(:empty_network) { fork_networks.create!(id: 1, root_project_id: deleted_project.id) } - let!(:other_network) { fork_networks.create!(id: 2, root_project_id: projects.create.id) } - - before do - fork_network_members.create(fork_network_id: empty_network.id, - project_id: empty_network.root_project_id) - fork_network_members.create(fork_network_id: other_network.id, - project_id: other_network.root_project_id) - - deleted_project.destroy! - end - - after do - Upload.reset_column_information - end - - it 'deletes only the fork network without members' do - expect(fork_networks.count).to eq(2) - - migrate! - - expect(fork_networks.find_by(id: empty_network.id)).to be_nil - expect(fork_networks.find_by(id: other_network.id)).not_to be_nil - expect(fork_networks.count).to eq(1) - end -end diff --git a/spec/migrations/rename_duplicated_variable_key_spec.rb b/spec/migrations/rename_duplicated_variable_key_spec.rb deleted file mode 100644 index 11096564dfa..00000000000 --- a/spec/migrations/rename_duplicated_variable_key_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170622135451_rename_duplicated_variable_key.rb') - -describe RenameDuplicatedVariableKey, :migration do - let(:variables) { table(:ci_variables) } - let(:projects) { table(:projects) } - - before do - projects.create!(id: 1) - variables.create!(id: 1, key: 'key1', project_id: 1) - variables.create!(id: 2, key: 'key2', project_id: 1) - variables.create!(id: 3, key: 'keyX', project_id: 1) - variables.create!(id: 4, key: 'keyX', project_id: 1) - variables.create!(id: 5, key: 'keyY', project_id: 1) - variables.create!(id: 6, key: 'keyX', project_id: 1) - variables.create!(id: 7, key: 'key7', project_id: 1) - variables.create!(id: 8, key: 'keyY', project_id: 1) - end - - it 'correctly remove duplicated records with smaller id' do - migrate! - - expect(variables.pluck(:id, :key)).to contain_exactly( - [1, 'key1'], - [2, 'key2'], - [3, 'keyX_3'], - [4, 'keyX_4'], - [5, 'keyY_5'], - [6, 'keyX'], - [7, 'key7'], - [8, 'keyY'] - ) - end -end diff --git a/spec/migrations/rename_more_reserved_project_names_spec.rb b/spec/migrations/rename_more_reserved_project_names_spec.rb deleted file mode 100644 index 80ae209e9d1..00000000000 --- a/spec/migrations/rename_more_reserved_project_names_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170313133418_rename_more_reserved_project_names.rb') - -# This migration uses multiple threads, and thus different transactions. This -# means data created in this spec may not be visible to some threads. To work -# around this we use the DELETE cleaning strategy. -describe RenameMoreReservedProjectNames, :delete do - let(:migration) { described_class.new } - let!(:project) { create(:project) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - - before do - project.path = 'artifacts' - project.save!(validate: false) - end - - describe '#up' do - context 'when project repository exists' do - before do - project.create_repository - end - - context 'when no exception is raised' do - it 'renames project with reserved names' do - migration.up - - expect(project.reload.path).to eq('artifacts0') - end - end - - context 'when exception is raised during rename' do - before do - service = instance_double('service') - - allow(service) - .to receive(:execute) - .and_raise(Projects::AfterRenameService::RenameFailedError) - - expect(migration) - .to receive(:after_rename_service) - .and_return(service) - end - - it 'captures exception from project rename' do - expect { migration.up }.not_to raise_error - end - end - end - - context 'when project repository does not exist' do - it 'does not raise error' do - expect { migration.up }.not_to raise_error - end - end - end -end diff --git a/spec/migrations/rename_reserved_project_names_spec.rb b/spec/migrations/rename_reserved_project_names_spec.rb deleted file mode 100644 index 93e5c032287..00000000000 --- a/spec/migrations/rename_reserved_project_names_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -# encoding: utf-8 - -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20161221153951_rename_reserved_project_names.rb') - -# This migration is using factories, which set fields that don't actually -# exist in the DB schema previous to 20161221153951. Thus we just use the -# latest schema when testing this migration. -# This is ok-ish because: -# 1. This migration is a data migration -# 2. It only relies on very stable DB fields: routes.id, routes.path, namespaces.id, projects.namespace_id -# Ideally, the test should not use factories and rely on the `table` helper instead. -describe RenameReservedProjectNames, :migration, schema: :latest do - let(:migration) { described_class.new } - let!(:project) { create(:project) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - - before do - project.path = 'projects' - project.save!(validate: false) - end - - describe '#up' do - context 'when project repository exists' do - before do - project.create_repository - end - - context 'when no exception is raised' do - it 'renames project with reserved names' do - migration.up - - expect(project.reload.path).to eq('projects0') - end - end - - context 'when exception is raised during rename' do - before do - service = instance_double('service') - - allow(service) - .to receive(:execute) - .and_raise(Projects::AfterRenameService::RenameFailedError) - - expect(migration) - .to receive(:after_rename_service) - .and_return(service) - end - - it 'captures exception from project rename' do - expect { migration.up }.not_to raise_error - end - end - end - - context 'when project repository does not exist' do - it 'does not raise error' do - expect { migration.up }.not_to raise_error - end - end - end -end diff --git a/spec/migrations/rename_users_with_renamed_namespace_spec.rb b/spec/migrations/rename_users_with_renamed_namespace_spec.rb deleted file mode 100644 index b8a4dc2b2c0..00000000000 --- a/spec/migrations/rename_users_with_renamed_namespace_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170518200835_rename_users_with_renamed_namespace.rb') - -describe RenameUsersWithRenamedNamespace, :delete do - it 'renames a user that had their namespace renamed to the namespace path' do - other_user = create(:user, username: 'kodingu') # rubocop:disable RSpec/FactoriesInMigrationSpecs - other_user1 = create(:user, username: 'api0') # rubocop:disable RSpec/FactoriesInMigrationSpecs - - user = create(:user, username: "Users0") # rubocop:disable RSpec/FactoriesInMigrationSpecs - user.update_column(:username, 'Users') - user1 = create(:user, username: "import0") # rubocop:disable RSpec/FactoriesInMigrationSpecs - user1.update_column(:username, 'import') - - described_class.new.up - - expect(user.reload.username).to eq('Users0') - expect(user1.reload.username).to eq('import0') - - expect(other_user.reload.username).to eq('kodingu') - expect(other_user1.reload.username).to eq('api0') - end -end diff --git a/spec/migrations/schedule_merge_request_latest_merge_request_diff_id_migrations_spec.rb b/spec/migrations/schedule_merge_request_latest_merge_request_diff_id_migrations_spec.rb deleted file mode 100644 index 76fe16581ac..00000000000 --- a/spec/migrations/schedule_merge_request_latest_merge_request_diff_id_migrations_spec.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20171026082505_schedule_merge_request_latest_merge_request_diff_id_migrations') - -describe ScheduleMergeRequestLatestMergeRequestDiffIdMigrations, :migration, :sidekiq do - let(:projects_table) { table(:projects) } - let(:merge_requests_table) { table(:merge_requests) } - let(:merge_request_diffs_table) { table(:merge_request_diffs) } - - let(:project) { projects_table.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce') } - - let!(:merge_request_1) { create_mr!('mr_1', diffs: 1) } - let!(:merge_request_2) { create_mr!('mr_2', diffs: 2) } - let!(:merge_request_migrated) { create_mr!('merge_request_migrated', diffs: 3) } - let!(:merge_request_4) { create_mr!('mr_4', diffs: 3) } - - def create_mr!(name, diffs: 0) - merge_request = - merge_requests_table.create!(target_project_id: project.id, - target_branch: 'master', - source_project_id: project.id, - source_branch: name, - title: name) - - diffs.times do - merge_request_diffs_table.create!(merge_request_id: merge_request.id) - end - - merge_request - end - - def diffs_for(merge_request) - merge_request_diffs_table.where(merge_request_id: merge_request.id) - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - - diff_id = diffs_for(merge_request_migrated).minimum(:id) - merge_request_migrated.update!(latest_merge_request_diff_id: diff_id) - end - - it 'correctly schedules background migrations' do - Sidekiq::Testing.fake! do - Timecop.freeze do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, merge_request_1.id, merge_request_1.id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(10.minutes, merge_request_2.id, merge_request_2.id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(15.minutes, merge_request_4.id, merge_request_4.id) - expect(BackgroundMigrationWorker.jobs.size).to eq 3 - end - end - end - - it 'schedules background migrations' do - perform_enqueued_jobs do - expect(merge_requests_table.where(latest_merge_request_diff_id: nil).count).to eq 3 - - migrate! - - expect(merge_requests_table.where(latest_merge_request_diff_id: nil).count).to eq 0 - end - end -end diff --git a/spec/migrations/track_untracked_uploads_spec.rb b/spec/migrations/track_untracked_uploads_spec.rb deleted file mode 100644 index 2fccfb3f12c..00000000000 --- a/spec/migrations/track_untracked_uploads_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20171103140253_track_untracked_uploads') - -describe TrackUntrackedUploads, :migration, :sidekiq do - include MigrationsHelpers::TrackUntrackedUploadsHelpers - - it 'correctly schedules the follow-up background migration' do - Sidekiq::Testing.fake! do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_migration - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - end - end -end diff --git a/spec/migrations/turn_nested_groups_into_regular_groups_for_mysql_spec.rb b/spec/migrations/turn_nested_groups_into_regular_groups_for_mysql_spec.rb deleted file mode 100644 index 5f5ba426d69..00000000000 --- a/spec/migrations/turn_nested_groups_into_regular_groups_for_mysql_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'migrate', '20170503140202_turn_nested_groups_into_regular_groups_for_mysql.rb') - -describe TurnNestedGroupsIntoRegularGroupsForMysql do - let!(:parent_group) { create(:group) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:child_group) { create(:group, parent: parent_group) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:project) { create(:project, :legacy_storage, :empty_repo, namespace: child_group) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:member) { create(:user) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let(:migration) { described_class.new } - - before do - parent_group.add_developer(member) - - allow(migration).to receive(:run_migration?).and_return(true) - allow(migration).to receive(:verbose).and_return(false) - end - - describe '#up' do - let(:updated_project) do - # path_with_namespace is memoized in an instance variable so we retrieve a - # new row here to work around that. - Project.find(project.id) - end - - before do - migration.up - end - - it 'unsets the parent_id column' do - expect(Namespace.where('parent_id IS NOT NULL').any?).to eq(false) - end - - it 'adds members of parent groups as members to the migrated group' do - is_member = child_group.members - .where(user_id: member, access_level: Gitlab::Access::DEVELOPER).any? - - expect(is_member).to eq(true) - end - - it 'update the path of the nested group' do - child_group.reload - - expect(child_group.path).to eq("#{parent_group.name}-#{child_group.name}") - end - - it 'renames projects of the nested group' do - expect(updated_project.full_path) - .to eq("#{parent_group.name}-#{child_group.name}/#{updated_project.path}") - end - - it 'renames the repository of any projects' do - repo_path = Gitlab::GitalyClient::StorageSettings.allow_disk_access do - updated_project.repository.path - end - - expect(repo_path) - .to end_with("#{parent_group.name}-#{child_group.name}/#{updated_project.path}.git") - - expect(File.directory?(repo_path)).to eq(true) - end - - it 'creates a redirect route for renamed projects' do - exists = RedirectRoute - .where(source_type: 'Project', source_id: project.id) - .any? - - expect(exists).to eq(true) - end - end -end diff --git a/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb b/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb deleted file mode 100644 index d625b60ff50..00000000000 --- a/spec/migrations/update_legacy_diff_notes_type_for_import_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170927112318_update_legacy_diff_notes_type_for_import.rb') - -describe UpdateLegacyDiffNotesTypeForImport, :migration do - let(:notes) { table(:notes) } - - before do - notes.inheritance_column = nil - - notes.create(type: 'Note') - notes.create(type: 'LegacyDiffNote') - notes.create(type: 'Github::Import::Note') - notes.create(type: 'Github::Import::LegacyDiffNote') - end - - it 'updates the notes type' do - migrate! - - expect(notes.pluck(:type)) - .to contain_exactly('Note', 'Github::Import::Note', 'LegacyDiffNote', 'LegacyDiffNote') - end -end diff --git a/spec/migrations/update_notes_type_for_import_spec.rb b/spec/migrations/update_notes_type_for_import_spec.rb deleted file mode 100644 index 06195d970d8..00000000000 --- a/spec/migrations/update_notes_type_for_import_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170927112319_update_notes_type_for_import.rb') - -describe UpdateNotesTypeForImport, :migration do - let(:notes) { table(:notes) } - - before do - notes.inheritance_column = nil - - notes.create(type: 'Note') - notes.create(type: 'LegacyDiffNote') - notes.create(type: 'Github::Import::Note') - notes.create(type: 'Github::Import::LegacyDiffNote') - end - - it 'updates the notes type' do - migrate! - - expect(notes.pluck(:type)) - .to contain_exactly('Note', 'Note', 'LegacyDiffNote', 'Github::Import::LegacyDiffNote') - end -end diff --git a/spec/migrations/update_retried_for_ci_build_spec.rb b/spec/migrations/update_retried_for_ci_build_spec.rb deleted file mode 100644 index 637dcbb8e01..00000000000 --- a/spec/migrations/update_retried_for_ci_build_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170503004427_update_retried_for_ci_build.rb') - -describe UpdateRetriedForCiBuild, :delete do - let(:pipeline) { create(:ci_pipeline) } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:build_old) { create(:ci_build, pipeline: pipeline, name: 'test') } # rubocop:disable RSpec/FactoriesInMigrationSpecs - let!(:build_new) { create(:ci_build, pipeline: pipeline, name: 'test') } # rubocop:disable RSpec/FactoriesInMigrationSpecs - - before do - described_class.new.up - end - - it 'updates ci_builds.is_retried' do - expect(build_old.reload).to be_retried - expect(build_new.reload).not_to be_retried - end -end diff --git a/spec/migrations/update_upload_paths_to_system_spec.rb b/spec/migrations/update_upload_paths_to_system_spec.rb deleted file mode 100644 index 984b428a020..00000000000 --- a/spec/migrations/update_upload_paths_to_system_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'spec_helper' -require Rails.root.join('db', 'post_migrate', '20170317162059_update_upload_paths_to_system.rb') - -describe UpdateUploadPathsToSystem, :migration do - let(:migration) { described_class.new } - let(:uploads_table) { table(:uploads) } - let(:base_upload_attributes) { { size: 42, uploader: 'John Doe' } } - - before do - allow(migration).to receive(:say) - end - - describe '#uploads_to_switch_to_new_path' do - it 'contains only uploads with the old path for the correct models' do - _upload_for_other_type = create_upload('Pipeline', 'uploads/ci_pipeline/avatar.jpg') - _upload_with_system_path = create_upload('Project', 'uploads/-/system/project/avatar.jpg') - _upload_with_other_path = create_upload('Project', 'thelongsecretforafileupload/avatar.jpg') - old_upload = create_upload('Project', 'uploads/project/avatar.jpg') - group_upload = create_upload('Namespace', 'uploads/group/avatar.jpg') - - expect(uploads_table.where(migration.uploads_to_switch_to_new_path)).to contain_exactly(old_upload, group_upload) - end - end - - describe '#uploads_to_switch_to_old_path' do - it 'contains only uploads with the new path for the correct models' do - _upload_for_other_type = create_upload('Pipeline', 'uploads/ci_pipeline/avatar.jpg') - upload_with_system_path = create_upload('Project', 'uploads/-/system/project/avatar.jpg') - _upload_with_other_path = create_upload('Project', 'thelongsecretforafileupload/avatar.jpg') - _old_upload = create_upload('Project', 'uploads/project/avatar.jpg') - - expect(uploads_table.where(migration.uploads_to_switch_to_old_path)).to contain_exactly(upload_with_system_path) - end - end - - describe '#up' do - it 'updates old upload records to the new path' do - old_upload = create_upload('Project', 'uploads/project/avatar.jpg') - - migration.up - - expect(old_upload.reload.path).to eq('uploads/-/system/project/avatar.jpg') - end - end - - describe '#down' do - it 'updates the new system patsh to the old paths' do - new_upload = create_upload('Project', 'uploads/-/system/project/avatar.jpg') - - migration.down - - expect(new_upload.reload.path).to eq('uploads/project/avatar.jpg') - end - end - - def create_upload(type, path) - uploads_table.create(base_upload_attributes.merge(model_type: type, path: path)) - end -end diff --git a/spec/models/clusters/applications/ingress_spec.rb b/spec/models/clusters/applications/ingress_spec.rb index 292ddabd2d8..057517d3820 100644 --- a/spec/models/clusters/applications/ingress_spec.rb +++ b/spec/models/clusters/applications/ingress_spec.rb @@ -21,7 +21,21 @@ describe Clusters::Applications::Ingress do describe '#can_uninstall?' do subject { ingress.can_uninstall? } - it { is_expected.to be_falsey } + it 'returns true if application_jupyter_nil_or_installable? AND external_ip_or_hostname? are true' do + ingress.external_ip = 'IP' + + is_expected.to be_truthy + end + + it 'returns false if application_jupyter_nil_or_installable? is false' do + create(:clusters_applications_jupyter, :installed, cluster: ingress.cluster) + + is_expected.to be_falsey + end + + it 'returns false if external_ip_or_hostname? is false' do + is_expected.to be_falsey + end end describe '#make_installed!' do diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb index 2fe82eaa778..8d951ab6f0f 100644 --- a/spec/models/deploy_token_spec.rb +++ b/spec/models/deploy_token_spec.rb @@ -8,6 +8,15 @@ describe DeployToken do it { is_expected.to have_many :project_deploy_tokens } it { is_expected.to have_many(:projects).through(:project_deploy_tokens) } + describe 'validations' do + let(:username_format_message) { "can contain only letters, digits, '_', '-', '+', and '.'" } + + it { is_expected.to validate_length_of(:username).is_at_most(255) } + it { is_expected.to allow_value('GitLab+deploy_token-3.14').for(:username) } + it { is_expected.not_to allow_value('<script>').for(:username).with_message(username_format_message) } + it { is_expected.not_to allow_value('').for(:username).with_message(username_format_message) } + end + describe '#ensure_token' do it 'ensures a token' do deploy_token.token = nil @@ -87,8 +96,30 @@ describe DeployToken do end describe '#username' do - it 'returns a harcoded username' do - expect(deploy_token.username).to eq("gitlab+deploy-token-#{deploy_token.id}") + context 'persisted records' do + it 'returns a default username if none is set' do + expect(deploy_token.username).to eq("gitlab+deploy-token-#{deploy_token.id}") + end + + it 'returns the username provided if one is set' do + deploy_token = create(:deploy_token, username: 'deployer') + + expect(deploy_token.username).to eq('deployer') + end + end + + context 'new records' do + it 'returns nil if no username is set' do + deploy_token = build(:deploy_token) + + expect(deploy_token.username).to be_nil + end + + it 'returns the username provided if one is set' do + deploy_token = build(:deploy_token, username: 'deployer') + + expect(deploy_token.username).to eq('deployer') + end end end diff --git a/spec/models/namespace/aggregation_schedule_spec.rb b/spec/models/namespace/aggregation_schedule_spec.rb index 5ba7547ff4d..8ed0248e1b2 100644 --- a/spec/models/namespace/aggregation_schedule_spec.rb +++ b/spec/models/namespace/aggregation_schedule_spec.rb @@ -2,6 +2,77 @@ require 'spec_helper' -RSpec.describe Namespace::AggregationSchedule, type: :model do +RSpec.describe Namespace::AggregationSchedule, :clean_gitlab_redis_shared_state, type: :model do + include ExclusiveLeaseHelpers + it { is_expected.to belong_to :namespace } + + describe '.delay_timeout' do + context 'when timeout is set on redis' do + it 'uses personalized timeout' do + Gitlab::Redis::SharedState.with do |redis| + redis.set(described_class::REDIS_SHARED_KEY, 1.hour) + end + + expect(described_class.delay_timeout).to eq(1.hour) + end + end + + context 'when timeout is not set on redis' do + it 'uses default timeout' do + expect(described_class.delay_timeout).to eq(3.hours) + end + end + end + + describe '#schedule_root_storage_statistics' do + let(:namespace) { create(:namespace) } + let(:aggregation_schedule) { namespace.build_aggregation_schedule } + let(:lease_key) { "namespace:namespaces_root_statistics:#{namespace.id}" } + + context "when we can't obtain the lease" do + it 'does not schedule the workers' do + stub_exclusive_lease_taken(lease_key, timeout: described_class::DEFAULT_LEASE_TIMEOUT) + + expect(Namespaces::RootStatisticsWorker) + .not_to receive(:perform_async) + + expect(Namespaces::RootStatisticsWorker) + .not_to receive(:perform_in) + + aggregation_schedule.save! + end + end + + context 'when we can obtain the lease' do + it 'schedules a root storage statistics after create' do + stub_exclusive_lease(lease_key, timeout: described_class::DEFAULT_LEASE_TIMEOUT) + + expect(Namespaces::RootStatisticsWorker) + .to receive(:perform_async).once + + expect(Namespaces::RootStatisticsWorker) + .to receive(:perform_in).once + .with(described_class::DEFAULT_LEASE_TIMEOUT, aggregation_schedule.namespace_id ) + + aggregation_schedule.save! + end + end + + context 'with a personalized lease timeout' do + before do + Gitlab::Redis::SharedState.with do |redis| + redis.set(described_class::REDIS_SHARED_KEY, 1.hour) + end + end + + it 'uses a personalized time' do + expect(Namespaces::RootStatisticsWorker) + .to receive(:perform_in) + .with(1.hour, aggregation_schedule.namespace_id) + + aggregation_schedule.save! + end + end + end end diff --git a/spec/models/namespace/root_storage_statistics_spec.rb b/spec/models/namespace/root_storage_statistics_spec.rb index f6fb5af5aae..3229a32234e 100644 --- a/spec/models/namespace/root_storage_statistics_spec.rb +++ b/spec/models/namespace/root_storage_statistics_spec.rb @@ -7,4 +7,69 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do it { is_expected.to have_one(:route).through(:namespace) } it { is_expected.to delegate_method(:all_projects).to(:namespace) } + + describe '#recalculate!' do + let(:namespace) { create(:group) } + let(:root_storage_statistics) { create(:namespace_root_storage_statistics, namespace: namespace) } + + let(:project1) { create(:project, namespace: namespace) } + let(:project2) { create(:project, namespace: namespace) } + + let!(:stat1) { create(:project_statistics, project: project1, with_data: true, size_multiplier: 100) } + let!(:stat2) { create(:project_statistics, project: project2, with_data: true, size_multiplier: 200) } + + shared_examples 'data refresh' do + it 'aggregates project statistics' do + root_storage_statistics.recalculate! + + root_storage_statistics.reload + + total_repository_size = stat1.repository_size + stat2.repository_size + total_wiki_size = stat1.wiki_size + stat2.wiki_size + total_lfs_objects_size = stat1.lfs_objects_size + stat2.lfs_objects_size + total_build_artifacts_size = stat1.build_artifacts_size + stat2.build_artifacts_size + total_packages_size = stat1.packages_size + stat2.packages_size + total_storage_size = stat1.storage_size + stat2.storage_size + + expect(root_storage_statistics.repository_size).to eq(total_repository_size) + expect(root_storage_statistics.wiki_size).to eq(total_wiki_size) + expect(root_storage_statistics.lfs_objects_size).to eq(total_lfs_objects_size) + expect(root_storage_statistics.build_artifacts_size).to eq(total_build_artifacts_size) + expect(root_storage_statistics.packages_size).to eq(total_packages_size) + expect(root_storage_statistics.storage_size).to eq(total_storage_size) + end + + it 'works when there are no projects' do + Project.delete_all + + root_storage_statistics.recalculate! + + root_storage_statistics.reload + expect(root_storage_statistics.repository_size).to eq(0) + expect(root_storage_statistics.wiki_size).to eq(0) + expect(root_storage_statistics.lfs_objects_size).to eq(0) + expect(root_storage_statistics.build_artifacts_size).to eq(0) + expect(root_storage_statistics.packages_size).to eq(0) + expect(root_storage_statistics.storage_size).to eq(0) + end + end + + it_behaves_like 'data refresh' + + context 'with subgroups', :nested_groups do + let(:subgroup1) { create(:group, parent: namespace)} + let(:subgroup2) { create(:group, parent: subgroup1)} + + let(:project1) { create(:project, namespace: subgroup1) } + let(:project2) { create(:project, namespace: subgroup2) } + + it_behaves_like 'data refresh' + end + + context 'with a personal namespace' do + let(:namespace) { create(:user).namespace } + + it_behaves_like 'data refresh' + end + end end diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index 30e49cf204f..f908f3504e0 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -837,4 +837,20 @@ describe Namespace do it { is_expected.to be_falsy } end end + + describe '#aggregation_scheduled?' do + let(:namespace) { create(:namespace) } + + subject { namespace.aggregation_scheduled? } + + context 'with an aggregation scheduled association' do + let(:namespace) { create(:namespace, :with_aggregation_schedule) } + + it { is_expected.to be_truthy } + end + + context 'without an aggregation scheduled association' do + it { is_expected.to be_falsy } + end + end end diff --git a/spec/models/project_services/bugzilla_service_spec.rb b/spec/models/project_services/bugzilla_service_spec.rb index 6818db48fee..d5b0f94f461 100644 --- a/spec/models/project_services/bugzilla_service_spec.rb +++ b/spec/models/project_services/bugzilla_service_spec.rb @@ -32,4 +32,49 @@ describe BugzillaService do it { is_expected.not_to validate_presence_of(:new_issue_url) } end end + + context 'overriding properties' do + let(:default_title) { 'JIRA' } + let(:default_description) { 'JiraService|Jira issue tracker' } + let(:url) { 'http://bugzilla.example.com' } + let(:access_params) do + { project_url: url, issues_url: url, new_issue_url: url } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:bugzilla_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:bugzilla_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:bugzilla_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:bugzilla_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('Bugzilla') + expect(service.description).to eq('Bugzilla issue tracker') + end + end + end end diff --git a/spec/models/project_services/custom_issue_tracker_service_spec.rb b/spec/models/project_services/custom_issue_tracker_service_spec.rb index f0e7551693d..56b0bda6626 100644 --- a/spec/models/project_services/custom_issue_tracker_service_spec.rb +++ b/spec/models/project_services/custom_issue_tracker_service_spec.rb @@ -48,4 +48,47 @@ describe CustomIssueTrackerService do end end end + + context 'overriding properties' do + let(:url) { 'http://custom.example.com' } + let(:access_params) do + { project_url: url, issues_url: url, new_issue_url: url } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:custom_issue_tracker_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:custom_issue_tracker_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:custom_issue_tracker_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:custom_issue_tracker_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('Custom Issue Tracker') + expect(service.description).to eq('Custom issue tracker') + end + end + end end diff --git a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb b/spec/models/project_services/gitlab_issue_tracker_service_spec.rb index 11f96c03d46..a3726f09dc5 100644 --- a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb +++ b/spec/models/project_services/gitlab_issue_tracker_service_spec.rb @@ -51,4 +51,47 @@ describe GitlabIssueTrackerService do end end end + + context 'overriding properties' do + let(:url) { 'http://gitlab.example.com' } + let(:access_params) do + { project_url: url, issues_url: url, new_issue_url: url } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:gitlab_issue_tracker_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:gitlab_issue_tracker_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:gitlab_issue_tracker_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:gitlab_issue_tracker_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('GitLab') + expect(service.description).to eq('GitLab issue tracker') + end + end + end end diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index fc08457a3c5..9b122d85293 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -115,6 +115,70 @@ describe JiraService do end end + describe '#create' do + let(:params) do + { + project: create(:project), title: 'custom title', description: 'custom description' + } + end + + subject { described_class.create(params) } + + it 'does not store title & description into properties' do + expect(subject.properties.keys).not_to include('title', 'description') + end + + it 'sets title & description correctly' do + service = subject + + expect(service.title).to eq('custom title') + expect(service.description).to eq('custom description') + end + end + + context 'overriding properties' do + let(:url) { 'http://issue_tracker.example.com' } + let(:access_params) do + { url: url, username: 'username', password: 'password' } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:jira_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:jira_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:jira_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:jira_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('Jira') + expect(service.description).to eq('Jira issue tracker') + end + end + end + describe '#close_issue' do let(:custom_base_url) { 'http://custom_url' } let(:user) { create(:user) } @@ -450,36 +514,54 @@ describe JiraService do end describe 'description and title' do - let(:project) { create(:project) } + let(:title) { 'Jira One' } + let(:description) { 'Jira One issue tracker' } + let(:properties) do + { + url: 'http://jira.example.com/web', + username: 'mic', + password: 'password', + title: title, + description: description + } + end context 'when it is not set' do - before do - @service = project.create_jira_service(active: true) - end + it 'default values are returned' do + service = create(:jira_service) - after do - @service.destroy! + expect(service.title).to eq('Jira') + expect(service.description).to eq('Jira issue tracker') end + end - it 'is initialized' do - expect(@service.title).to eq('Jira') - expect(@service.description).to eq('Jira issue tracker') + context 'when it is set in properties' do + it 'values from properties are returned' do + service = create(:jira_service, properties: properties) + + expect(service.title).to eq(title) + expect(service.description).to eq(description) end end - context 'when it is set' do - before do - properties = { 'title' => 'Jira One', 'description' => 'Jira One issue tracker' } - @service = project.create_jira_service(active: true, properties: properties) - end + context 'when it is in title & description fields' do + it 'values from title and description fields are returned' do + service = create(:jira_service, title: title, description: description) - after do - @service.destroy! + expect(service.title).to eq(title) + expect(service.description).to eq(description) end + end + + context 'when it is in both properites & title & description fields' do + it 'values from title and description fields are returned' do + title2 = 'Jira 2' + description2 = 'Jira description 2' - it 'is correct' do - expect(@service.title).to eq('Jira One') - expect(@service.description).to eq('Jira One issue tracker') + service = create(:jira_service, title: title2, description: description2, properties: properties) + + expect(service.title).to eq(title2) + expect(service.description).to eq(description2) end end end @@ -505,29 +587,21 @@ describe JiraService do end describe 'project and issue urls' do - let(:project) { create(:project) } - context 'when gitlab.yml was initialized' do - before do + it 'is prepopulated with the settings' do settings = { 'jira' => { - 'title' => 'Jira', 'url' => 'http://jira.sample/projects/project_a', 'api_url' => 'http://jira.sample/api' } } allow(Gitlab.config).to receive(:issues_tracker).and_return(settings) - @service = project.create_jira_service(active: true) - end - after do - @service.destroy! - end + project = create(:project) + service = project.create_jira_service(active: true) - it 'is prepopulated with the settings' do - expect(@service.properties['title']).to eq('Jira') - expect(@service.properties['url']).to eq('http://jira.sample/projects/project_a') - expect(@service.properties['api_url']).to eq('http://jira.sample/api') + expect(service.properties['url']).to eq('http://jira.sample/projects/project_a') + expect(service.properties['api_url']).to eq('http://jira.sample/api') end end end diff --git a/spec/models/project_services/redmine_service_spec.rb b/spec/models/project_services/redmine_service_spec.rb index ac570ac27e1..806e3695962 100644 --- a/spec/models/project_services/redmine_service_spec.rb +++ b/spec/models/project_services/redmine_service_spec.rb @@ -40,4 +40,47 @@ describe RedmineService do expect(described_class.reference_pattern.match('#123')[:issue]).to eq('123') end end + + context 'overriding properties' do + let(:url) { 'http://redmine.example.com' } + let(:access_params) do + { project_url: url, issues_url: url, new_issue_url: url } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:redmine_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:redmine_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:redmine_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:redmine_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('Redmine') + expect(service.description).to eq('Redmine issue tracker') + end + end + end end diff --git a/spec/models/project_services/youtrack_service_spec.rb b/spec/models/project_services/youtrack_service_spec.rb index bf9d892f66c..b47ef6702b4 100644 --- a/spec/models/project_services/youtrack_service_spec.rb +++ b/spec/models/project_services/youtrack_service_spec.rb @@ -37,4 +37,47 @@ describe YoutrackService do expect(described_class.reference_pattern.match('YT-123')[:issue]).to eq('YT-123') end end + + context 'overriding properties' do + let(:url) { 'http://youtrack.example.com' } + let(:access_params) do + { project_url: url, issues_url: url, new_issue_url: url } + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-ce/issues/63084 + context 'when data are stored in properties' do + let(:properties) { access_params.merge(title: title, description: description) } + let(:service) { create(:youtrack_service, properties: properties) } + + include_examples 'issue tracker fields' + end + + context 'when data are stored in separated fields' do + let(:service) do + create(:youtrack_service, title: title, description: description, properties: access_params) + end + + include_examples 'issue tracker fields' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { access_params.merge(title: 'wrong title', description: 'wrong description') } + let(:service) do + create(:youtrack_service, title: title, description: description, properties: properties) + end + + include_examples 'issue tracker fields' + end + + context 'when no title & description are set' do + let(:service) do + create(:youtrack_service, properties: access_params) + end + + it 'returns default values' do + expect(service.title).to eq('YouTrack') + expect(service.description).to eq('YouTrack issue tracker') + end + end + end end diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 7c106ce6b85..e9d846e7291 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -64,4 +64,14 @@ RSpec.describe Release do is_expected.to all(be_a(Releases::Source)) end end + + describe '#upcoming_release?' do + context 'during the backfill migration when released_at could be nil' do + it 'handles a nil released_at value and returns false' do + allow(release).to receive(:released_at).and_return nil + + expect(release.upcoming_release?).to eq(false) + end + end + end end diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb index d442c73c118..0797b9a9d83 100644 --- a/spec/models/service_spec.rb +++ b/spec/models/service_spec.rb @@ -244,7 +244,8 @@ describe Service do let(:service) do GitlabIssueTrackerService.create( project: create(:project), - title: 'random title' + title: 'random title', + project_url: 'http://gitlab.example.com' ) end @@ -252,8 +253,12 @@ describe Service do expect { service }.not_to raise_error end + it 'sets title correctly' do + expect(service.title).to eq('random title') + end + it 'creates the properties' do - expect(service.properties).to eq({ "title" => "random title" }) + expect(service.properties).to eq({ "project_url" => "http://gitlab.example.com" }) end end diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb index 8603fa2a73d..206e898381d 100644 --- a/spec/requests/api/releases_spec.rb +++ b/spec/requests/api/releases_spec.rb @@ -24,7 +24,7 @@ describe API::Releases do project: project, tag: 'v0.1', author: maintainer, - created_at: 2.days.ago) + released_at: 2.days.ago) end let!(:release_2) do @@ -32,7 +32,7 @@ describe API::Releases do project: project, tag: 'v0.2', author: maintainer, - created_at: 1.day.ago) + released_at: 1.day.ago) end it 'returns 200 HTTP status' do @@ -41,7 +41,7 @@ describe API::Releases do expect(response).to have_gitlab_http_status(:ok) end - it 'returns releases ordered by created_at' do + it 'returns releases ordered by released_at' do get api("/projects/#{project.id}/releases", maintainer) expect(json_response.count).to eq(2) @@ -56,6 +56,26 @@ describe API::Releases do end end + it 'returns an upcoming_release status for a future release' do + tomorrow = Time.now.utc + 1.day + create(:release, project: project, tag: 'v0.1', author: maintainer, released_at: tomorrow) + + get api("/projects/#{project.id}/releases", maintainer) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response.first['upcoming_release']).to eq(true) + end + + it 'returns an upcoming_release status for a past release' do + yesterday = Time.now.utc - 1.day + create(:release, project: project, tag: 'v0.1', author: maintainer, released_at: yesterday) + + get api("/projects/#{project.id}/releases", maintainer) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response.first['upcoming_release']).to eq(false) + end + context 'when tag does not exist in git repository' do let!(:release) { create(:release, project: project, tag: 'v1.1.5') } @@ -316,6 +336,51 @@ describe API::Releases do expect(project.releases.last.description).to eq('Super nice release') end + it 'sets the released_at to the current time if the released_at parameter is not provided' do + now = Time.zone.parse('2015-08-25 06:00:00Z') + Timecop.freeze(now) do + post api("/projects/#{project.id}/releases", maintainer), params: params + + expect(project.releases.last.released_at).to eq(now) + end + end + + it 'sets the released_at to the value in the parameters if specified' do + params = { + name: 'New release', + tag_name: 'v0.1', + description: 'Super nice release', + released_at: '2019-03-20T10:00:00Z' + } + post api("/projects/#{project.id}/releases", maintainer), params: params + + expect(project.releases.last.released_at).to eq('2019-03-20T10:00:00Z') + end + + it 'assumes the utc timezone for released_at if the timezone is not provided' do + params = { + name: 'New release', + tag_name: 'v0.1', + description: 'Super nice release', + released_at: '2019-03-25 10:00:00' + } + post api("/projects/#{project.id}/releases", maintainer), params: params + + expect(project.releases.last.released_at).to eq('2019-03-25T10:00:00Z') + end + + it 'allows specifying a released_at with a local time zone' do + params = { + name: 'New release', + tag_name: 'v0.1', + description: 'Super nice release', + released_at: '2019-03-25T10:00:00+09:00' + } + post api("/projects/#{project.id}/releases", maintainer), params: params + + expect(project.releases.last.released_at).to eq('2019-03-25T01:00:00Z') + end + context 'when description is empty' do let(:params) do { @@ -540,6 +605,7 @@ describe API::Releases do project: project, tag: 'v0.1', name: 'New release', + released_at: '2018-03-01T22:00:00Z', description: 'Super nice release') end @@ -560,6 +626,7 @@ describe API::Releases do expect(project.releases.last.tag).to eq('v0.1') expect(project.releases.last.name).to eq('New release') + expect(project.releases.last.released_at).to eq('2018-03-01T22:00:00Z') end it 'matches response schema' do @@ -568,6 +635,14 @@ describe API::Releases do expect(response).to match_response_schema('public_api/v4/release') end + it 'updates released_at' do + params = { released_at: '2015-10-10T05:00:00Z' } + + put api("/projects/#{project.id}/releases/v0.1", maintainer), params: params + + expect(project.releases.last.released_at).to eq('2015-10-10T05:00:00Z') + end + context 'when user tries to update sha' do let(:params) { { sha: 'xxx' } } diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb index 89adbc77a7f..d832963292c 100644 --- a/spec/requests/rack_attack_global_spec.rb +++ b/spec/requests/rack_attack_global_spec.rb @@ -102,6 +102,27 @@ describe 'Rack Attack global throttles' do expect_rejection { get(*get_args) } end + + it 'logs RackAttack info into structured logs' do + requests_per_period.times do + get(*get_args) + expect(response).to have_http_status 200 + end + + arguments = { + message: 'Rack_Attack', + env: :throttle, + ip: '127.0.0.1', + request_method: 'GET', + fullpath: get_args.first, + user_id: user.id, + username: user.username + } + + expect(Gitlab::AuthLogger).to receive(:error).with(arguments).once + + expect_rejection { get(*get_args) } + end end context 'when the throttle is disabled' do @@ -189,7 +210,15 @@ describe 'Rack Attack global throttles' do expect(response).to have_http_status 200 end - expect(Gitlab::AuthLogger).to receive(:error).once + arguments = { + message: 'Rack_Attack', + env: :throttle, + ip: '127.0.0.1', + request_method: 'GET', + fullpath: '/users/sign_in' + } + + expect(Gitlab::AuthLogger).to receive(:error).with(arguments) get url_that_does_not_require_authentication end @@ -345,7 +374,17 @@ describe 'Rack Attack global throttles' do expect(response).to have_http_status 200 end - expect(Gitlab::AuthLogger).to receive(:error).once + arguments = { + message: 'Rack_Attack', + env: :throttle, + ip: '127.0.0.1', + request_method: 'GET', + fullpath: '/dashboard/snippets', + user_id: user.id, + username: user.username + } + + expect(Gitlab::AuthLogger).to receive(:error).with(arguments).once get url_that_requires_authentication end diff --git a/spec/services/deploy_tokens/create_service_spec.rb b/spec/services/deploy_tokens/create_service_spec.rb index 886ffd4593d..fbb66fe4cb7 100644 --- a/spec/services/deploy_tokens/create_service_spec.rb +++ b/spec/services/deploy_tokens/create_service_spec.rb @@ -32,6 +32,22 @@ describe DeployTokens::CreateService do end end + context 'when username is empty string' do + let(:deploy_token_params) { attributes_for(:deploy_token, username: '') } + + it 'converts it to nil' do + expect(subject.read_attribute(:username)).to be_nil + end + end + + context 'when username is provided' do + let(:deploy_token_params) { attributes_for(:deploy_token, username: 'deployer') } + + it 'keeps the provided username' do + expect(subject.read_attribute(:username)).to eq('deployer') + end + end + context 'when the deploy token is invalid' do let(:deploy_token_params) { attributes_for(:deploy_token, read_repository: false, read_registry: false) } diff --git a/spec/services/namespaces/statistics_refresher_service_spec.rb b/spec/services/namespaces/statistics_refresher_service_spec.rb new file mode 100644 index 00000000000..f4d9c96f7f4 --- /dev/null +++ b/spec/services/namespaces/statistics_refresher_service_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Namespaces::StatisticsRefresherService, '#execute' do + let(:group) { create(:group) } + let(:projects) { create_list(:project, 5, namespace: group) } + let(:service) { described_class.new } + + context 'without a root storage statistics relation' do + it 'creates one' do + expect do + service.execute(group) + end.to change(Namespace::RootStorageStatistics, :count).by(1) + + expect(group.reload.root_storage_statistics).to be_present + end + + it 'recalculate the namespace statistics' do + expect_any_instance_of(Namespace::RootStorageStatistics).to receive(:recalculate!).once + + service.execute(group) + end + end + + context 'with a root storage statistics relation' do + before do + Namespace::AggregationSchedule.safe_find_or_create_by!(namespace_id: group.id) + end + + it 'does not create one' do + expect do + service.execute(group) + end.not_to change(Namespace::RootStorageStatistics, :count) + end + + it 'recalculate the namespace statistics' do + expect(Namespace::RootStorageStatistics) + .to receive(:safe_find_or_create_by!).with({ namespace_id: group.id }) + .and_return(group.root_storage_statistics) + + service.execute(group) + end + end + + context 'when something goes wrong' do + before do + allow_any_instance_of(Namespace::RootStorageStatistics) + .to receive(:recalculate!).and_raise(ActiveRecord::ActiveRecordError) + end + + it 'raises RefreshError' do + expect do + service.execute(group) + end.to raise_error(Namespaces::StatisticsRefresherService::RefresherError) + end + end +end diff --git a/spec/support/features/discussion_comments_shared_example.rb b/spec/support/features/discussion_comments_shared_example.rb index c4bf5da0cf0..7c8e57702ae 100644 --- a/spec/support/features/discussion_comments_shared_example.rb +++ b/spec/support/features/discussion_comments_shared_example.rb @@ -176,7 +176,7 @@ shared_examples 'thread comments' do |resource_name| if resource_name == 'merge request' let(:note_id) { find("#{comments_selector} .note:first-child", match: :first)['data-note-id'] } - let(:reply_id) { find("#{comments_selector} .note:last-child", match: :first)['data-note-id'] } + let(:reply_id) { find("#{comments_selector} .note:last-of-type", match: :first)['data-note-id'] } it 'can be replied to after resolving' do click_button "Resolve thread" diff --git a/spec/support/matchers/gitaly_matchers.rb b/spec/support/matchers/gitaly_matchers.rb index ebfabcd8f24..933ed22b5d0 100644 --- a/spec/support/matchers/gitaly_matchers.rb +++ b/spec/support/matchers/gitaly_matchers.rb @@ -9,6 +9,6 @@ end RSpec::Matchers.define :gitaly_request_with_params do |params| match do |actual| - params.reduce(true) { |r, (key, val)| r && actual.send(key) == val } + params.reduce(true) { |r, (key, val)| r && actual[key.to_s] == val } end end diff --git a/spec/support/shared_examples/models/services_fields_shared_examples.rb b/spec/support/shared_examples/models/services_fields_shared_examples.rb new file mode 100644 index 00000000000..6fbd0da9383 --- /dev/null +++ b/spec/support/shared_examples/models/services_fields_shared_examples.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +shared_examples 'issue tracker fields' do + let(:title) { 'custom title' } + let(:description) { 'custom description' } + let(:url) { 'http://issue_tracker.example.com' } + + context 'when data are stored in the properties' do + describe '#update' do + before do + service.update(title: 'new_title', description: 'new description') + end + + it 'removes title and description from properties' do + expect(service.reload.properties).not_to include('title', 'description') + end + + it 'stores title & description in services table' do + expect(service.read_attribute(:title)).to eq('new_title') + expect(service.read_attribute(:description)).to eq('new description') + end + end + + describe 'reading fields' do + it 'returns correct values' do + expect(service.title).to eq(title) + expect(service.description).to eq(description) + end + end + end +end diff --git a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb index 1b09c3dd636..aad63982e7a 100644 --- a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb +++ b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb @@ -25,16 +25,36 @@ shared_examples_for 'UpdateProjectStatistics' do .to change { reload_stat } .by(delta) end + + it 'schedules a namespace statistics worker' do + expect(Namespaces::ScheduleAggregationWorker) + .to receive(:perform_async).once + + subject.save! + end + + context 'when feature flag is disabled for the namespace' do + it 'does not schedules a namespace statistics worker' do + namespace = subject.project.root_ancestor + + stub_feature_flags(update_statistics_namespace: false, namespace: namespace) + + expect(Namespaces::ScheduleAggregationWorker) + .not_to receive(:perform_async) + + subject.save! + end + end end context 'when updating' do + let(:delta) { 42 } + before do subject.save! end it 'updates project statistics' do - delta = 42 - expect(ProjectStatistics) .to receive(:increment_statistic) .and_call_original @@ -45,6 +65,42 @@ shared_examples_for 'UpdateProjectStatistics' do .to change { reload_stat } .by(delta) end + + it 'schedules a namespace statistics worker' do + expect(Namespaces::ScheduleAggregationWorker) + .to receive(:perform_async).once + + subject.write_attribute(statistic_attribute, read_attribute + delta) + subject.save! + end + + it 'avoids N + 1 queries' do + subject.write_attribute(statistic_attribute, read_attribute + delta) + + control_count = ActiveRecord::QueryRecorder.new do + subject.save! + end + + subject.write_attribute(statistic_attribute, read_attribute + delta) + + expect do + subject.save! + end.not_to exceed_query_limit(control_count) + end + + context 'when the feature flag is disabled for the namespace' do + it 'does not schedule a namespace statistics worker' do + namespace = subject.project.root_ancestor + + stub_feature_flags(update_statistics_namespace: false, namespace: namespace) + + expect(Namespaces::ScheduleAggregationWorker) + .not_to receive(:perform_async) + + subject.write_attribute(statistic_attribute, read_attribute + delta) + subject.save! + end + end end context 'when destroying' do @@ -59,11 +115,18 @@ shared_examples_for 'UpdateProjectStatistics' do .to receive(:increment_statistic) .and_call_original - expect { subject.destroy } + expect { subject.destroy! } .to change { reload_stat } .by(delta) end + it 'schedules a namespace statistics worker' do + expect(Namespaces::ScheduleAggregationWorker) + .to receive(:perform_async).once + + subject.destroy! + end + context 'when it is destroyed from the project level' do it 'does not update the project statistics' do expect(ProjectStatistics) @@ -72,6 +135,27 @@ shared_examples_for 'UpdateProjectStatistics' do project.update(pending_delete: true) project.destroy! end + + it 'does not schedule a namespace statistics worker' do + expect(Namespaces::ScheduleAggregationWorker) + .not_to receive(:perform_async) + + project.update(pending_delete: true) + project.destroy! + end + end + + context 'when feature flag is disabled for the namespace' do + it 'does not schedule a namespace statistics worker' do + namespace = subject.project.root_ancestor + + stub_feature_flags(update_statistics_namespace: false, namespace: namespace) + + expect(Namespaces::ScheduleAggregationWorker) + .not_to receive(:perform_async) + + subject.destroy! + end end end end diff --git a/spec/workers/namespaces/prune_aggregation_schedules_worker_spec.rb b/spec/workers/namespaces/prune_aggregation_schedules_worker_spec.rb new file mode 100644 index 00000000000..b069b080531 --- /dev/null +++ b/spec/workers/namespaces/prune_aggregation_schedules_worker_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Namespaces::PruneAggregationSchedulesWorker, '#perform', :clean_gitlab_redis_shared_state do + include ExclusiveLeaseHelpers + + let(:namespaces) { create_list(:namespace, 5, :with_aggregation_schedule) } + let(:timeout) { Namespace::AggregationSchedule::DEFAULT_LEASE_TIMEOUT } + + subject(:worker) { described_class.new } + + before do + allow(Namespaces::RootStatisticsWorker) + .to receive(:perform_async).and_return(nil) + + allow(Namespaces::RootStatisticsWorker) + .to receive(:perform_in).and_return(nil) + + namespaces.each do |namespace| + lease_key = "namespace:namespaces_root_statistics:#{namespace.id}" + stub_exclusive_lease(lease_key, timeout: timeout) + end + end + + it 'schedules a worker per pending aggregation' do + expect(Namespaces::RootStatisticsWorker) + .to receive(:perform_async).exactly(5).times + + expect(Namespaces::RootStatisticsWorker) + .to receive(:perform_in).exactly(5).times + + worker.perform + end +end diff --git a/spec/workers/namespaces/root_statistics_worker_spec.rb b/spec/workers/namespaces/root_statistics_worker_spec.rb new file mode 100644 index 00000000000..8dd74b96d49 --- /dev/null +++ b/spec/workers/namespaces/root_statistics_worker_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Namespaces::RootStatisticsWorker, '#perform' do + let(:group) { create(:group, :with_aggregation_schedule) } + + subject(:worker) { described_class.new } + + context 'with a namespace' do + it 'executes refresher service' do + expect_any_instance_of(Namespaces::StatisticsRefresherService) + .to receive(:execute) + + worker.perform(group.id) + end + + it 'deletes namespace aggregated schedule row' do + worker.perform(group.id) + + expect(group.reload.aggregation_schedule).to be_nil + end + + context 'when something goes wrong when updating' do + before do + allow_any_instance_of(Namespaces::StatisticsRefresherService) + .to receive(:execute) + .and_raise(Namespaces::StatisticsRefresherService::RefresherError, 'error') + end + + it 'does not delete the aggregation schedule' do + worker.perform(group.id) + + expect(group.reload.aggregation_schedule).to be_present + end + + it 'logs the error' do + # A Namespace::RootStatisticsWorker is scheduled when + # a Namespace::AggregationSchedule is created, so having + # create(:group, :with_aggregation_schedule), will execute + # another worker + allow_any_instance_of(Namespace::AggregationSchedule) + .to receive(:schedule_root_storage_statistics).and_return(nil) + + expect(Gitlab::SidekiqLogger).to receive(:error).once + + worker.perform(group.id) + end + end + end + + context 'with no namespace' do + before do + group.destroy + end + + it 'does not execute the refresher service' do + expect_any_instance_of(Namespaces::StatisticsRefresherService) + .not_to receive(:execute) + + worker.perform(group.id) + end + end + + context 'with a namespace with no aggregation scheduled' do + before do + group.aggregation_schedule.destroy + end + + it 'does not execute the refresher service' do + expect_any_instance_of(Namespaces::StatisticsRefresherService) + .not_to receive(:execute) + + worker.perform(group.id) + end + end + + context 'when update_statistics_namespace is off' do + it 'does not create a new one' do + stub_feature_flags(update_statistics_namespace: false, namespace: group) + + expect_any_instance_of(Namespaces::StatisticsRefresherService) + .not_to receive(:execute) + + worker.perform(group.id) + end + end +end diff --git a/spec/workers/namespaces/schedule_aggregation_worker_spec.rb b/spec/workers/namespaces/schedule_aggregation_worker_spec.rb new file mode 100644 index 00000000000..7432ca12f2a --- /dev/null +++ b/spec/workers/namespaces/schedule_aggregation_worker_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Namespaces::ScheduleAggregationWorker, '#perform' do + let(:group) { create(:group) } + + subject(:worker) { described_class.new } + + context 'when group is the root ancestor' do + context 'when aggregation schedule exists' do + it 'does not create a new one' do + Namespace::AggregationSchedule.safe_find_or_create_by!(namespace_id: group.id) + + expect do + worker.perform(group.id) + end.not_to change(Namespace::AggregationSchedule, :count) + end + end + + context 'when update_statistics_namespace is off' do + it 'does not create a new one' do + stub_feature_flags(update_statistics_namespace: false, namespace: group) + + expect do + worker.perform(group.id) + end.not_to change(Namespace::AggregationSchedule, :count) + end + end + + context 'when aggregation schedule does not exist' do + it 'creates one' do + allow_any_instance_of(Namespace::AggregationSchedule) + .to receive(:schedule_root_storage_statistics).and_return(nil) + + expect do + worker.perform(group.id) + end.to change(Namespace::AggregationSchedule, :count).by(1) + + expect(group.aggregation_schedule).to be_present + end + end + end + + context 'when group is not the root ancestor' do + let(:parent_group) { create(:group) } + let(:group) { create(:group, parent: parent_group) } + + it 'creates an aggregation schedule for the root' do + allow_any_instance_of(Namespace::AggregationSchedule) + .to receive(:schedule_root_storage_statistics).and_return(nil) + + worker.perform(group.id) + + expect(parent_group.aggregation_schedule).to be_present + end + end + + context 'when namespace does not exist' do + it 'logs the error' do + expect(Gitlab::SidekiqLogger).to receive(:error).once + + worker.perform(12345) + end + end +end diff --git a/tmp/prometheus_multiproc_dir/puma/.gitkeep b/tmp/prometheus_multiproc_dir/puma/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tmp/prometheus_multiproc_dir/puma/.gitkeep diff --git a/tmp/prometheus_multiproc_dir/sidekiq/.gitkeep b/tmp/prometheus_multiproc_dir/sidekiq/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tmp/prometheus_multiproc_dir/sidekiq/.gitkeep diff --git a/tmp/prometheus_multiproc_dir/unicorn/.gitkeep b/tmp/prometheus_multiproc_dir/unicorn/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tmp/prometheus_multiproc_dir/unicorn/.gitkeep diff --git a/yarn.lock b/yarn.lock index ed9f31f60a4..1e04c82df1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1244,7 +1244,7 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== -abbrev@1, abbrev@1.0.x: +abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= @@ -1630,7 +1630,7 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async@1.x, async@^1.5.2: +async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -3993,18 +3993,6 @@ escaper@^2.5.3: resolved "https://registry.yarnpkg.com/escaper/-/escaper-2.5.3.tgz#8b8fe90ba364054151ab7eff18b4ce43b1e13ab5" integrity sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ== -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" @@ -4213,11 +4201,6 @@ espree@^4.0.0, espree@^4.1.0: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -4242,11 +4225,6 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -4953,17 +4931,6 @@ glob-to-regexp@^0.3.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5163,7 +5130,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.0.1, handlebars@^4.1.2: +handlebars@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== @@ -5206,11 +5173,6 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6104,26 +6066,6 @@ istanbul-reports@^2.1.1: dependencies: handlebars "^4.1.2" -istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - istextorbinary@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" @@ -6593,7 +6535,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.9.0: +js-yaml@^3.12.0, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7472,7 +7414,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -7818,7 +7760,7 @@ nodemon@^1.18.9: undefsafe "^2.0.2" update-notifier "^2.5.0" -"nopt@2 || 3", nopt@3.x: +"nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= @@ -8019,7 +7961,7 @@ on-headers@~1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9490,7 +9432,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@1.1.x: +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= @@ -10048,13 +9990,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -10456,13 +10391,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.1.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11635,7 +11563,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -11656,16 +11584,16 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -wordwrap@^1.0.0, wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" |