GraphQL: createIssue(epicID) is broken
Attempting to pass an epic ID to the createIssue
mutation is broken.
Given this query:
mutation createIssue(
$projectPath: ID!
$epicId: EpicID
$title: String!
$description: String
$labels: [String!]
) {
createIssue(
input: {
projectPath: $projectPath
epicId: $epicId
title: $title
description: $description
labels: $labels
}
) {
issue {
webUrl
}
}
}
And these variables:
{
"description": "Update alert's markup in app/views/admin/application_settings/integrations.html.haml",
"epicId": "gid://gitlab/Epic/5213",
"labels": ["frontend", "Pajamas", "component::alert", "pajamas:integrate"],
"projectPath": "gitlab-org/gitlab",
"title": "GlAlert > Update markup in app/views/admin/application_settings/integrations.html.haml"
}
I would expect the issue to be successfully created.
Instead we get this stack trace:
NoMethodError (undefined method `to_i' for #<GlobalID:0x00007f8d4a72d0d8>
Did you mean? to_s):
ee/app/services/ee/issues/base_service.rb:65:in `find_epic'
ee/app/services/ee/issues/base_service.rb:53:in `epic_param'
ee/app/services/ee/issues/base_service.rb:13:in `handle_epic'
ee/app/services/ee/issues/create_service.rb:10:in `filter_params'
app/services/issuable_base_service.rb:142:in `create'
app/services/issues/create_service.rb:14:in `execute'
ee/app/services/ee/issues/create_service.rb:17:in `execute'
app/graphql/mutations/issues/create.rb:76:in `resolve'
app/graphql/types/base_field.rb:46:in `block (2 levels) in resolve_field'
app/graphql/types/base_field.rb:35:in `block in resolve_field'
app/graphql/types/base_field.rb:31:in `resolve_field'
lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing'
lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'
lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing'
lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'
lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing'
lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'
app/graphql/gitlab_schema.rb:43:in `multiplex'
app/graphql/gitlab_schema.rb:50:in `execute'
app/controllers/graphql_controller.rb:75:in `execute_query'
app/controllers/graphql_controller.rb:32:in `execute'
ee/lib/gitlab/ip_address_state.rb:10:in `with'
ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'
app/controllers/application_controller.rb:482:in `set_current_admin'
lib/gitlab/session.rb:11:in `with_session'
app/controllers/application_controller.rb:473:in `set_session_storage'
lib/gitlab/i18n.rb:73:in `with_locale'
lib/gitlab/i18n.rb:79:in `with_user_locale'
app/controllers/application_controller.rb:467:in `set_locale'
lib/gitlab/error_tracking.rb:52:in `with_context'
app/controllers/application_controller.rb:532:in `sentry_context'
app/controllers/application_controller.rb:460:in `block in set_current_context'
lib/gitlab/application_context.rb:56:in `block in use'
lib/gitlab/application_context.rb:56:in `use'
lib/gitlab/application_context.rb:22:in `with_context'
app/controllers/application_controller.rb:451:in `set_current_context'
lib/gitlab/metrics/elasticsearch_rack_middleware.rb:16:in `call'
lib/gitlab/middleware/rails_queue_duration.rb:33:in `call'
lib/gitlab/metrics/rack_middleware.rb:16:in `block in call'
lib/gitlab/metrics/transaction.rb:56:in `run'
lib/gitlab/metrics/rack_middleware.rb:16:in `call'
lib/gitlab/request_profiler/middleware.rb:17:in `call'
lib/gitlab/query_limiting/middleware.rb:17:in `block in call'
lib/gitlab/query_limiting/transaction.rb:39:in `run'
lib/gitlab/query_limiting/middleware.rb:16:in `call'
lib/gitlab/jira/middleware.rb:19:in `call'
lib/gitlab/middleware/go.rb:20:in `call'
lib/gitlab/etag_caching/middleware.rb:21:in `call'
lib/gitlab/middleware/multipart.rb:234:in `call'
lib/gitlab/middleware/read_only/controller.rb:50:in `call'
lib/gitlab/middleware/read_only.rb:18:in `call'
lib/gitlab/middleware/same_site_cookies.rb:27:in `call'
lib/gitlab/middleware/handle_malformed_strings.rb:21:in `call'
lib/gitlab/middleware/basic_health_check.rb:25:in `call'
lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call'
lib/gitlab/middleware/request_context.rb:23:in `call'
config/initializers/fix_local_cache_middleware.rb:9:in `call'
lib/gitlab/middleware/static.rb:11:in `call'
lib/gitlab/webpack/dev_server_middleware.rb:34:in `perform_request'
lib/gitlab/metrics/requests_rack_middleware.rb:76:in `call'
lib/gitlab/middleware/release_env.rb:12:in `call'Completed 500 Internal Server Error in 62ms (Views: 0.2ms | ActiveRecord: 6.1ms | Elasticsearch: 0.0ms | Allocations: 32050)
This is caused because the epicID
is passed to the service as a GID,
not as a model ID (ie. an integer).
The cause for this is in https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/graphql/ee/mutations/issues/create.rb#L20,
which uses the short-circuiting assignment &&=
, which does the
incorrect thing, and does not process the value if it is present.