Skip to content

Feat(Q): Add create/update service for AmazonQ

What does this MR do and why?

This MR sets up the BE endpoint and services for handling create/update of the AmazonQ integration. Please see the Feature branch MR for more context.

Screenshots or screen recordings

demo_create_update_service

How to set up and validate locally

Prerequisites:

  1. You'll need to make sure you have an Ultimate license and AI features setup on your GDK. See these instructions.

  2. For testing this MR without actual Amazon integration, comment out the line that attempts to register with amazon:

    diff --git a/ee/app/services/ai/amazon_q/create_service.rb b/ee/app/services/ai/amazon_q/create_service.rb
    index 509fcf6522f3..fa4bdfc8eb8d 100644
    --- a/ee/app/services/ai/amazon_q/create_service.rb
    +++ b/ee/app/services/ai/amazon_q/create_service.rb
    @@ -39,7 +39,7 @@ def create_amazon_q_onboarding
     
             return unless find_or_create_oauth_app
             return unless ai_settings.update(amazon_q_oauth_application_id: @application.id)
    -        return unless register_oauth_application_with_amazon
    +        # return unless register_oauth_application_with_amazon
     
             ai_settings.update(amazon_q_ready: true)
           end
    

Instructions for these changes:

  1. Enable the feature flag amazon_q_integration with Feature.enable(:amazon_q_integration) in a rails console
  2. Visit Admin > Settings and look for GitLab Duo with Amazon Q section. Click View configuration setup.
  3. Enter test-123 for IAM role's ARN
  4. Select On by default for Availability
  5. Click Save changes
  6. EXPECTATION: Verify that new service account user and OAuth app are created
  7. Go back to Amazon Q configuration page
  8. Select Always off for Availability
  9. Click Save changes
  10. EXPECTATION: Verify that service account user is blocked.

Notes

When created, AmazonQ will ensure that an oauth application and a service account user are associated with the integration. If an association doesn't already exist (from being previously connected) then it will create these.

To reset the AmazonQ status in the db, open a rails console (rails c) and run:

Ai::Setting.instance.update!(amazon_q_role_arn: nil, amazon_q_ready: false, amazon_q_oauth_application: nil, amazon_q_service_account_user: nil)

Logs and Queries

When saving initial settings
TRANSACTION (0.1ms)  COMMIT /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  AuditEvents::InstanceExternalAuditEventDestination Exists? (0.3ms)  SELECT 1 AS one FROM "audit_events_instance_external_audit_event_destinations" LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY6
4HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `stream
able?'*/
  ↳ ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `streamable?'
  AuditEvents::Instance::GoogleCloudLoggingConfiguration Exists? (0.3ms)  SELECT 1 AS one FROM "audit_events_instance_google_cloud_logging_configurations" LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YT
M7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strate
gy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strategy.rb:9:in `streamable?'
  AuditEvents::Instance::AmazonS3Configuration Exists? (0.2ms)  SELECT 1 AS one FROM "audit_events_instance_amazon_s3_configurations" LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_i
d:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'
  TRANSACTION (0.2ms)  BEGIN /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/e
e/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Count (0.2ms)  SELECT COUNT(*) FROM "ai_settings" /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_deve
lopment,db_config_name:main,line:/ee/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Load (0.1ms)  SELECT "ai_settings".* FROM "ai_settings" ORDER BY "ai_settings"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsCont
roller#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Update (0.4ms)  UPDATE "ai_settings" SET "updated_at" = '2024-12-13 00:29:35.004617', "amazon_q_service_account_user_id" = 64 WHERE "ai_settings"."id" = 1 /*application:web,correlation_id:01JEYPQEBT
YCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/services/ai/amazon_q/create_service.rb:57:in `create_service_accou
nt'*/
  ↳ ee/app/services/ai/amazon_q/create_service.rb:57:in `create_service_account'
  TRANSACTION (0.1ms)  COMMIT /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  TRANSACTION (0.2ms)  BEGIN /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/e
e/app/services/ai/amazon_q/create_service.rb:86:in `find_or_create_oauth_app'*/
  ↳ ee/app/services/ai/amazon_q/create_service.rb:86:in `find_or_create_oauth_app'
  Doorkeeper::Application Exists? (13.9ms)  SELECT 1 AS one FROM "oauth_applications" WHERE "oauth_applications"."uid" = '7e6a954b5fae122e50eb35ab1130af5a1e3f49c2b0a0480496293bd9c2260f3b' LIMIT 1 /*application:we
b,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/services/ai/amazon_q/create_service.rb:
86:in `find_or_create_oauth_app'*/
  ↳ ee/app/services/ai/amazon_q/create_service.rb:86:in `find_or_create_oauth_app'
  Doorkeeper::Application Create (5.0ms)  INSERT INTO "oauth_applications" ("name", "uid", "secret", "redirect_uri", "scopes", "created_at", "updated_at", "confidential") VALUES ('Amazon Q OAuth', '7e6a954b5fae12
2e50eb35ab1130af5a1e3f49c2b0a0480496293bd9c2260f3b', '$pbkdf2-sha512$20000$$nQktJZEsr7ffEuuYLYOClkLbKeXgUNKP/z5BDZht3Kg0UJZwiSQhYJwMn94Hp8f77C4N1apfDPwmbViw56FlAw', 'https://gdk.test:3443/', 'api read_repository
write_repository user:*', '2024-12-13 00:29:35.132668', '2024-12-13 00:29:35.132668', FALSE) RETURNING "id" /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsContro
ller#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/services/ai/amazon_q/create_service.rb:86:in `find_or_create_oauth_app'*/
  ↳ ee/app/services/ai/amazon_q/create_service.rb:86:in `find_or_create_oauth_app'
  TRANSACTION (0.2ms)  COMMIT /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  TRANSACTION (0.2ms)  BEGIN /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/e
e/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Count (0.2ms)  SELECT COUNT(*) FROM "ai_settings" /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_deve
lopment,db_config_name:main,line:/ee/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Load (0.6ms)  SELECT "ai_settings".* FROM "ai_settings" ORDER BY "ai_settings"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsCont
roller#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ai/setting.rb:29:in `validates_singleton'*/
  ↳ ee/app/models/ai/setting.rb:29:in `validates_singleton'
  Ai::Setting Update (0.5ms)  UPDATE "ai_settings" SET "updated_at" = '2024-12-13 00:29:35.202158', "amazon_q_oauth_application_id" = 48 WHERE "ai_settings"."id" = 1 /*application:web,correlation_id:01JEYPQEBTYCQ
5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/services/ai/amazon_q/create_service.rb:41:in `create_amazon_q_onboard
ing'*/
  ↳ ee/app/services/ai/amazon_q/create_service.rb:41:in `create_amazon_q_onboarding'
  TRANSACTION (0.2ms)  COMMIT /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  Ai::Setting Load (0.3ms)  SELECT "ai_settings".* FROM "ai_settings" ORDER BY "ai_settings"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsCont
roller#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ai/setting.rb:17:in `instance'*/
  ↳ ee/app/models/ai/setting.rb:17:in `instance'
  CloudConnector::Access Load (0.3ms)  SELECT "cloud_connector_access".* FROM "cloud_connector_access" ORDER BY "cloud_connector_access"."id" DESC LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64H
T2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/cloud_connector/self_managed/access_data_reader.rb:16:in `access_record_data'*/
  ↳ ee/lib/cloud_connector/self_managed/access_data_reader.rb:16:in `access_record_data'
  CloudConnector::ServiceAccessToken Load (0.3ms)  SELECT "service_access_tokens".* FROM "service_access_tokens" WHERE (expires_at > '2024-12-13 00:29:35.221365') ORDER BY "service_access_tokens"."id" DESC LIMIT
1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/cloud_connector/self_
managed/available_service_data.rb:11:in `access_token'*/
  ↳ ee/lib/cloud_connector/self_managed/available_service_data.rb:11:in `access_token'
  GitlabSubscriptions::AddOn Pluck (0.2ms)  SELECT "subscription_add_ons"."id" FROM "subscription_add_ons" WHERE "subscription_add_ons"."name" = 1 LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64H
T2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/gitlab_subscriptions/add_on_purchase.rb:38:in `block in <class:AddOnPurch
ase>'*/
  ↳ ee/app/models/gitlab_subscriptions/add_on_purchase.rb:38:in `block in <class:AddOnPurchase>'
  GitlabSubscriptions::AddOn Pluck (0.2ms)  SELECT "subscription_add_ons"."id" FROM "subscription_add_ons" WHERE "subscription_add_ons"."name" = 3 LIMIT 1 /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64H
T2,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/gitlab_subscriptions/add_on_purchase.rb:40:in `block in <class:AddOnPurch
ase>'*/
  ↳ ee/app/models/gitlab_subscriptions/add_on_purchase.rb:40:in `block in <class:AddOnPurchase>'
  GitlabSubscriptions::AddOnPurchase Pluck (0.3ms)  SELECT "subscription_add_on_purchases"."quantity" FROM "subscription_add_on_purchases" WHERE (started_at IS NULL OR started_at <= '2024-12-13') AND ('2024-12-13
' < expires_on) AND ("subscription_add_on_purchases"."subscription_add_on_id" = 1 OR "subscription_add_on_purchases"."subscription_add_on_id" = 3) /*application:web,correlation_id:01JEYPQEBTYCQ5YTM7MYY64HT2,endpo
int_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/gitlab_subscriptions/add_on_purchase.rb:81:in `maximum_duo_seat_count'*/
  ↳ ee/app/models/gitlab_subscriptions/add_on_purchase.rb:81:in `maximum_duo_seat_count'
Redirected to https://gdk.test:3443/admin/ai/amazon_q_settings
Completed 302 Found in 1778ms (ActiveRecord: 92.8ms | Elasticsearch: 0.0ms | Allocations: 740280)
When just updating availability (after initial connection)
  ↳ ee/app/services/ai/amazon_q/update_service.rb:9:in `execute'
  ApplicationSetting Update (0.6ms)  UPDATE "application_settings" SET "updated_at" = '2024-12-13 00:38:18.362446', "duo_features_enabled" = FALSE, "lock_duo_features_enabled" = TRUE WHERE "application_settings"."id" = 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/services/ai/amazon_q/update_service.rb:9:in `execute'*/
  ↳ ee/app/services/ai/amazon_q/update_service.rb:9:in `execute'
  TRANSACTION (0.3ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  ApplicationSetting::Term Load (0.4ms)  SELECT "application_setting_terms".* FROM "application_setting_terms" ORDER BY "application_setting_terms"."id" DESC LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/app/models/application_setting/term.rb:14:in `latest'*/
  ↳ app/models/application_setting/term.rb:14:in `latest'
  Ai::Setting Load (0.2ms)  SELECT "ai_settings".* FROM "ai_settings" ORDER BY "ai_settings"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ai/setting.rb:17:in `instance'*/
  ↳ ee/app/models/ai/setting.rb:17:in `instance'
  TRANSACTION (0.1ms)  BEGIN /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/audit/auditor.rb:187:in `log_to_database'*/
  ↳ lib/gitlab/audit/auditor.rb:187:in `log_to_database'
  AuditEvent Create (0.9ms)  INSERT INTO "audit_events" ("author_id", "entity_id", "entity_type", "details", "ip_address", "author_name", "entity_path", "target_details", "created_at", "target_type", "target_id") VALUES (1, 1, 'Gitlab::Audit::InstanceScope', '---
:event_name: q_onbarding_updated
:author_name: Administrator
:author_class: User
:target_id: 1
:target_type: Ai::Setting
:target_details: unknown
:custom_message: Changed availability to never_on
:ip_address: 127.0.0.1
:entity_path: gitlab_instance
', '127.0.0.1/32', 'Administrator', 'gitlab_instance', 'unknown', '2024-12-13 00:38:18.386385', 'Ai::Setting', 1) RETURNING "id" /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::
AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/audit/auditor.rb:187:in `log_to_database'*/
  ↳ lib/gitlab/audit/auditor.rb:187:in `log_to_database'
  TRANSACTION (0.2ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  User Load (0.3ms)  SELECT "users"."id", "users"."name", "users"."username", "users"."email" FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1000 /*application:web,correlation_id:01JEYQ7D375G
CFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/app/models/audit_event.rb:83:in `block in lazy_author'*/
  ↳ app/models/concerns/use_sql_function_for_primary_key_lookups.rb:8:in `_query_by_sql'
  TRANSACTION (0.1ms)  BEGIN /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/l
ib/gitlab/audit/logging.rb:25:in `log_event'*/
  ↳ lib/gitlab/audit/logging.rb:25:in `log_event'
  AuditEvents::InstanceAuditEvent Create (0.5ms)  INSERT INTO "instance_audit_events" ("id", "created_at", "author_id", "target_id", "event_name", "details", "ip_address", "author_name", "entity_path", "target_de
tails", "target_type") VALUES (1259, '2024-12-13 00:38:18.386385', 1, 1, 'q_onbarding_updated', '---
:event_name: q_onbarding_updated
:author_name: Administrator
:author_class: User
:target_id: 1
:target_type: Ai::Setting
:target_details: unknown
:custom_message: Changed availability to never_on
:ip_address: 127.0.0.1
:entity_path: gitlab_instance
', '127.0.0.1/32', 'Administrator', 'gitlab_instance', 'unknown', 'Ai::Setting') RETURNING "id" /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,
db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/audit/logging.rb:25:in `log_event'*/
  ↳ lib/gitlab/audit/logging.rb:25:in `log_event'
  TRANSACTION (0.2ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  AuditEvents::InstanceExternalAuditEventDestination Exists? (0.5ms)  SELECT 1 AS one FROM "audit_events_instance_external_audit_event_destinations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1D
MFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `stream
able?'*/
  ↳ ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `streamable?'
  AuditEvents::Instance::GoogleCloudLoggingConfiguration Exists? (0.6ms)  SELECT 1 AS one FROM "audit_events_instance_google_cloud_logging_configurations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPX
R3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strate
gy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strategy.rb:9:in `streamable?'
  AuditEvents::Instance::AmazonS3Configuration Exists? (0.5ms)  SELECT 1 AS one FROM "audit_events_instance_amazon_s3_configurations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_i
d:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'
  Ai::Setting Load (0.2ms)  SELECT "ai_settings".* FROM "ai_settings" ORDER BY "ai_settings"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsCont
roller#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ai/setting.rb:17:in `instance'*/
  ↳ ee/app/models/ai/setting.rb:17:in `instance'
User Load (0.4ms)  SELECT "users"."id", "users"."email", "users"."encrypted_password", "users"."reset_password_token", "users"."reset_password_sent_at", "users"."remember_created_at", "users"."sign_in_count", "
users"."current_sign_in_at", "users"."last_sign_in_at", "users"."current_sign_in_ip", "users"."last_sign_in_ip", "users"."created_at", "users"."updated_at", "users"."name", "users"."admin", "users"."projects_limi
t", "users"."failed_attempts", "users"."locked_at", "users"."username", "users"."can_create_group", "users"."can_create_team", "users"."state", "users"."color_scheme_id", "users"."password_expires_at", "users"."c
reated_by_id", "users"."last_credential_check_at", "users"."avatar", "users"."confirmation_token", "users"."confirmed_at", "users"."confirmation_sent_at", "users"."unconfirmed_email", "users"."hide_no_ssh_key", "
users"."admin_email_unsubscribed_at", "users"."notification_email", "users"."hide_no_password", "users"."password_automatically_set", "users"."encrypted_otp_secret", "users"."encrypted_otp_secret_iv", "users"."en
crypted_otp_secret_salt", "users"."otp_required_for_login", "users"."otp_backup_codes", "users"."public_email", "users"."dashboard", "users"."project_view", "users"."consumed_timestep", "users"."layout", "users".
"hide_project_limit", "users"."note", "users"."unlock_token", "users"."otp_grace_period_started_at", "users"."external", "users"."incoming_email_token", "users"."auditor", "users"."require_two_factor_authenticati
on_from_group", "users"."two_factor_grace_period", "users"."last_activity_on", "users"."notified_of_own_activity", "users"."preferred_language", "users"."theme_id", "users"."accepted_term_id", "users"."feed_token
", "users"."private_profile", "users"."roadmap_layout", "users"."include_private_contributions", "users"."commit_email", "users"."group_view", "users"."managing_group_id", "users"."first_name", "users"."last_name
", "users"."static_object_token", "users"."role", "users"."user_type", "users"."static_object_token_encrypted", "users"."otp_secret_expires_at", "users"."onboarding_in_progress", "users"."color_mode_id", "users".
"composite_identity_enforced" FROM "users" WHERE "users"."id" = 64 LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gi
tlabhq_development,db_config_name:main,line:/ee/lib/ai/amazon_q.rb:21:in `ensure_service_account_blocked!'*/
  ↳ app/models/concerns/use_sql_function_for_primary_key_lookups.rb:8:in `_query_by_sql'
  TRANSACTION (0.1ms)  BEGIN /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/a
pp/models/user.rb:1830:in `ensure_namespace_correct'*/
  ↳ app/models/concerns/use_sql_function_for_primary_key_lookups.rb:8:in `_query_by_sql'
Namespace Load (1.9ms)  SELECT "namespaces"."id", "namespaces"."name", "namespaces"."path", "namespaces"."owner_id", "namespaces"."created_at", "namespaces"."updated_at", "namespaces"."type", "namespaces"."desc
ription", "namespaces"."avatar", "namespaces"."membership_lock", "namespaces"."share_with_group_lock", "namespaces"."visibility_level", "namespaces"."request_access_enabled", "namespaces"."ldap_sync_status", "nam
espaces"."ldap_sync_error", "namespaces"."ldap_sync_last_update_at", "namespaces"."ldap_sync_last_successful_update_at", "namespaces"."ldap_sync_last_sync_at", "namespaces"."description_html", "namespaces"."lfs_e
nabled", "namespaces"."parent_id", "namespaces"."shared_runners_minutes_limit", "namespaces"."repository_size_limit", "namespaces"."require_two_factor_authentication", "namespaces"."two_factor_grace_period", "nam
espaces"."cached_markdown_version", "namespaces"."project_creation_level", "namespaces"."runners_token", "namespaces"."file_template_project_id", "namespaces"."saml_discovery_token", "namespaces"."runners_token_e
ncrypted", "namespaces"."custom_project_templates_group_id", "namespaces"."auto_devops_enabled", "namespaces"."extra_shared_runners_minutes_limit", "namespaces"."last_ci_minutes_notification_at", "namespaces"."la
st_ci_minutes_usage_notification_level", "namespaces"."subgroup_creation_level", "namespaces"."max_pages_size", "namespaces"."max_artifacts_size", "namespaces"."mentions_disabled", "namespaces"."default_branch_pr
otection", "namespaces"."max_personal_access_token_lifetime", "namespaces"."push_rule_id", "namespaces"."shared_runners_enabled", "namespaces"."allow_descendants_override_disabled_shared_runners", "namespaces"."t
raversal_ids", "namespaces"."organization_id" FROM "namespaces" WHERE "namespaces"."owner_id" = 64 AND "namespaces"."type" = 'User' LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:
Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/app/models/user.rb:1830:in `ensure_namespace_correct'*/
  ↳ app/models/concerns/use_sql_function_for_primary_key_lookups.rb:8:in `_query_by_sql'
  Upload Load (0.7ms)  SELECT "uploads".* FROM "uploads" WHERE "uploads"."uploader" = 'AvatarUploader' AND "uploads"."path" IN ('uploads/-/system/user/avatar/64/q_avatar.png', 'user/avatar/64/q_avatar.png') ORDER
 BY "uploads"."id" ASC LIMIT 1000 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,li
ne:/app/models/concerns/avatarable.rb:117:in `block in retrieve_upload_from_batch'*/
  ↳ app/models/concerns/avatarable.rb:117:in `block in retrieve_upload_from_batch'
  User Update (2.7ms)  UPDATE "users" SET "updated_at" = '2024-12-13 00:38:18.648341', "state" = 'blocked' WHERE "users"."id" = 64 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai
::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb:29:in `temporary_ignore_tables_in_tr
ansaction'*/
  ↳ lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb:29:in `temporary_ignore_tables_in_transaction'
  Project Update All (6.5ms)  UPDATE "projects" SET "star_count" = COALESCE("star_count", 0) - 1 WHERE "projects"."id" IN (SELECT "projects"."id" FROM "projects" INNER JOIN "users_star_projects" ON "projects"."id
" = "users_star_projects"."project_id" WHERE "users_star_projects"."user_id" = 64) /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_dat
abase:gitlabhq_development,db_config_name:main,line:/app/models/user.rb:598:in `block (3 levels) in <class:User>'*/
  ↳ app/models/user.rb:598:in `block (3 levels) in <class:User>'
  ↳ app/models/user.rb:598:in `block (3 levels) in <class:User>'
  TRANSACTION (0.2ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  Ci::Pipeline Load (6.3ms)  SELECT "p_ci_pipelines"."id" FROM "p_ci_pipelines" WHERE "p_ci_pipelines"."user_id" = 64 AND "p_ci_pipelines"."status" IN ('preparing', 'pending', 'running', 'waiting_for_callback', '
waiting_for_resource', 'created', 'scheduled', 'manual') ORDER BY "p_ci_pipelines"."id" ASC LIMIT 1000 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#
create,db_config_database:gitlabhq_development_ci,db_config_name:ci,line:/app/services/ci/drop_pipeline_service.rb:9:in `execute_async_for_all'*/
  ↳ app/services/ci/drop_pipeline_service.rb:9:in `execute_async_for_all'
  Ci::PipelineSchedule Load (2.0ms)  SELECT "ci_pipeline_schedules"."id" FROM "ci_pipeline_schedules" WHERE "ci_pipeline_schedules"."owner_id" = 64 AND "ci_pipeline_schedules"."active" = TRUE ORDER BY "ci_pipelin
e_schedules"."id" ASC LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development_ci,db_config_name:ci,line:
/app/models/concerns/each_batch.rb:65:in `each_batch'*/
  ↳ app/models/concerns/each_batch.rb:65:in `each_batch'
  UserCustomAttribute Upsert (1.1ms)  INSERT INTO "user_custom_attributes" ("user_id","key","value","created_at","updated_at") VALUES (64, 'blocked_by', 'root/1+2024-12-13 00:38:18 UTC', '2024-12-13 00:38:18.7759
79', '2024-12-13 00:38:18.776326') ON CONFLICT ("user_id","key") DO UPDATE SET "value"=excluded."value","created_at"=excluded."created_at","updated_at"=excluded."updated_at" RETURNING "id" /*application:web,corre
lation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/app/models/user_custom_attribute.rb:37:in `upsert_cus
tom_attributes'*/
  ↳ app/models/user_custom_attribute.rb:37:in `upsert_custom_attributes'
  TRANSACTION (0.2ms)  BEGIN /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/l
ib/gitlab/audit/auditor.rb:187:in `log_to_database'*/
  ↳ lib/gitlab/audit/auditor.rb:187:in `log_to_database'
  AuditEvent Create (0.3ms)  INSERT INTO "audit_events" ("author_id", "entity_id", "entity_type", "details", "ip_address", "author_name", "entity_path", "target_details", "created_at", "target_type", "target_id")
 VALUES (1, 64, 'User', '---
:event_name: user_blocked
:author_name: Administrator
:author_class: User
:target_id: 64
:target_type: User
:target_details: service_account_7c1458bd212e51a6aa448ac2a6dab710
:custom_message: Blocked user
:ip_address: 127.0.0.1
:entity_path: service_account_7c1458bd212e51a6aa448ac2a6dab710
', '127.0.0.1/32', 'Administrator', 'service_account_7c1458bd212e51a6aa448ac2a6dab710', 'service_account_7c1458bd212e51a6aa448ac2a6dab710', '2024-12-13 00:38:18.788659', 'User', 64) RETURNING "id" /*application:w
eb,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/audit/auditor.rb:187:in `log_to_da
tabase'*/
  ↳ lib/gitlab/audit/auditor.rb:187:in `log_to_database'
  TRANSACTION (0.1ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  TRANSACTION (0.2ms)  BEGIN /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/l
ib/gitlab/audit/logging.rb:25:in `log_event'*/
  ↳ lib/gitlab/audit/logging.rb:25:in `log_event'
  AuditEvents::UserAuditEvent Create (0.7ms)  INSERT INTO "user_audit_events" ("id", "created_at", "user_id", "author_id", "target_id", "event_name", "details", "ip_address", "author_name", "entity_path", "target
_details", "target_type") VALUES (1260, '2024-12-13 00:38:18.788659', 64, 1, 64, 'user_blocked', '---
:event_name: user_blocked
:author_name: Administrator
:author_class: User
:target_id: 64
:target_type: User
:target_details: service_account_7c1458bd212e51a6aa448ac2a6dab710
:custom_message: Blocked user
:ip_address: 127.0.0.1
:entity_path: service_account_7c1458bd212e51a6aa448ac2a6dab710
', '127.0.0.1/32', 'Administrator', 'service_account_7c1458bd212e51a6aa448ac2a6dab710', 'service_account_7c1458bd212e51a6aa448ac2a6dab710', 'User') RETURNING "id" /*application:web,correlation_id:01JEYQ7D375GCFPX
R3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/lib/gitlab/audit/logging.rb:25:in `log_event'*/
  ↳ lib/gitlab/audit/logging.rb:25:in `log_event'
  TRANSACTION (0.4ms)  COMMIT /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/
lib/gitlab/database.rb:428:in `commit'*/
  ↳ lib/gitlab/database.rb:428:in `commit'
  User Load (0.4ms)  SELECT "users"."id", "users"."email", "users"."encrypted_password", "users"."reset_password_token", "users"."reset_password_sent_at", "users"."remember_created_at", "users"."sign_in_count", "
users"."current_sign_in_at", "users"."last_sign_in_at", "users"."current_sign_in_ip", "users"."last_sign_in_ip", "users"."created_at", "users"."updated_at", "users"."name", "users"."admin", "users"."projects_limi
t", "users"."failed_attempts", "users"."locked_at", "users"."username", "users"."can_create_group", "users"."can_create_team", "users"."state", "users"."color_scheme_id", "users"."password_expires_at", "users"."c
reated_by_id", "users"."last_credential_check_at", "users"."avatar", "users"."confirmation_token", "users"."confirmed_at", "users"."confirmation_sent_at", "users"."unconfirmed_email", "users"."hide_no_ssh_key", "
users"."admin_email_unsubscribed_at", "users"."notification_email", "users"."hide_no_password", "users"."password_automatically_set", "users"."encrypted_otp_secret", "users"."encrypted_otp_secret_iv", "users"."en
crypted_otp_secret_salt", "users"."otp_required_for_login", "users"."otp_backup_codes", "users"."public_email", "users"."dashboard", "users"."project_view", "users"."consumed_timestep", "users"."layout", "users".
"hide_project_limit", "users"."note", "users"."unlock_token", "users"."otp_grace_period_started_at", "users"."external", "users"."incoming_email_token", "users"."auditor", "users"."require_two_factor_authenticati
on_from_group", "users"."two_factor_grace_period", "users"."last_activity_on", "users"."notified_of_own_activity", "users"."preferred_language", "users"."theme_id", "users"."accepted_term_id", "users"."feed_token
", "users"."private_profile", "users"."roadmap_layout", "users"."include_private_contributions", "users"."commit_email", "users"."group_view", "users"."managing_group_id", "users"."first_name", "users"."last_name
", "users"."static_object_token", "users"."role", "users"."user_type", "users"."static_object_token_encrypted", "users"."otp_secret_expires_at", "users"."onboarding_in_progress", "users"."color_mode_id", "users".
"composite_identity_enforced" FROM "users" WHERE "users"."id" = 64 ORDER BY "users"."id" ASC LIMIT 1000 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController
#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/app/models/ee/audit_event.rb:85:in `block in lazy_entity'*/
  ↳ app/models/concerns/use_sql_function_for_primary_key_lookups.rb:8:in `_query_by_sql'
  AuditEvents::InstanceExternalAuditEventDestination Exists? (0.2ms)  SELECT 1 AS one FROM "audit_events_instance_external_audit_event_destinations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1D
MFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `stream
able?'*/
  ↳ ee/lib/audit_events/strategies/instance_external_destination_strategy.rb:8:in `streamable?'
  AuditEvents::Instance::GoogleCloudLoggingConfiguration Exists? (0.2ms)  SELECT 1 AS one FROM "audit_events_instance_google_cloud_logging_configurations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPX
R3KH1DMFNW,endpoint_id:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strate
gy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/google_cloud_logging_destination_strategy.rb:9:in `streamable?'
  AuditEvents::Instance::AmazonS3Configuration Exists? (0.1ms)  SELECT 1 AS one FROM "audit_events_instance_amazon_s3_configurations" LIMIT 1 /*application:web,correlation_id:01JEYQ7D375GCFPXR3KH1DMFNW,endpoint_i
d:Admin::Ai::AmazonQSettingsController#create,db_config_database:gitlabhq_development,db_config_name:main,line:/ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'*/
  ↳ ee/lib/audit_events/strategies/instance/amazon_s3_destination_strategy.rb:9:in `streamable?'
Redirected to https://gdk.test:3443/admin/ai/amazon_q_settings
Completed 302 Found in 1868ms (ActiveRecord: 64.6ms | Elasticsearch: 0.0ms | Allocations: 391013)
Edited by Paul Slaughter

Merge request reports

Loading