Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
98266e04
Commit
98266e04
authored
Oct 29, 2018
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'upstream/master' into ce-to-ee-2018-10-29
# Conflicts: # db/schema.rb [ci skip]
parents
42731d49
289651e2
Changes
34
Show whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
310 additions
and
99 deletions
+310
-99
app/assets/javascripts/filtered_search/issuable_filtered_search_token_keys.js
...ts/filtered_search/issuable_filtered_search_token_keys.js
+6
-1
app/controllers/dashboard/milestones_controller.rb
app/controllers/dashboard/milestones_controller.rb
+6
-1
app/controllers/groups/milestones_controller.rb
app/controllers/groups/milestones_controller.rb
+1
-1
app/models/clusters/cluster.rb
app/models/clusters/cluster.rb
+28
-0
app/models/clusters/group.rb
app/models/clusters/group.rb
+10
-0
app/models/concerns/deployment_platform.rb
app/models/concerns/deployment_platform.rb
+1
-0
app/models/global_milestone.rb
app/models/global_milestone.rb
+0
-44
app/models/group.rb
app/models/group.rb
+3
-0
app/models/milestone.rb
app/models/milestone.rb
+16
-0
app/services/clusters/create_service.rb
app/services/clusters/create_service.rb
+2
-2
app/views/shared/issuable/_search_bar.html.haml
app/views/shared/issuable/_search_bar.html.haml
+5
-2
changelogs/unreleased/34758-create-group-clusters.yml
changelogs/unreleased/34758-create-group-clusters.yml
+5
-0
changelogs/unreleased/52383-ui-filter-assignee-none-any.yml
changelogs/unreleased/52383-ui-filter-assignee-none-any.yml
+5
-0
changelogs/unreleased/rz_fix_milestone_count.yml
changelogs/unreleased/rz_fix_milestone_count.yml
+5
-0
config/routes.rb
config/routes.rb
+1
-0
db/migrate/20181014203236_create_cluster_groups.rb
db/migrate/20181014203236_create_cluster_groups.rb
+17
-0
db/migrate/20181017001059_add_cluster_type_to_clusters.rb
db/migrate/20181017001059_add_cluster_type_to_clusters.rb
+18
-0
db/schema.rb
db/schema.rb
+15
-0
doc/api/tags.md
doc/api/tags.md
+1
-1
doc/user/project/issue_board.md
doc/user/project/issue_board.md
+2
-2
doc/user/search/img/issues_filter_none_any.png
doc/user/search/img/issues_filter_none_any.png
+0
-0
doc/user/search/index.md
doc/user/search/index.md
+10
-0
locale/gitlab.pot
locale/gitlab.pot
+0
-3
spec/controllers/dashboard/milestones_controller_spec.rb
spec/controllers/dashboard/milestones_controller_spec.rb
+9
-0
spec/factories/clusters/clusters.rb
spec/factories/clusters/clusters.rb
+15
-0
spec/features/boards/modal_filter_spec.rb
spec/features/boards/modal_filter_spec.rb
+1
-1
spec/features/groups/milestone_spec.rb
spec/features/groups/milestone_spec.rb
+3
-3
spec/features/issues/filtered_search/dropdown_assignee_spec.rb
...features/issues/filtered_search/dropdown_assignee_spec.rb
+10
-2
spec/features/issues/filtered_search/visual_tokens_spec.rb
spec/features/issues/filtered_search/visual_tokens_spec.rb
+1
-1
spec/models/clusters/cluster_spec.rb
spec/models/clusters/cluster_spec.rb
+67
-0
spec/models/clusters/group_spec.rb
spec/models/clusters/group_spec.rb
+8
-0
spec/models/global_milestone_spec.rb
spec/models/global_milestone_spec.rb
+0
-35
spec/models/group_spec.rb
spec/models/group_spec.rb
+2
-0
spec/models/milestone_spec.rb
spec/models/milestone_spec.rb
+37
-0
No files found.
app/assets/javascripts/filtered_search/issuable_filtered_search_token_keys.js
View file @
98266e04
...
@@ -58,10 +58,15 @@ export const alternativeTokenKeys = [
...
@@ -58,10 +58,15 @@ export const alternativeTokenKeys = [
export
const
conditions
=
[
export
const
conditions
=
[
{
{
url
:
'
assignee_id=
0
'
,
url
:
'
assignee_id=
None
'
,
tokenKey
:
'
assignee
'
,
tokenKey
:
'
assignee
'
,
value
:
'
none
'
,
value
:
'
none
'
,
},
},
{
url
:
'
assignee_id=Any
'
,
tokenKey
:
'
assignee
'
,
value
:
'
any
'
,
},
{
{
url
:
'
milestone_title=No+Milestone
'
,
url
:
'
milestone_title=No+Milestone
'
,
tokenKey
:
'
milestone
'
,
tokenKey
:
'
milestone
'
,
...
...
app/controllers/dashboard/milestones_controller.rb
View file @
98266e04
...
@@ -4,12 +4,13 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
...
@@ -4,12 +4,13 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
include
MilestoneActions
include
MilestoneActions
before_action
:projects
before_action
:projects
before_action
:groups
,
only: :index
before_action
:milestone
,
only:
[
:show
,
:merge_requests
,
:participants
,
:labels
]
before_action
:milestone
,
only:
[
:show
,
:merge_requests
,
:participants
,
:labels
]
def
index
def
index
respond_to
do
|
format
|
respond_to
do
|
format
|
format
.
html
do
format
.
html
do
@milestone_states
=
GlobalMilestone
.
states_count
(
@projects
)
@milestone_states
=
Milestone
.
states_count
(
@projects
.
select
(
:id
),
@groups
.
select
(
:id
)
)
@milestones
=
Kaminari
.
paginate_array
(
milestones
).
page
(
params
[
:page
])
@milestones
=
Kaminari
.
paginate_array
(
milestones
).
page
(
params
[
:page
])
end
end
format
.
json
do
format
.
json
do
...
@@ -42,4 +43,8 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
...
@@ -42,4 +43,8 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
@milestone
=
DashboardMilestone
.
build
(
@projects
,
params
[
:title
])
@milestone
=
DashboardMilestone
.
build
(
@projects
,
params
[
:title
])
render_404
unless
@milestone
render_404
unless
@milestone
end
end
def
groups
@groups
||=
GroupsFinder
.
new
(
current_user
,
state_all:
true
).
execute
end
end
end
app/controllers/groups/milestones_controller.rb
View file @
98266e04
...
@@ -12,7 +12,7 @@ class Groups::MilestonesController < Groups::ApplicationController
...
@@ -12,7 +12,7 @@ class Groups::MilestonesController < Groups::ApplicationController
def
index
def
index
respond_to
do
|
format
|
respond_to
do
|
format
|
format
.
html
do
format
.
html
do
@milestone_states
=
GlobalMilestone
.
states_count
(
group_projects
,
group
)
@milestone_states
=
Milestone
.
states_count
(
group_projects
,
[
group
]
)
@milestones
=
Kaminari
.
paginate_array
(
milestones
).
page
(
params
[
:page
])
@milestones
=
Kaminari
.
paginate_array
(
milestones
).
page
(
params
[
:page
])
end
end
format
.
json
do
format
.
json
do
...
...
app/models/clusters/cluster.rb
View file @
98266e04
...
@@ -22,6 +22,12 @@ module Clusters
...
@@ -22,6 +22,12 @@ module Clusters
has_many
:cluster_projects
,
class_name:
'Clusters::Project'
has_many
:cluster_projects
,
class_name:
'Clusters::Project'
has_many
:projects
,
through: :cluster_projects
,
class_name:
'::Project'
has_many
:projects
,
through: :cluster_projects
,
class_name:
'::Project'
has_many
:cluster_groups
,
class_name:
'Clusters::Group'
has_many
:groups
,
through: :cluster_groups
,
class_name:
'::Group'
has_one
:cluster_group
,
->
{
order
(
id: :desc
)
},
class_name:
'Clusters::Group'
has_one
:group
,
through: :cluster_group
,
class_name:
'::Group'
# we force autosave to happen when we save `Cluster` model
# we force autosave to happen when we save `Cluster` model
has_one
:provider_gcp
,
class_name:
'Clusters::Providers::Gcp'
,
autosave:
true
has_one
:provider_gcp
,
class_name:
'Clusters::Providers::Gcp'
,
autosave:
true
...
@@ -40,8 +46,12 @@ module Clusters
...
@@ -40,8 +46,12 @@ module Clusters
accepts_nested_attributes_for
:platform_kubernetes
,
update_only:
true
accepts_nested_attributes_for
:platform_kubernetes
,
update_only:
true
validates
:name
,
cluster_name:
true
validates
:name
,
cluster_name:
true
validates
:cluster_type
,
presence:
true
validate
:restrict_modification
,
on: :update
validate
:restrict_modification
,
on: :update
validate
:no_groups
,
unless: :group_type?
validate
:no_projects
,
unless: :project_type?
delegate
:status
,
to: :provider
,
allow_nil:
true
delegate
:status
,
to: :provider
,
allow_nil:
true
delegate
:status_reason
,
to: :provider
,
allow_nil:
true
delegate
:status_reason
,
to: :provider
,
allow_nil:
true
delegate
:on_creation?
,
to: :provider
,
allow_nil:
true
delegate
:on_creation?
,
to: :provider
,
allow_nil:
true
...
@@ -52,6 +62,12 @@ module Clusters
...
@@ -52,6 +62,12 @@ module Clusters
delegate
:available?
,
to: :application_ingress
,
prefix:
true
,
allow_nil:
true
delegate
:available?
,
to: :application_ingress
,
prefix:
true
,
allow_nil:
true
delegate
:available?
,
to: :application_prometheus
,
prefix:
true
,
allow_nil:
true
delegate
:available?
,
to: :application_prometheus
,
prefix:
true
,
allow_nil:
true
enum
cluster_type:
{
instance_type:
1
,
group_type:
2
,
project_type:
3
}
enum
platform_type:
{
enum
platform_type:
{
kubernetes:
1
kubernetes:
1
}
}
...
@@ -124,5 +140,17 @@ module Clusters
...
@@ -124,5 +140,17 @@ module Clusters
true
true
end
end
def
no_groups
if
groups
.
any?
errors
.
add
(
:cluster
,
'cannot have groups assigned'
)
end
end
def
no_projects
if
projects
.
any?
errors
.
add
(
:cluster
,
'cannot have projects assigned'
)
end
end
end
end
end
end
app/models/clusters/group.rb
0 → 100644
View file @
98266e04
# frozen_string_literal: true
module
Clusters
class
Group
<
ActiveRecord
::
Base
self
.
table_name
=
'cluster_groups'
belongs_to
:cluster
,
class_name:
'Clusters::Cluster'
belongs_to
:group
,
class_name:
'::Group'
end
end
app/models/concerns/deployment_platform.rb
View file @
98266e04
...
@@ -42,6 +42,7 @@ module DeploymentPlatform
...
@@ -42,6 +42,7 @@ module DeploymentPlatform
{
{
name:
'kubernetes-template'
,
name:
'kubernetes-template'
,
projects:
[
self
],
projects:
[
self
],
cluster_type: :project_type
,
provider_type: :user
,
provider_type: :user
,
platform_type: :kubernetes
,
platform_type: :kubernetes
,
platform_kubernetes_attributes:
platform_kubernetes_attributes_from_service_template
platform_kubernetes_attributes:
platform_kubernetes_attributes_from_service_template
...
...
app/models/global_milestone.rb
View file @
98266e04
...
@@ -36,50 +36,6 @@ class GlobalMilestone
...
@@ -36,50 +36,6 @@ class GlobalMilestone
new
(
title
,
child_milestones
)
new
(
title
,
child_milestones
)
end
end
def
self
.
states_count
(
projects
,
group
=
nil
)
legacy_group_milestones_count
=
legacy_group_milestone_states_count
(
projects
)
group_milestones_count
=
group_milestones_states_count
(
group
)
legacy_group_milestones_count
.
merge
(
group_milestones_count
)
do
|
k
,
legacy_group_milestones_count
,
group_milestones_count
|
legacy_group_milestones_count
+
group_milestones_count
end
end
def
self
.
group_milestones_states_count
(
group
)
return
STATE_COUNT_HASH
unless
group
params
=
{
group_ids:
[
group
.
id
],
state:
'all'
}
relation
=
MilestonesFinder
.
new
(
params
).
execute
# rubocop: disable CodeReuse/Finder
grouped_by_state
=
relation
.
reorder
(
nil
).
group
(
:state
).
count
{
opened:
grouped_by_state
[
'active'
]
||
0
,
closed:
grouped_by_state
[
'closed'
]
||
0
,
all:
grouped_by_state
.
values
.
sum
}
end
# Counts the legacy group milestones which must be grouped by title
def
self
.
legacy_group_milestone_states_count
(
projects
)
return
STATE_COUNT_HASH
unless
projects
params
=
{
project_ids:
projects
.
map
(
&
:id
),
state:
'all'
}
relation
=
MilestonesFinder
.
new
(
params
).
execute
# rubocop: disable CodeReuse/Finder
project_milestones_by_state_and_title
=
relation
.
reorder
(
nil
).
group
(
:state
,
:title
).
count
opened
=
count_by_state
(
project_milestones_by_state_and_title
,
'active'
)
closed
=
count_by_state
(
project_milestones_by_state_and_title
,
'closed'
)
all
=
project_milestones_by_state_and_title
.
map
{
|
(
_
,
title
),
_
|
title
}.
uniq
.
count
{
opened:
opened
,
closed:
closed
,
all:
all
}
end
def
self
.
count_by_state
(
milestones_by_state_and_title
,
state
)
def
self
.
count_by_state
(
milestones_by_state_and_title
,
state
)
milestones_by_state_and_title
.
count
do
|
(
milestone_state
,
_
),
_
|
milestones_by_state_and_title
.
count
do
|
(
milestone_state
,
_
),
_
|
milestone_state
==
state
milestone_state
==
state
...
...
app/models/group.rb
View file @
98266e04
...
@@ -43,6 +43,9 @@ class Group < Namespace
...
@@ -43,6 +43,9 @@ class Group < Namespace
has_many
:boards
has_many
:boards
has_many
:badges
,
class_name:
'GroupBadge'
has_many
:badges
,
class_name:
'GroupBadge'
has_many
:cluster_groups
,
class_name:
'Clusters::Group'
has_many
:clusters
,
through: :cluster_groups
,
class_name:
'Clusters::Cluster'
has_many
:todos
has_many
:todos
accepts_nested_attributes_for
:variables
,
allow_destroy:
true
accepts_nested_attributes_for
:variables
,
allow_destroy:
true
...
...
app/models/milestone.rb
View file @
98266e04
...
@@ -174,6 +174,22 @@ class Milestone < ActiveRecord::Base
...
@@ -174,6 +174,22 @@ class Milestone < ActiveRecord::Base
sorted
.
with_order_id_desc
sorted
.
with_order_id_desc
end
end
def
self
.
states_count
(
projects
,
groups
=
nil
)
return
STATE_COUNT_HASH
unless
projects
||
groups
counts
=
Milestone
.
for_projects_and_groups
(
projects
&
.
map
(
&
:id
),
groups
&
.
map
(
&
:id
))
.
reorder
(
nil
)
.
group
(
:state
)
.
count
{
opened:
counts
[
'active'
]
||
0
,
closed:
counts
[
'closed'
]
||
0
,
all:
counts
.
values
.
sum
}
end
##
##
# Returns the String necessary to reference this Milestone in Markdown. Group
# Returns the String necessary to reference this Milestone in Markdown. Group
# milestones only support name references, and do not support cross-project
# milestones only support name references, and do not support cross-project
...
...
app/services/clusters/create_service.rb
View file @
98266e04
...
@@ -11,9 +11,9 @@ module Clusters
...
@@ -11,9 +11,9 @@ module Clusters
end
end
def
execute
(
project
:,
access_token:
nil
)
def
execute
(
project
:,
access_token:
nil
)
raise
ArgumentError
.
new
(
_
(
'Instance does not support multiple Kubernetes clusters'
)
)
unless
can_create_cluster?
(
project
)
raise
ArgumentError
,
_
(
'Instance does not support multiple Kubernetes clusters'
)
unless
can_create_cluster?
(
project
)
cluster_params
=
params
.
merge
(
user:
current_user
,
projects:
[
project
])
cluster_params
=
params
.
merge
(
user:
current_user
,
cluster_type: :project_type
,
projects:
[
project
])
cluster_params
[
:provider_gcp_attributes
].
try
do
|
provider
|
cluster_params
[
:provider_gcp_attributes
].
try
do
|
provider
|
provider
[
:access_token
]
=
access_token
provider
[
:access_token
]
=
access_token
end
end
...
...
app/views/shared/issuable/_search_bar.html.haml
View file @
98266e04
...
@@ -61,7 +61,10 @@
...
@@ -61,7 +61,10 @@
%ul
{
data:
{
dropdown:
true
}
}
%ul
{
data:
{
dropdown:
true
}
}
%li
.filter-dropdown-item
{
data:
{
value:
'none'
}
}
%li
.filter-dropdown-item
{
data:
{
value:
'none'
}
}
%button
.btn.btn-link
{
type:
'button'
}
%button
.btn.btn-link
{
type:
'button'
}
=
_
(
'No Assignee'
)
=
_
(
'None'
)
%li
.filter-dropdown-item
{
data:
{
value:
'any'
}
}
%button
.btn.btn-link
{
type:
'button'
}
=
_
(
'Any'
)
%li
.divider.droplab-item-ignore
%li
.divider.droplab-item-ignore
-
if
current_user
-
if
current_user
=
render
'shared/issuable/user_dropdown_item'
,
=
render
'shared/issuable/user_dropdown_item'
,
...
@@ -81,7 +84,7 @@
...
@@ -81,7 +84,7 @@
%li
.filter-dropdown-item
{
data:
{
value:
'upcoming'
}
}
%li
.filter-dropdown-item
{
data:
{
value:
'upcoming'
}
}
%button
.btn.btn-link
{
type:
'button'
}
%button
.btn.btn-link
{
type:
'button'
}
=
_
(
'Upcoming'
)
=
_
(
'Upcoming'
)
%li
.filter-dropdown-item
{
'data-value'
=>
'started'
}
%li
.filter-dropdown-item
{
data:
{
value:
'started'
}
}
%button
.btn.btn-link
{
type:
'button'
}
%button
.btn.btn-link
{
type:
'button'
}
=
_
(
'Started'
)
=
_
(
'Started'
)
%li
.divider.droplab-item-ignore
%li
.divider.droplab-item-ignore
...
...
changelogs/unreleased/34758-create-group-clusters.yml
0 → 100644
View file @
98266e04
---
title
:
Adds model and migrations to enable group level clusters
merge_request
:
22307
author
:
type
:
other
changelogs/unreleased/52383-ui-filter-assignee-none-any.yml
0 → 100644
View file @
98266e04
---
title
:
Add None/Any option for assignee_id in search bar
merge_request
:
22599
author
:
Heinrich Lee Yu
type
:
added
changelogs/unreleased/rz_fix_milestone_count.yml
0 → 100644
View file @
98266e04
---
title
:
Fixing count on Milestones
merge_request
:
21446
author
:
type
:
fixed
config/routes.rb
View file @
98266e04
...
@@ -87,6 +87,7 @@ Rails.application.routes.draw do
...
@@ -87,6 +87,7 @@ Rails.application.routes.draw do
get
'ide'
=>
'ide#index'
get
'ide'
=>
'ide#index'
get
'ide/*vueroute'
=>
'ide#index'
,
format:
false
get
'ide/*vueroute'
=>
'ide#index'
,
format:
false
draw
:operations
draw
:instance_statistics
draw
:instance_statistics
end
end
...
...
db/migrate/20181014203236_create_cluster_groups.rb
0 → 100644
View file @
98266e04
# frozen_string_literal: true
class
CreateClusterGroups
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
def
change
create_table
:cluster_groups
do
|
t
|
t
.
references
:cluster
,
null:
false
,
foreign_key:
{
on_delete: :cascade
}
t
.
references
:group
,
null:
false
,
index:
true
t
.
index
[
:cluster_id
,
:group_id
],
unique:
true
t
.
foreign_key
:namespaces
,
column: :group_id
,
on_delete: :cascade
end
end
end
db/migrate/20181017001059_add_cluster_type_to_clusters.rb
0 → 100644
View file @
98266e04
# frozen_string_literal: true
class
AddClusterTypeToClusters
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
PROJECT_CLUSTER_TYPE
=
3
disable_ddl_transaction!
def
up
add_column_with_default
(
:clusters
,
:cluster_type
,
:smallint
,
default:
PROJECT_CLUSTER_TYPE
)
end
def
down
remove_column
(
:clusters
,
:cluster_type
)
end
end
db/schema.rb
View file @
98266e04
...
@@ -11,7 +11,11 @@
...
@@ -11,7 +11,11 @@
#
#
# It's strongly recommended that you check this file into your version control system.
# It's strongly recommended that you check this file into your version control system.
<<<<<<<
HEAD
ActiveRecord
::
Schema
.
define
(
version:
20181017131623
)
do
ActiveRecord
::
Schema
.
define
(
version:
20181017131623
)
do
=======
ActiveRecord
::
Schema
.
define
(
version:
20181017001059
)
do
>>>>>>>
upstream
/
master
# These are extensions that must be enabled in order to support this database
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
enable_extension
"plpgsql"
...
@@ -717,6 +721,14 @@ ActiveRecord::Schema.define(version: 20181017131623) do
...
@@ -717,6 +721,14 @@ ActiveRecord::Schema.define(version: 20181017131623) do
add_index
"ci_variables"
,
[
"project_id"
,
"key"
,
"environment_scope"
],
name:
"index_ci_variables_on_project_id_and_key_and_environment_scope"
,
unique:
true
,
using: :btree
add_index
"ci_variables"
,
[
"project_id"
,
"key"
,
"environment_scope"
],
name:
"index_ci_variables_on_project_id_and_key_and_environment_scope"
,
unique:
true
,
using: :btree
create_table
"cluster_groups"
,
force: :cascade
do
|
t
|
t
.
integer
"cluster_id"
,
null:
false
t
.
integer
"group_id"
,
null:
false
end
add_index
"cluster_groups"
,
[
"cluster_id"
,
"group_id"
],
name:
"index_cluster_groups_on_cluster_id_and_group_id"
,
unique:
true
,
using: :btree
add_index
"cluster_groups"
,
[
"group_id"
],
name:
"index_cluster_groups_on_group_id"
,
using: :btree
create_table
"cluster_platforms_kubernetes"
,
force: :cascade
do
|
t
|
create_table
"cluster_platforms_kubernetes"
,
force: :cascade
do
|
t
|
t
.
integer
"cluster_id"
,
null:
false
t
.
integer
"cluster_id"
,
null:
false
t
.
datetime
"created_at"
,
null:
false
t
.
datetime
"created_at"
,
null:
false
...
@@ -772,6 +784,7 @@ ActiveRecord::Schema.define(version: 20181017131623) do
...
@@ -772,6 +784,7 @@ ActiveRecord::Schema.define(version: 20181017131623) do
t
.
boolean
"enabled"
,
default:
true
t
.
boolean
"enabled"
,
default:
true
t
.
string
"name"
,
null:
false
t
.
string
"name"
,
null:
false
t
.
string
"environment_scope"
,
default:
"*"
,
null:
false
t
.
string
"environment_scope"
,
default:
"*"
,
null:
false
t
.
integer
"cluster_type"
,
limit:
2
,
default:
3
,
null:
false
end
end
add_index
"clusters"
,
[
"enabled"
],
name:
"index_clusters_on_enabled"
,
using: :btree
add_index
"clusters"
,
[
"enabled"
],
name:
"index_clusters_on_enabled"
,
using: :btree
...
@@ -3225,6 +3238,8 @@ ActiveRecord::Schema.define(version: 20181017131623) do
...
@@ -3225,6 +3238,8 @@ ActiveRecord::Schema.define(version: 20181017131623) do
add_foreign_key
"ci_triggers"
,
"projects"
,
name:
"fk_e3e63f966e"
,
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_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
"ci_variables"
,
"projects"
,
name:
"fk_ada5eb64b3"
,
on_delete: :cascade
add_foreign_key
"cluster_groups"
,
"clusters"
,
on_delete: :cascade
add_foreign_key
"cluster_groups"
,
"namespaces"
,
column:
"group_id"
,
on_delete: :cascade
add_foreign_key
"cluster_platforms_kubernetes"
,
"clusters"
,
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"
,
"clusters"
,
on_delete: :cascade
add_foreign_key
"cluster_projects"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"cluster_projects"
,
"projects"
,
on_delete: :cascade
...
...
doc/api/tags.md
View file @
98266e04
...
@@ -134,7 +134,7 @@ Parameters:
...
@@ -134,7 +134,7 @@ Parameters:
"description"
:
"Amazing release. Wow"
"description"
:
"Amazing release. Wow"
},
},
"name"
:
"v1.0.0"
,
"name"
:
"v1.0.0"
,
"target: "
2695
effb
5807
a
22
ff
3
d
138
d
593
fd
856244e155
e
7
",
"target
"
:
"2695effb5807a22ff3d138d593fd856244e155e7"
,
"message"
:
null
"message"
:
null
}
}
```
```
...
...
doc/user/project/issue_board.md
View file @
98266e04
...
@@ -176,8 +176,8 @@ Clicking on the current board name in the upper left corner will reveal a
...
@@ -176,8 +176,8 @@ Clicking on the current board name in the upper left corner will reveal a
menu from where you can create another Issue Board and rename or delete the
menu from where you can create another Issue Board and rename or delete the
existing one.
existing one.
Clicking on the main issue board link will take you to the last board
When you're revisiting an issue board in a project or group with multiple boards,
you visited.
GitLab will automatically load the last board
you visited.
NOTE:
**Note:**
NOTE:
**Note:**
The Multiple Issue Boards feature is available for
The Multiple Issue Boards feature is available for
...
...
doc/user/search/img/issues_filter_none_any.png
0 → 100644
View file @
98266e04
27.1 KB
doc/user/search/index.md
View file @
98266e04
...
@@ -40,6 +40,16 @@ The same process is valid for merge requests. Navigate to your project's **Merge
...
@@ -40,6 +40,16 @@ The same process is valid for merge requests. Navigate to your project's **Merge
and click
**Search or filter results...**
. Merge requests can be filtered by author, assignee,
and click
**Search or filter results...**
. Merge requests can be filtered by author, assignee,
milestone, and label.
milestone, and label.
### Filtering by **None** / **Any**
Some filter fields like milestone and assignee, allow you to filter by
**None**
or
**Any**
.
![
filter by none any
](
img/issues_filter_none_any.png
)
Selecting
**None**
returns results that have an empty value for that field. E.g.: no milestone, no assignee.
Selecting
**Any**
does the opposite. It returns results that have a non-empty value for that field.
### Searching for specific terms
### Searching for specific terms
You can filter issues and merge requests by specific terms included in titles or descriptions.
You can filter issues and merge requests by specific terms included in titles or descriptions.
...
...
locale/gitlab.pot
View file @
98266e04
...
@@ -5257,9 +5257,6 @@ msgstr ""
...
@@ -5257,9 +5257,6 @@ msgstr ""
msgid "No"
msgid "No"
msgstr ""
msgstr ""
msgid "No Assignee"
msgstr ""
msgid "No Label"
msgid "No Label"
msgstr ""
msgstr ""
...
...
spec/controllers/dashboard/milestones_controller_spec.rb
View file @
98266e04
...
@@ -45,6 +45,8 @@ describe Dashboard::MilestonesController do
...
@@ -45,6 +45,8 @@ describe Dashboard::MilestonesController do
end
end
describe
"#index"
do
describe
"#index"
do
render_views
it
'returns group and project milestones to which the user belongs'
do
it
'returns group and project milestones to which the user belongs'
do
get
:index
,
format: :json
get
:index
,
format: :json
...
@@ -53,5 +55,12 @@ describe Dashboard::MilestonesController do
...
@@ -53,5 +55,12 @@ describe Dashboard::MilestonesController do
expect
(
json_response
.
map
{
|
i
|
i
[
"first_milestone"
][
"id"
]
}).
to
match_array
([
group_milestone
.
id
,
project_milestone
.
id
])
expect
(
json_response
.
map
{
|
i
|
i
[
"first_milestone"
][
"id"
]
}).
to
match_array
([
group_milestone
.
id
,
project_milestone
.
id
])
expect
(
json_response
.
map
{
|
i
|
i
[
"group_name"
]
}.
compact
).
to
match_array
(
group
.
name
)
expect
(
json_response
.
map
{
|
i
|
i
[
"group_name"
]
}.
compact
).
to
match_array
(
group
.
name
)
end
end
it
'should contain group and project milestones to which the user belongs to'
do
get
:index
expect
(
response
.
body
).
to
include
(
"Open
\n
<span class=
\"
badge badge-pill
\"
>3</span>"
)
expect
(
response
.
body
).
to
include
(
"Closed
\n
<span class=
\"
badge badge-pill
\"
>0</span>"
)
end
end
end
end
end
spec/factories/clusters/clusters.rb
View file @
98266e04
...
@@ -2,13 +2,28 @@ FactoryBot.define do
...
@@ -2,13 +2,28 @@ FactoryBot.define do
factory
:cluster
,
class:
Clusters
::
Cluster
do
factory
:cluster
,
class:
Clusters
::
Cluster
do
user
user
name
'test-cluster'
name
'test-cluster'
cluster_type
:project_type
trait
:instance
do
cluster_type
{
Clusters
::
Cluster
.
cluster_types
[
:instance_type
]
}
end
trait
:project
do
trait
:project
do
cluster_type
{
Clusters
::
Cluster
.
cluster_types
[
:project_type
]
}
before
(
:create
)
do
|
cluster
,
evaluator
|
before
(
:create
)
do
|
cluster
,
evaluator
|
cluster
.
projects
<<
create
(
:project
,
:repository
)
cluster
.
projects
<<
create
(
:project
,
:repository
)
end
end
end
end
trait
:group
do
cluster_type
{
Clusters
::
Cluster
.
cluster_types
[
:group_type
]
}
before
(
:create
)
do
|
cluster
,
evalutor
|
cluster
.
groups
<<
create
(
:group
)
end
end
trait
:provided_by_user
do
trait
:provided_by_user
do
provider_type
:user
provider_type
:user
platform_type
:kubernetes
platform_type
:kubernetes
...
...
spec/features/boards/modal_filter_spec.rb
View file @
98266e04
...
@@ -106,7 +106,7 @@ describe 'Issue Boards add issue modal filtering', :js do
...
@@ -106,7 +106,7 @@ describe 'Issue Boards add issue modal filtering', :js do
it
'filters by unassigned'
do
it
'filters by unassigned'
do
set_filter
(
'assignee'
)
set_filter
(
'assignee'
)
click_filter_link
(
'No
Assigne
e'
)
click_filter_link
(
'No
n
e'
)
submit_filter
submit_filter
page
.
within
(
'.add-issues-modal'
)
do
page
.
within
(
'.add-issues-modal'
)
do
...
...
spec/features/groups/milestone_spec.rb
View file @
98266e04
...
@@ -95,9 +95,9 @@ describe 'Group milestones' do
...
@@ -95,9 +95,9 @@ describe 'Group milestones' do
end
end
it
'counts milestones correctly'
do
it
'counts milestones correctly'
do
expect
(
find
(
'.top-area .active .badge'
).
text
).
to
eq
(
"
2
"
)
expect
(
find
(
'.top-area .active .badge'
).
text
).
to
eq
(
"
3
"
)
expect
(
find
(
'.top-area .closed .badge'
).
text
).
to
eq
(
"
2
"
)
expect
(
find
(
'.top-area .closed .badge'
).
text
).
to
eq
(
"
3
"
)
expect
(
find
(
'.top-area .all .badge'
).
text
).
to
eq
(
"
4
"
)
expect
(
find
(
'.top-area .all .badge'
).
text
).
to
eq
(
"
6
"
)
end
end
it
'lists legacy group milestones and group milestones'
do
it
'lists legacy group milestones and group milestones'
do
...
...
spec/features/issues/filtered_search/dropdown_assignee_spec.rb
View file @
98266e04
...
@@ -156,13 +156,21 @@ describe 'Dropdown assignee', :js do
...
@@ -156,13 +156,21 @@ describe 'Dropdown assignee', :js do
expect_filtered_search_input_empty
expect_filtered_search_input_empty
end
end
it
'selects `
no assigne
e`'
do
it
'selects `
Non
e`'
do
find
(
'#js-dropdown-assignee .filter-dropdown-item'
,
text:
'No
Assigne
e'
).
click
find
(
'#js-dropdown-assignee .filter-dropdown-item'
,
text:
'No
n
e'
).
click
expect
(
page
).
to
have_css
(
js_dropdown_assignee
,
visible:
false
)
expect
(
page
).
to
have_css
(
js_dropdown_assignee
,
visible:
false
)
expect_tokens
([
assignee_token
(
'none'
)])
expect_tokens
([
assignee_token
(
'none'
)])
expect_filtered_search_input_empty
expect_filtered_search_input_empty
end
end
it
'selects `Any`'
do
find
(
'#js-dropdown-assignee .filter-dropdown-item'
,
text:
'Any'
).
click
expect
(
page
).
to
have_css
(
js_dropdown_assignee
,
visible:
false
)
expect_tokens
([
assignee_token
(
'any'
)])
expect_filtered_search_input_empty
end
end
end
describe
'selecting from dropdown without Ajax call'
do
describe
'selecting from dropdown without Ajax call'
do
...
...
spec/features/issues/filtered_search/visual_tokens_spec.rb
View file @
98266e04
...
@@ -118,7 +118,7 @@ describe 'Visual tokens', :js do
...
@@ -118,7 +118,7 @@ describe 'Visual tokens', :js do
describe
'selecting static option from dropdown'
do
describe
'selecting static option from dropdown'
do
before
do
before
do
find
(
"#js-dropdown-assignee"
).
find
(
'.filter-dropdown-item'
,
text:
'No
Assigne
e'
).
click
find
(
"#js-dropdown-assignee"
).
find
(
'.filter-dropdown-item'
,
text:
'No
n
e'
).
click
end
end
it
'changes value in visual token'
do
it
'changes value in visual token'
do
...
...
spec/models/clusters/cluster_spec.rb
View file @
98266e04
...
@@ -4,7 +4,10 @@ require 'spec_helper'
...
@@ -4,7 +4,10 @@ require 'spec_helper'
describe
Clusters
::
Cluster
do
describe
Clusters
::
Cluster
do
it
{
is_expected
.
to
belong_to
(
:user
)
}
it
{
is_expected
.
to
belong_to
(
:user
)
}
it
{
is_expected
.
to
have_many
(
:cluster_projects
)
}
it
{
is_expected
.
to
have_many
(
:projects
)
}
it
{
is_expected
.
to
have_many
(
:projects
)
}
it
{
is_expected
.
to
have_many
(
:cluster_groups
)
}
it
{
is_expected
.
to
have_many
(
:groups
)
}
it
{
is_expected
.
to
have_one
(
:provider_gcp
)
}
it
{
is_expected
.
to
have_one
(
:provider_gcp
)
}
it
{
is_expected
.
to
have_one
(
:platform_kubernetes
)
}
it
{
is_expected
.
to
have_one
(
:platform_kubernetes
)
}
it
{
is_expected
.
to
have_one
(
:application_helm
)
}
it
{
is_expected
.
to
have_one
(
:application_helm
)
}
...
@@ -178,6 +181,53 @@ describe Clusters::Cluster do
...
@@ -178,6 +181,53 @@ describe Clusters::Cluster do
it
{
expect
(
cluster
.
update
(
enabled:
false
)).
to
be_truthy
}
it
{
expect
(
cluster
.
update
(
enabled:
false
)).
to
be_truthy
}
end
end
end
end
describe
'cluster_type validations'
do
let
(
:instance_cluster
)
{
create
(
:cluster
,
:instance
)
}
let
(
:group_cluster
)
{
create
(
:cluster
,
:group
)
}
let
(
:project_cluster
)
{
create
(
:cluster
,
:project
)
}
it
'validates presence'
do
cluster
=
build
(
:cluster
,
:project
,
cluster_type:
nil
)
expect
(
cluster
).
not_to
be_valid
expect
(
cluster
.
errors
.
full_messages
).
to
include
(
"Cluster type can't be blank"
)
end
context
'project_type cluster'
do
it
'does not allow setting group'
do
project_cluster
.
groups
<<
build
(
:group
)
expect
(
project_cluster
).
not_to
be_valid
expect
(
project_cluster
.
errors
.
full_messages
).
to
include
(
'Cluster cannot have groups assigned'
)
end
end
context
'group_type cluster'
do
it
'does not allow setting project'
do
group_cluster
.
projects
<<
build
(
:project
)
expect
(
group_cluster
).
not_to
be_valid
expect
(
group_cluster
.
errors
.
full_messages
).
to
include
(
'Cluster cannot have projects assigned'
)
end
end
context
'instance_type cluster'
do
it
'does not allow setting group'
do
instance_cluster
.
groups
<<
build
(
:group
)
expect
(
instance_cluster
).
not_to
be_valid
expect
(
instance_cluster
.
errors
.
full_messages
).
to
include
(
'Cluster cannot have groups assigned'
)
end
it
'does not allow setting project'
do
instance_cluster
.
projects
<<
build
(
:project
)
expect
(
instance_cluster
).
not_to
be_valid
expect
(
instance_cluster
.
errors
.
full_messages
).
to
include
(
'Cluster cannot have projects assigned'
)
end
end
end
end
end
describe
'#provider'
do
describe
'#provider'
do
...
@@ -229,6 +279,23 @@ describe Clusters::Cluster do
...
@@ -229,6 +279,23 @@ describe Clusters::Cluster do
end
end
end
end
describe
'#group'
do
subject
{
cluster
.
group
}
context
'when cluster belongs to a group'
do
let
(
:cluster
)
{
create
(
:cluster
,
:group
)
}
let
(
:group
)
{
cluster
.
groups
.
first
}
it
{
is_expected
.
to
eq
(
group
)
}
end
context
'when cluster does not belong to any group'
do
let
(
:cluster
)
{
create
(
:cluster
)
}
it
{
is_expected
.
to
be_nil
}
end
end
describe
'#applications'
do
describe
'#applications'
do
set
(
:cluster
)
{
create
(
:cluster
)
}
set
(
:cluster
)
{
create
(
:cluster
)
}
...
...
spec/models/clusters/group_spec.rb
0 → 100644
View file @
98266e04
# frozen_string_literal: true
require
'spec_helper'
describe
Clusters
::
Group
do
it
{
is_expected
.
to
belong_to
(
:cluster
)
}
it
{
is_expected
.
to
belong_to
(
:group
)
}
end
spec/models/global_milestone_spec.rb
View file @
98266e04
...
@@ -92,41 +92,6 @@ describe GlobalMilestone do
...
@@ -92,41 +92,6 @@ describe GlobalMilestone do
end
end
end
end
describe
'.states_count'
do
context
'when the projects have milestones'
do
before
do
create
(
:closed_milestone
,
title:
'Active Group Milestone'
,
project:
project3
)
create
(
:active_milestone
,
title:
'Active Group Milestone'
,
project:
project1
)
create
(
:active_milestone
,
title:
'Active Group Milestone'
,
project:
project2
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
project:
project1
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
project:
project2
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
project:
project3
)
end
it
'returns the quantity of global milestones in each possible state'
do
expected_count
=
{
opened:
1
,
closed:
2
,
all:
2
}
count
=
described_class
.
states_count
(
Project
.
all
)
expect
(
count
).
to
eq
(
expected_count
)
end
end
context
'when the projects do not have milestones'
do
before
do
project1
end
it
'returns 0 as the quantity of global milestones in each state'
do
expected_count
=
{
opened:
0
,
closed:
0
,
all:
0
}
count
=
described_class
.
states_count
(
Project
.
all
)
expect
(
count
).
to
eq
(
expected_count
)
end
end
end
describe
'#initialize'
do
describe
'#initialize'
do
let
(
:milestone1_project1
)
{
create
(
:milestone
,
title:
"Milestone v1.2"
,
project:
project1
)
}
let
(
:milestone1_project1
)
{
create
(
:milestone
,
title:
"Milestone v1.2"
,
project:
project1
)
}
let
(
:milestone1_project2
)
{
create
(
:milestone
,
title:
"Milestone v1.2"
,
project:
project2
)
}
let
(
:milestone1_project2
)
{
create
(
:milestone
,
title:
"Milestone v1.2"
,
project:
project2
)
}
...
...
spec/models/group_spec.rb
View file @
98266e04
...
@@ -19,6 +19,8 @@ describe Group do
...
@@ -19,6 +19,8 @@ describe Group do
it
{
is_expected
.
to
have_one
(
:chat_team
)
}
it
{
is_expected
.
to
have_one
(
:chat_team
)
}
it
{
is_expected
.
to
have_many
(
:custom_attributes
).
class_name
(
'GroupCustomAttribute'
)
}
it
{
is_expected
.
to
have_many
(
:custom_attributes
).
class_name
(
'GroupCustomAttribute'
)
}
it
{
is_expected
.
to
have_many
(
:badges
).
class_name
(
'GroupBadge'
)
}
it
{
is_expected
.
to
have_many
(
:badges
).
class_name
(
'GroupBadge'
)
}
it
{
is_expected
.
to
have_many
(
:cluster_groups
).
class_name
(
'Clusters::Group'
)
}
it
{
is_expected
.
to
have_many
(
:clusters
).
class_name
(
'Clusters::Cluster'
)
}
describe
'#members & #requesters'
do
describe
'#members & #requesters'
do
let
(
:requester
)
{
create
(
:user
)
}
let
(
:requester
)
{
create
(
:user
)
}
...
...
spec/models/milestone_spec.rb
View file @
98266e04
...
@@ -350,4 +350,41 @@ describe Milestone do
...
@@ -350,4 +350,41 @@ describe Milestone do
end
end
end
end
end
end
describe
'.states_count'
do
context
'when the projects have milestones'
do
before
do
project_1
=
create
(
:project
)
project_2
=
create
(
:project
)
group_1
=
create
(
:group
)
group_2
=
create
(
:group
)
create
(
:active_milestone
,
title:
'Active Group Milestone'
,
project:
project_1
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
project:
project_1
)
create
(
:active_milestone
,
title:
'Active Group Milestone'
,
project:
project_2
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
project:
project_2
)
create
(
:closed_milestone
,
title:
'Active Group Milestone'
,
group:
group_1
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
group:
group_1
)
create
(
:closed_milestone
,
title:
'Active Group Milestone'
,
group:
group_2
)
create
(
:closed_milestone
,
title:
'Closed Group Milestone'
,
group:
group_2
)
end
it
'returns the quantity of milestones in each possible state'
do
expected_count
=
{
opened:
5
,
closed:
6
,
all:
11
}
count
=
described_class
.
states_count
(
Project
.
all
,
Group
.
all
)
expect
(
count
).
to
eq
(
expected_count
)
end
end
context
'when the projects do not have milestones'
do
it
'returns 0 as the quantity of global milestones in each state'
do
expected_count
=
{
opened:
0
,
closed:
0
,
all:
0
}
count
=
described_class
.
states_count
([
project
])
expect
(
count
).
to
eq
(
expected_count
)
end
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment