Full Code of UffizziCloud/uffizzi for AI

develop a57ce80acba3 cached
713 files
857.5 KB
241.6k tokens
1238 symbols
1 requests
Download .txt
Showing preview only (1,046K chars total). Download the full file or copy to clipboard to get everything.
Repository: UffizziCloud/uffizzi
Branch: develop
Commit: a57ce80acba3
Files: 713
Total size: 857.5 KB

Directory structure:
gitextract_iyyaf1qh/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── helm-release.yml
│       ├── main.yml
│       └── release.yml
├── .gitignore
├── .rubocop.yml
├── .ruby-version
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Gemfile
├── INSTALL.md
├── LICENSE
├── Makefile
├── README.md
├── Rakefile
├── app/
│   ├── assets/
│   │   ├── config/
│   │   │   └── manifest.js
│   │   ├── fonts/
│   │   │   └── mtiFontTrackingCode.js
│   │   ├── images/
│   │   │   └── .keep
│   │   └── stylesheets/
│   │       └── application.css
│   ├── channels/
│   │   └── application_cable/
│   │       ├── channel.rb
│   │       └── connection.rb
│   ├── controllers/
│   │   ├── application_controller.rb
│   │   └── concerns/
│   │       └── .keep
│   ├── helpers/
│   │   └── application_helper.rb
│   ├── javascript/
│   │   ├── channels/
│   │   │   ├── consumer.js
│   │   │   └── index.js
│   │   └── packs/
│   │       └── application.js
│   ├── jobs/
│   │   └── application_job.rb
│   ├── mailers/
│   │   └── application_mailer.rb
│   ├── models/
│   │   ├── application_record.rb
│   │   └── concerns/
│   │       └── .keep
│   └── views/
│       └── layouts/
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── bin/
│   ├── rails
│   ├── rake
│   ├── setup
│   └── yarn
├── charts/
│   └── uffizzi-app/
│       ├── Chart.yaml
│       ├── README.md
│       ├── templates/
│       │   ├── configmap-common.yaml
│       │   ├── configmap-sidekiq.yaml
│       │   ├── configmap-web.yaml
│       │   ├── secret-web.yaml
│       │   ├── sidekiq-deployment.yaml
│       │   ├── web-deployment.yaml
│       │   ├── web-ingress.yaml
│       │   └── web-service.yaml
│       └── values.yaml
├── ci/
│   ├── github-actions/
│   │   └── README.md
│   └── gitlab/
│       └── README.md
├── config/
│   ├── application.rb
│   ├── boot.rb
│   ├── cable.yml
│   ├── credentials.yml.enc
│   ├── database.yml
│   ├── environment.rb
│   ├── environments/
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers/
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── content_security_policy.rb
│   │   ├── cookies_serializer.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── health_check.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── sidekiq.rb
│   │   └── wrap_parameters.rb
│   ├── locales/
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   ├── settings.yml
│   ├── sidekiq.yml
│   └── storage.yml
├── config.ru
├── core/
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── Dockerfile
│   ├── Gemfile
│   ├── LICENSE
│   ├── Makefile
│   ├── README.md
│   ├── Rakefile
│   ├── app/
│   │   ├── assets/
│   │   │   ├── config/
│   │   │   │   └── uffizzi_core_manifest.js
│   │   │   ├── images/
│   │   │   │   └── uffizzi_core/
│   │   │   │       └── .keep
│   │   │   └── stylesheets/
│   │   │       └── uffizzi_core/
│   │   │           └── application.css
│   │   ├── clients/
│   │   │   └── uffizzi_core/
│   │   │       ├── amazon_registry_client.rb
│   │   │       ├── azure_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── azure_registry_client.rb
│   │   │       ├── container_registry_request_decorator.rb
│   │   │       ├── controller_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── controller_client.rb
│   │   │       ├── docker_hub_client/
│   │   │       │   ├── not_authorized_error.rb
│   │   │       │   └── request_result.rb
│   │   │       ├── docker_hub_client.rb
│   │   │       ├── docker_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── docker_registry_client.rb
│   │   │       ├── github_container_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── github_container_registry_client.rb
│   │   │       ├── google_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       └── google_registry_client.rb
│   │   ├── contexts/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_context.rb
│   │   │       ├── base_context.rb
│   │   │       ├── project/
│   │   │       │   └── cluster_context.rb
│   │   │       ├── project_context.rb
│   │   │       └── webhooks_context.rb
│   │   ├── controller_modules/
│   │   │   └── uffizzi_core/
│   │   │       └── api/
│   │   │           └── cli/
│   │   │               └── v1/
│   │   │                   ├── accounts_controller_module.rb
│   │   │                   ├── projects/
│   │   │                   │   ├── clusters_controller_module.rb
│   │   │                   │   └── deployments_controller_module.rb
│   │   │                   └── projects_controller_module.rb
│   │   ├── controllers/
│   │   │   ├── concerns/
│   │   │   │   └── uffizzi_core/
│   │   │   │       ├── auth_management.rb
│   │   │   │       ├── authorization_concern.rb
│   │   │   │       └── dependency_injection_concern.rb
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   ├── clusters_controller.rb
│   │   │       │           │   ├── credentials_controller.rb
│   │   │       │           │   └── projects_controller.rb
│   │   │       │           ├── accounts_controller.rb
│   │   │       │           ├── application_controller.rb
│   │   │       │           ├── ci/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   └── sessions_controller.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   ├── clusters/
│   │   │       │           │   │   ├── application_controller.rb
│   │   │       │           │   │   └── ingresses_controller.rb
│   │   │       │           │   ├── clusters_controller.rb
│   │   │       │           │   ├── compose_files_controller.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_items_controller.rb
│   │   │       │           │   │   ├── application_controller.rb
│   │   │       │           │   │   ├── containers/
│   │   │       │           │   │   │   ├── application_controller.rb
│   │   │       │           │   │   │   └── logs_controller.rb
│   │   │       │           │   │   ├── containers_controller.rb
│   │   │       │           │   │   └── events_controller.rb
│   │   │       │           │   ├── deployments_controller.rb
│   │   │       │           │   └── secrets_controller.rb
│   │   │       │           ├── projects_controller.rb
│   │   │       │           └── sessions_controller.rb
│   │   │       └── application_controller.rb
│   │   ├── errors/
│   │   │   └── uffizzi_core/
│   │   │       ├── cluster_scale_error.rb
│   │   │       ├── compose_file/
│   │   │       │   ├── build_error.rb
│   │   │       │   ├── credential_error.rb
│   │   │       │   ├── parse_error.rb
│   │   │       │   └── secrets_error.rb
│   │   │       ├── compose_file_error.rb
│   │   │       ├── container_registry_error.rb
│   │   │       ├── deployment/
│   │   │       │   └── image_pull_error.rb
│   │   │       ├── deployment_not_found_error.rb
│   │   │       └── registry_not_supported_error.rb
│   │   ├── forms/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── account/
│   │   │       │           │   └── credential/
│   │   │       │           │       ├── check_credential_form.rb
│   │   │       │           │       ├── create_form.rb
│   │   │       │           │       └── update_form.rb
│   │   │       │           ├── cluster/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── sync_form.rb
│   │   │       │           ├── compose_file/
│   │   │       │           │   ├── check_credentials_form.rb
│   │   │       │           │   ├── cli_form.rb
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   ├── template_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── config_file/
│   │   │       │           │   └── create_form.rb
│   │   │       │           ├── deployment/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── project/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── secret/
│   │   │       │           │   └── bulk_assign_form.rb
│   │   │       │           ├── session_create_form.rb
│   │   │       │           └── template/
│   │   │       │               └── create_form.rb
│   │   │       ├── application_form.rb
│   │   │       ├── application_form_without_active_record.rb
│   │   │       └── mass_assignment_control_concern.rb
│   │   ├── helpers/
│   │   │   └── uffizzi_core/
│   │   │       └── application_helper.rb
│   │   ├── jobs/
│   │   │   └── uffizzi_core/
│   │   │       ├── account/
│   │   │       │   ├── create_credential_job.rb
│   │   │       │   └── update_credential_job.rb
│   │   │       ├── activity_item/
│   │   │       │   └── docker/
│   │   │       │       └── update_digest_job.rb
│   │   │       ├── application_job.rb
│   │   │       ├── cluster/
│   │   │       │   ├── delete_job.rb
│   │   │       │   ├── deploy_job.rb
│   │   │       │   ├── manage_deploying_job.rb
│   │   │       │   ├── manage_scaling_down_job.rb
│   │   │       │   └── manage_scaling_up_job.rb
│   │   │       ├── config_file/
│   │   │       │   └── apply_job.rb
│   │   │       └── deployment/
│   │   │           ├── create_credential_job.rb
│   │   │           ├── create_credentials_job.rb
│   │   │           ├── create_job.rb
│   │   │           ├── delete_credential_job.rb
│   │   │           ├── delete_job.rb
│   │   │           ├── deploy_containers_job.rb
│   │   │           ├── manage_deploy_activity_item_job.rb
│   │   │           └── update_credential_job.rb
│   │   ├── lib/
│   │   │   └── uffizzi_core/
│   │   │       ├── concerns/
│   │   │       │   └── models/
│   │   │       │       ├── account.rb
│   │   │       │       ├── activity_item.rb
│   │   │       │       ├── cluster.rb
│   │   │       │       ├── comment.rb
│   │   │       │       ├── compose_file.rb
│   │   │       │       ├── config_file.rb
│   │   │       │       ├── container.rb
│   │   │       │       ├── container_config_file.rb
│   │   │       │       ├── container_host_volume_file.rb
│   │   │       │       ├── coupon.rb
│   │   │       │       ├── credential.rb
│   │   │       │       ├── deployment.rb
│   │   │       │       ├── deployment_event.rb
│   │   │       │       ├── event.rb
│   │   │       │       ├── host_volume_file.rb
│   │   │       │       ├── kubernetes_distribution.rb
│   │   │       │       ├── membership.rb
│   │   │       │       ├── payment.rb
│   │   │       │       ├── price.rb
│   │   │       │       ├── product.rb
│   │   │       │       ├── project.rb
│   │   │       │       ├── rating.rb
│   │   │       │       ├── repo.rb
│   │   │       │       ├── role.rb
│   │   │       │       ├── secret.rb
│   │   │       │       ├── template.rb
│   │   │       │       ├── user.rb
│   │   │       │       └── user_project.rb
│   │   │       └── rbac/
│   │   │           └── user_access_service.rb
│   │   ├── mailers/
│   │   │   └── uffizzi_core/
│   │   │       └── application_mailer.rb
│   │   ├── models/
│   │   │   ├── concerns/
│   │   │   │   └── uffizzi_core/
│   │   │   │       ├── hashid_concern.rb
│   │   │   │       └── state_machine_concern.rb
│   │   │   └── uffizzi_core/
│   │   │       ├── account.rb
│   │   │       ├── activity_item/
│   │   │       │   ├── docker.rb
│   │   │       │   ├── github.rb
│   │   │       │   └── memory_limit.rb
│   │   │       ├── activity_item.rb
│   │   │       ├── application_record.rb
│   │   │       ├── cluster.rb
│   │   │       ├── comment.rb
│   │   │       ├── compose_file.rb
│   │   │       ├── config_file.rb
│   │   │       ├── container.rb
│   │   │       ├── container_config_file.rb
│   │   │       ├── container_host_volume_file.rb
│   │   │       ├── continuous_preview.rb
│   │   │       ├── coupon.rb
│   │   │       ├── credential/
│   │   │       │   ├── amazon.rb
│   │   │       │   ├── azure.rb
│   │   │       │   ├── docker_hub.rb
│   │   │       │   ├── docker_registry.rb
│   │   │       │   ├── github_container_registry.rb
│   │   │       │   └── google.rb
│   │   │       ├── credential.rb
│   │   │       ├── database.rb
│   │   │       ├── database_offering.rb
│   │   │       ├── deployment.rb
│   │   │       ├── deployment_event.rb
│   │   │       ├── event.rb
│   │   │       ├── host_volume_file.rb
│   │   │       ├── kubernetes_distribution.rb
│   │   │       ├── membership.rb
│   │   │       ├── payment.rb
│   │   │       ├── price.rb
│   │   │       ├── product.rb
│   │   │       ├── project.rb
│   │   │       ├── rating.rb
│   │   │       ├── repo/
│   │   │       │   ├── amazon.rb
│   │   │       │   ├── azure.rb
│   │   │       │   ├── docker_hub.rb
│   │   │       │   ├── docker_registry.rb
│   │   │       │   ├── github_container_registry.rb
│   │   │       │   └── google.rb
│   │   │       ├── repo.rb
│   │   │       ├── role.rb
│   │   │       ├── secret.rb
│   │   │       ├── template.rb
│   │   │       ├── user.rb
│   │   │       └── user_project.rb
│   │   ├── policies/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── clusters_policy.rb
│   │   │       │           │   ├── credentials_policy.rb
│   │   │       │           │   └── projects_policy.rb
│   │   │       │           ├── accounts_policy.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── clusters/
│   │   │       │           │   │   └── ingresses_policy.rb
│   │   │       │           │   ├── clusters_policy.rb
│   │   │       │           │   ├── compose_files_policy.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_items_policy.rb
│   │   │       │           │   │   ├── containers_policy.rb
│   │   │       │           │   │   └── events_policy.rb
│   │   │       │           │   ├── deployments_policy.rb
│   │   │       │           │   └── secrets_policy.rb
│   │   │       │           └── projects_policy.rb
│   │   │       └── application_policy.rb
│   │   ├── repositories/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_repo.rb
│   │   │       ├── activity_item_repo.rb
│   │   │       ├── basic_order_repo.rb
│   │   │       ├── cluster_repo.rb
│   │   │       ├── comment_repo.rb
│   │   │       ├── compose_file_repo.rb
│   │   │       ├── config_file_repo.rb
│   │   │       ├── container_repo.rb
│   │   │       ├── credential_repo.rb
│   │   │       ├── deployment_repo.rb
│   │   │       ├── event_repo.rb
│   │   │       ├── host_volume_file_repo.rb
│   │   │       ├── membership_repo.rb
│   │   │       ├── price_repo.rb
│   │   │       ├── product_repo.rb
│   │   │       ├── project_repo.rb
│   │   │       ├── repo_repo.rb
│   │   │       ├── template_repo.rb
│   │   │       ├── usage_repo.rb
│   │   │       └── user_repo.rb
│   │   ├── responders/
│   │   │   └── uffizzi_core/
│   │   │       └── json_responder.rb
│   │   ├── serializers/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── account_serializer.rb
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── cluster_serializer/
│   │   │       │           │   │   └── project_serializer.rb
│   │   │       │           │   ├── cluster_serializer.rb
│   │   │       │           │   ├── credential_serializer.rb
│   │   │       │           │   └── project_serializer.rb
│   │   │       │           ├── project_serializer/
│   │   │       │           │   ├── account_serializer.rb
│   │   │       │           │   ├── compose_file_serializer.rb
│   │   │       │           │   └── deployment_serializer.rb
│   │   │       │           ├── project_serializer.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── cluster_serializer.rb
│   │   │       │           │   ├── compose_file_serializer.rb
│   │   │       │           │   ├── deployment_serializer/
│   │   │       │           │   │   ├── container_serializer.rb
│   │   │       │           │   │   └── user_serializer.rb
│   │   │       │           │   ├── deployment_serializer.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_item_serializer.rb
│   │   │       │           │   │   ├── container_serializer/
│   │   │       │           │   │   │   ├── container_config_file_serializer/
│   │   │       │           │   │   │   │   └── config_file_serializer.rb
│   │   │       │           │   │   │   └── container_config_file_serializer.rb
│   │   │       │           │   │   └── container_serializer.rb
│   │   │       │           │   ├── deployments_serializer/
│   │   │       │           │   │   └── user_serializer.rb
│   │   │       │           │   ├── deployments_serializer.rb
│   │   │       │           │   ├── secret_serializer.rb
│   │   │       │           │   └── short_cluster_serializer.rb
│   │   │       │           ├── short_project_serializer.rb
│   │   │       │           ├── user_serializer/
│   │   │       │           │   └── account_serializer.rb
│   │   │       │           └── user_serializer.rb
│   │   │       ├── base_serializer.rb
│   │   │       └── controller/
│   │   │           ├── apply_config_file/
│   │   │           │   └── config_file_serializer.rb
│   │   │           ├── create_cluster/
│   │   │           │   └── cluster_serializer.rb
│   │   │           ├── create_credential/
│   │   │           │   └── credential_serializer.rb
│   │   │           ├── create_deployment/
│   │   │           │   └── deployment_serializer.rb
│   │   │           ├── deploy_containers/
│   │   │           │   ├── compose_file_serializer.rb
│   │   │           │   ├── container_serializer/
│   │   │           │   │   ├── container_config_file_serializer/
│   │   │           │   │   │   └── config_file_serializer.rb
│   │   │           │   │   ├── container_config_file_serializer.rb
│   │   │           │   │   └── container_host_volume_file_serializer.rb
│   │   │           │   ├── container_serializer.rb
│   │   │           │   ├── credential_serializer.rb
│   │   │           │   └── host_volume_file_serializer.rb
│   │   │           └── update_cluster/
│   │   │               └── cluster_serializer.rb
│   │   ├── services/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_service.rb
│   │   │       ├── activity_item_service.rb
│   │   │       ├── ci_service.rb
│   │   │       ├── cluster_service.rb
│   │   │       ├── compose_file/
│   │   │       │   ├── builders/
│   │   │       │   │   ├── container_builder_service.rb
│   │   │       │   │   ├── container_config_files_builder_service.rb
│   │   │       │   │   ├── container_host_volume_files_builder_service.rb
│   │   │       │   │   ├── docker_repo_builder_service.rb
│   │   │       │   │   ├── template_builder_service.rb
│   │   │       │   │   └── variables_builder_service.rb
│   │   │       │   ├── config_files_service.rb
│   │   │       │   ├── config_option_service.rb
│   │   │       │   ├── container_service.rb
│   │   │       │   ├── dependencies_service.rb
│   │   │       │   ├── errors_service.rb
│   │   │       │   ├── github_dependencies_service.rb
│   │   │       │   ├── host_volume_files_service.rb
│   │   │       │   ├── parsers/
│   │   │       │   │   ├── configs_parser_service.rb
│   │   │       │   │   ├── continuous_preview_parser_service.rb
│   │   │       │   │   ├── ingress_parser_service.rb
│   │   │       │   │   ├── named_volumes_parser_service.rb
│   │   │       │   │   ├── secrets_parser_service.rb
│   │   │       │   │   ├── services/
│   │   │       │   │   │   ├── command_parser_service.rb
│   │   │       │   │   │   ├── configs_parser_service.rb
│   │   │       │   │   │   ├── deploy_parser_service.rb
│   │   │       │   │   │   ├── entrypoint_parser_service.rb
│   │   │       │   │   │   ├── env_file_parser_service.rb
│   │   │       │   │   │   ├── environment_parser_service.rb
│   │   │       │   │   │   ├── healthcheck_parser_service.rb
│   │   │       │   │   │   ├── image_parser_service.rb
│   │   │       │   │   │   ├── secrets_parser_service.rb
│   │   │       │   │   │   └── volumes_parser_service.rb
│   │   │       │   │   ├── services_parser_service.rb
│   │   │       │   │   └── variables_parser_service.rb
│   │   │       │   └── template_service.rb
│   │   │       ├── compose_file_service.rb
│   │   │       ├── container_registry/
│   │   │       │   ├── amazon_service.rb
│   │   │       │   ├── azure_service.rb
│   │   │       │   ├── docker_hub_service.rb
│   │   │       │   ├── docker_registry_service.rb
│   │   │       │   ├── github_container_registry_service.rb
│   │   │       │   └── google_service.rb
│   │   │       ├── container_registry_service.rb
│   │   │       ├── container_service.rb
│   │   │       ├── controller_service.rb
│   │   │       ├── controller_settings_service.rb
│   │   │       ├── deployment/
│   │   │       │   ├── domain_service.rb
│   │   │       │   └── memory_service.rb
│   │   │       ├── deployment_service.rb
│   │   │       ├── logs_service.rb
│   │   │       ├── manage_activity_items_service.rb
│   │   │       ├── project_service.rb
│   │   │       ├── repo_service.rb
│   │   │       ├── response_service.rb
│   │   │       ├── template/
│   │   │       │   └── memory_service.rb
│   │   │       ├── token_service.rb
│   │   │       ├── user_access_service.rb
│   │   │       └── user_generator_service.rb
│   │   ├── utils/
│   │   │   └── uffizzi_core/
│   │   │       └── converters.rb
│   │   └── validators/
│   │       └── uffizzi_core/
│   │           ├── email_validator.rb
│   │           ├── environment_variable_list_validator.rb
│   │           └── image_command_args_validator.rb
│   ├── bin/
│   │   └── rails
│   ├── config/
│   │   ├── initializers/
│   │   │   ├── rswag_api.rb
│   │   │   ├── rswag_ui.rb
│   │   │   └── swagger_yard.rb
│   │   ├── locales/
│   │   │   ├── en.activerecord.yml
│   │   │   └── en.yml
│   │   └── routes.rb
│   ├── db/
│   │   ├── migrate/
│   │   │   ├── 20220218121438_create_uffizzi_core_tables.rb
│   │   │   ├── 20220309110201_remove_secrets_from_projects.rb
│   │   │   ├── 20220310110150_create_project_secrets.rb
│   │   │   ├── 20220325113342_add_name_to_uffizzi_containers.rb
│   │   │   ├── 20220329123323_rename_project_secrets_to_secrets.rb
│   │   │   ├── 20220329124542_add_resource_to_secrets.rb
│   │   │   ├── 20220329143241_remove_project_ref_from_secrets.rb
│   │   │   ├── 20220419074956_add_health_check_to_containers.rb
│   │   │   ├── 20220422151523_add_volumes_to_uffizzi_core_containers.rb
│   │   │   ├── 20220525113412_rename_name_to_uffizzi_containers.rb
│   │   │   ├── 20220704135629_add_disabled_at_to_deployments.rb
│   │   │   ├── 20220805164628_add_metadata_to_deployment.rb
│   │   │   ├── 20220901110752_create_host_volume_files.rb
│   │   │   ├── 20220901165313_create_container_host_volume_files.rb
│   │   │   ├── 20220927113647_add_additional_subdomains_to_containers.rb
│   │   │   ├── 20230111000000_add_state_to_memberships.rb
│   │   │   ├── 20230306142513_add_last_deploy_at_to_deployments.rb
│   │   │   ├── 20230406154451_add_full_image_name_to_container.rb
│   │   │   ├── 20230531135739_create_deployment_events.rb
│   │   │   ├── 20230613101901_create_clusters.rb
│   │   │   ├── 20230711101901_add_host_to_clusters.rb
│   │   │   ├── 20230810140316_add_source_to_uffizzi_core_clusters.rb
│   │   │   ├── 20230824150022_update_name_constraint_to_projects.rb
│   │   │   ├── 20231009162719_create_uffizzi_core_kubernetes_distributions.rb
│   │   │   ├── 20231009182412_add_kubernetes_distribution_id_to_uffizzi_core_clusters.rb
│   │   │   ├── 20240301200235_add_node_selector_to_cluster.rb
│   │   │   └── 20240314170113_delete_node_selector_from_cluster.rb
│   │   └── seeds.rb
│   ├── lib/
│   │   ├── tasks/
│   │   │   └── uffizzi_core_tasks.rake
│   │   ├── uffizzi_core/
│   │   │   ├── engine.rb
│   │   │   └── version.rb
│   │   └── uffizzi_core.rb
│   ├── swagger/
│   │   └── v1/
│   │       └── swagger.json
│   ├── test/
│   │   ├── controllers/
│   │   │   └── uffizzi_core/
│   │   │       └── api/
│   │   │           └── cli/
│   │   │               └── v1/
│   │   │                   ├── accounts/
│   │   │                   │   ├── clusters_controller_test.rb
│   │   │                   │   ├── credentials_controller_test.rb
│   │   │                   │   └── projects_controller_test.rb
│   │   │                   ├── accounts_controller_test.rb
│   │   │                   ├── projects/
│   │   │                   │   ├── clusters/
│   │   │                   │   │   └── ingresses_controller_test.rb
│   │   │                   │   ├── clusters_controller_test.rb
│   │   │                   │   ├── compose_files_controller_test.rb
│   │   │                   │   ├── deployments/
│   │   │                   │   │   ├── activity_items_controller_test.rb
│   │   │                   │   │   ├── containers/
│   │   │                   │   │   │   └── logs_controller_test.rb
│   │   │                   │   │   ├── containers_controller_test.rb
│   │   │                   │   │   └── events_controller_test.rb
│   │   │                   │   ├── deployments_controller/
│   │   │                   │   │   ├── create_test.rb
│   │   │                   │   │   ├── deploy_containers_test.rb
│   │   │                   │   │   ├── destroy_test.rb
│   │   │                   │   │   └── update_test.rb
│   │   │                   │   └── secrets_controller_test.rb
│   │   │                   ├── projects_controller_test.rb
│   │   │                   └── sessions_controller_test.rb
│   │   ├── dummy/
│   │   │   ├── Rakefile
│   │   │   ├── app/
│   │   │   │   ├── assets/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── manifest.js
│   │   │   │   │   ├── images/
│   │   │   │   │   │   └── .keep
│   │   │   │   │   └── stylesheets/
│   │   │   │   │       └── application.css
│   │   │   │   ├── channels/
│   │   │   │   │   └── application_cable/
│   │   │   │   │       ├── channel.rb
│   │   │   │   │       └── connection.rb
│   │   │   │   ├── controllers/
│   │   │   │   │   ├── application_controller.rb
│   │   │   │   │   └── concerns/
│   │   │   │   │       └── .keep
│   │   │   │   ├── helpers/
│   │   │   │   │   └── application_helper.rb
│   │   │   │   ├── javascript/
│   │   │   │   │   └── packs/
│   │   │   │   │       └── application.js
│   │   │   │   ├── jobs/
│   │   │   │   │   └── application_job.rb
│   │   │   │   ├── mailers/
│   │   │   │   │   └── application_mailer.rb
│   │   │   │   ├── models/
│   │   │   │   │   ├── application_record.rb
│   │   │   │   │   └── concerns/
│   │   │   │   │       └── .keep
│   │   │   │   └── views/
│   │   │   │       └── layouts/
│   │   │   │           ├── application.html.erb
│   │   │   │           ├── mailer.html.erb
│   │   │   │           └── mailer.text.erb
│   │   │   ├── bin/
│   │   │   │   ├── rails
│   │   │   │   ├── rake
│   │   │   │   ├── setup
│   │   │   │   └── spring
│   │   │   ├── config/
│   │   │   │   ├── application.rb
│   │   │   │   ├── boot.rb
│   │   │   │   ├── cable.yml
│   │   │   │   ├── database.yml
│   │   │   │   ├── environment.rb
│   │   │   │   ├── environments/
│   │   │   │   │   ├── development.rb
│   │   │   │   │   ├── production.rb
│   │   │   │   │   └── test.rb
│   │   │   │   ├── initializers/
│   │   │   │   │   ├── application_controller_renderer.rb
│   │   │   │   │   ├── assets.rb
│   │   │   │   │   ├── backtrace_silencers.rb
│   │   │   │   │   ├── config.rb
│   │   │   │   │   ├── content_security_policy.rb
│   │   │   │   │   ├── cookies_serializer.rb
│   │   │   │   │   ├── filter_parameter_logging.rb
│   │   │   │   │   ├── inflections.rb
│   │   │   │   │   ├── mime_types.rb
│   │   │   │   │   ├── octokit.rb
│   │   │   │   │   ├── permissions_policy.rb
│   │   │   │   │   └── wrap_parameters.rb
│   │   │   │   ├── locales/
│   │   │   │   │   └── en.yml
│   │   │   │   ├── puma.rb
│   │   │   │   ├── routes.rb
│   │   │   │   ├── settings.yml
│   │   │   │   ├── spring.rb
│   │   │   │   └── storage.yml
│   │   │   ├── config.ru
│   │   │   ├── db/
│   │   │   │   └── schema.rb
│   │   │   ├── lib/
│   │   │   │   └── assets/
│   │   │   │       └── .keep
│   │   │   ├── log/
│   │   │   │   └── .keep
│   │   │   └── public/
│   │   │       ├── 404.html
│   │   │       ├── 422.html
│   │   │       └── 500.html
│   │   ├── factories/
│   │   │   ├── account.rb
│   │   │   ├── activity_item.rb
│   │   │   ├── cluster.rb
│   │   │   ├── comments.rb
│   │   │   ├── compose_files.rb
│   │   │   ├── config_files.rb
│   │   │   ├── container_config_files.rb
│   │   │   ├── container_host_volume_files.rb
│   │   │   ├── containers.rb
│   │   │   ├── credentials.rb
│   │   │   ├── deployment.rb
│   │   │   ├── host_volume_files.rb
│   │   │   ├── kubernetes_distribution.rb
│   │   │   ├── membership.rb
│   │   │   ├── payments.rb
│   │   │   ├── project.rb
│   │   │   ├── ratings.rb
│   │   │   ├── repos.rb
│   │   │   ├── secrets.rb
│   │   │   ├── sequences.rb
│   │   │   ├── templates.rb
│   │   │   ├── user.rb
│   │   │   └── user_project.rb
│   │   ├── fixtures/
│   │   │   └── files/
│   │   │       ├── cluster/
│   │   │       │   └── manifest.yml
│   │   │       ├── compose_dependencies/
│   │   │       │   └── configs/
│   │   │       │       └── vote_conf.json
│   │   │       ├── compose_files/
│   │   │       │   ├── azure_services/
│   │   │       │   │   └── nginx.yml
│   │   │       │   ├── boolean_option.yml
│   │   │       │   ├── compose_empty.yml
│   │   │       │   ├── compose_memory.yml
│   │   │       │   ├── compose_vote_app_github.yml
│   │   │       │   ├── compose_with_continuous_preview.yml
│   │   │       │   ├── compose_with_only_line.yml
│   │   │       │   ├── compose_with_syntax_error.yml
│   │   │       │   ├── compose_with_volumes.yml
│   │   │       │   ├── compose_without_image.yml
│   │   │       │   ├── compose_without_services.yml
│   │   │       │   ├── config_file_dependencies.yml
│   │   │       │   ├── dockerhub_services/
│   │   │       │   │   ├── account_custom_image.yml
│   │   │       │   │   ├── nginx.yml
│   │   │       │   │   ├── nginx_auto_deploy_off.yml
│   │   │       │   │   ├── nginx_config_files.yml
│   │   │       │   │   ├── nginx_config_invalid_ingress_service.yml
│   │   │       │   │   ├── nginx_configs_long_syntax.yml
│   │   │       │   │   ├── nginx_configs_long_syntax_without_target.yml
│   │   │       │   │   ├── nginx_configs_short_syntax.yml
│   │   │       │   │   ├── nginx_configs_short_syntax_invalid_path.yml
│   │   │       │   │   ├── nginx_configs_short_syntax_unknown_config.yml
│   │   │       │   │   ├── nginx_cp_delete_after_integer.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_hours.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_max.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_min.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_postfix.yml
│   │   │       │   │   ├── nginx_env_file.yml
│   │   │       │   │   ├── nginx_env_file_duplicates.yml
│   │   │       │   │   ├── nginx_env_file_empty.yml
│   │   │       │   │   ├── nginx_env_file_empty_in_array.yml
│   │   │       │   │   ├── nginx_envs.yml
│   │   │       │   │   ├── nginx_ingress_port_non_integer.yml
│   │   │       │   │   ├── nginx_invalid_deploy_auto.yml
│   │   │       │   │   ├── nginx_invalid_memory.yml
│   │   │       │   │   ├── nginx_invalid_memory_min_value.yml
│   │   │       │   │   ├── nginx_invalid_memory_postfix.yml
│   │   │       │   │   ├── nginx_invalid_memory_type.yml
│   │   │       │   │   ├── nginx_invalid_port.yml
│   │   │       │   │   ├── nginx_uffizzi_ingress.yml
│   │   │       │   │   ├── nginx_with_continuous_preview_without_x-uffizzi.yml
│   │   │       │   │   ├── nginx_with_ingress_without_x-uffizzi.yml
│   │   │       │   │   ├── nginx_without_ingress.yml
│   │   │       │   │   ├── nginx_without_ingress_port.yml
│   │   │       │   │   ├── nginx_without_ingress_service.yml
│   │   │       │   │   ├── nginx_without_tag.yml
│   │   │       │   │   ├── postgres_secrets.yml
│   │   │       │   │   ├── postgres_secrets_duplicates.yml
│   │   │       │   │   ├── postgres_secrets_unknown.yml
│   │   │       │   │   ├── postgres_secrets_without_external.yml
│   │   │       │   │   ├── postgres_secrets_without_name.yml
│   │   │       │   │   ├── volumes_anonymous.yml
│   │   │       │   │   └── volumes_named.yml
│   │   │       │   ├── github_services/
│   │   │       │   │   └── hello_world.yml
│   │   │       │   ├── google_services/
│   │   │       │   │   ├── cloudsql.yml
│   │   │       │   │   ├── cloudsql_entrypoint.yml
│   │   │       │   │   └── nginx.yml
│   │   │       │   ├── healthcheck/
│   │   │       │   │   ├── array_command_success.yml
│   │   │       │   │   ├── disabled_healthcheck.yml
│   │   │       │   │   ├── healthcheck_with_disable.yml
│   │   │       │   │   ├── invalid_command.yml
│   │   │       │   │   ├── invalid_interval.yml
│   │   │       │   │   ├── invalid_options.yml
│   │   │       │   │   ├── invalid_retries.yml
│   │   │       │   │   └── string_command_success.yml
│   │   │       │   └── invalid_service.yml
│   │   │       ├── controller/
│   │   │       │   ├── cluster_asleep.json
│   │   │       │   ├── cluster_awake.json
│   │   │       │   ├── cluster_not_ready.json
│   │   │       │   ├── cluster_ready.json
│   │   │       │   ├── deployment_containers.json
│   │   │       │   ├── deployment_containers_with_error.json
│   │   │       │   ├── deployments.json
│   │   │       │   ├── ingresses.json
│   │   │       │   └── logs.json
│   │   │       ├── dockerhub/
│   │   │       │   ├── digest.json
│   │   │       │   ├── login_fail.json
│   │   │       │   ├── repository.json
│   │   │       │   └── webhooks/
│   │   │       │       └── push/
│   │   │       │           └── event_data.json
│   │   │       ├── github/
│   │   │       │   └── compose_files/
│   │   │       │       └── hello_world_compose_github_container_registry.json
│   │   │       ├── test-compose-full.yml
│   │   │       ├── test-compose-success-jfrog.yml
│   │   │       ├── test-compose-success-without-dependencies.yml
│   │   │       ├── test-compose-success.yml
│   │   │       ├── test-compose-without-images.yml
│   │   │       ├── uffizzi-compose-amazon.yml
│   │   │       ├── uffizzi-compose-azure.yml
│   │   │       ├── uffizzi-compose-docker-registry-anonymous.yml
│   │   │       ├── uffizzi-compose-dockerhub.yml
│   │   │       ├── uffizzi-compose-ghcr.yml
│   │   │       ├── uffizzi-compose-google.yml
│   │   │       ├── uffizzi-compose-invalid-service-name.yml
│   │   │       ├── uffizzi-compose-vote-app-docker-with-memory-request.yml
│   │   │       ├── uffizzi-compose-vote-app-docker.yml
│   │   │       ├── uffizzi-compose-vote-app-with-command-as-string.yml
│   │   │       ├── uffizzi-compose-with-host-volumes.yml
│   │   │       └── uffizzi-compose-with_alias.yml
│   │   ├── services/
│   │   │   ├── activity_item_service_test.rb
│   │   │   ├── compose_file_service_test.rb
│   │   │   ├── deployment_service_test.rb
│   │   │   ├── google_service_test.rb
│   │   │   ├── image_parser_service_test.rb
│   │   │   ├── manage_activity_items_service_test.rb
│   │   │   └── user_generator_service_test.rb
│   │   ├── support/
│   │   │   ├── azure_registry_stub_support.rb
│   │   │   ├── controller_stub_support.rb
│   │   │   ├── docker_hub_stub_support.rb
│   │   │   ├── docker_registry_stub_support.rb
│   │   │   ├── fixture_support.rb
│   │   │   ├── github_container_registry_support.rb
│   │   │   ├── google_registry_stub_support.rb
│   │   │   └── stub_support.rb
│   │   ├── test_helper.rb
│   │   └── uffizzi_core_test.rb
│   └── uffizzi_core.gemspec
├── db/
│   ├── migrate/
│   │   ├── 20220219114713_create_uffizzi_core_tables.uffizzi_core.rb
│   │   ├── 20220317112742_remove_secrets_from_projects.uffizzi_core.rb
│   │   ├── 20220317112743_create_project_secrets.uffizzi_core.rb
│   │   ├── 20220325113623_add_name_to_uffizzi_containers.uffizzi_core.rb
│   │   ├── 20220412133606_rename_project_secrets_to_secrets.uffizzi_core.rb
│   │   ├── 20220412133607_add_resource_to_secrets.uffizzi_core.rb
│   │   ├── 20220412133608_remove_project_ref_from_secrets.uffizzi_core.rb
│   │   ├── 20220420103952_add_health_check_to_containers.uffizzi_core.rb
│   │   ├── 20220527135654_rename_name_to_uffizzi_containers.uffizzi_core.rb
│   │   ├── 20220617184754_add_volumes_to_uffizzi_core_containers.uffizzi_core.rb
│   │   ├── 20220708093405_add_disabled_at_to_deployments.uffizzi_core.rb
│   │   ├── 20220817140346_add_metadata_to_deployment.uffizzi_core.rb
│   │   ├── 20220901110752_create_host_volume_files.rb
│   │   ├── 20220901165313_create_container_host_volume_files.rb
│   │   ├── 20220927113647_add_additional_subdomains_to_containers.rb
│   │   ├── 20230111000000_add_state_to_memberships.rb
│   │   ├── 20230306142805_add_last_deploy_at_to_deployments.uffizzi_core.rb
│   │   ├── 20230406154547_add_full_image_name_to_container.uffizzi_core.rb
│   │   ├── 20230531135739_create_deployment_events.rb
│   │   ├── 20230613110517_create_clusters.uffizzi_core.rb
│   │   ├── 20230711101901_add_host_to_clusters.rb
│   │   ├── 20230824150022_update_name_constraint_to_projects.rb
│   │   ├── 20231009103942_add_source_to_uffizzi_core_clusters.uffizzi_core.rb
│   │   ├── 20231009163516_create_uffizzi_core_kubernetes_distributions.uffizzi_core.rb
│   │   ├── 20231009201239_add_kubernetes_distribution_id_to_uffizzi_core_clusters.uffizzi_core.rb
│   │   ├── 20240301200916_add_node_selector_to_cluster.uffizzi_core.rb
│   │   └── 20240314170425_delete_node_selector_from_cluster.uffizzi_core.rb
│   ├── schema.rb
│   └── seeds.rb
├── docker-compose.yml
├── docs/
│   ├── continuous-previews.md
│   └── quickstart-guide.md
├── lib/
│   ├── assets/
│   │   └── .keep
│   └── tasks/
│       └── .keep
├── log/
│   └── .keep
├── public/
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   └── robots.txt
├── storage/
│   └── .keep
├── test/
│   ├── application_system_test_case.rb
│   ├── channels/
│   │   └── application_cable/
│   │       └── connection_test.rb
│   ├── controllers/
│   │   └── .keep
│   ├── fixtures/
│   │   ├── .keep
│   │   └── files/
│   │       └── .keep
│   ├── helpers/
│   │   └── .keep
│   ├── integration/
│   │   └── .keep
│   ├── mailers/
│   │   └── .keep
│   ├── models/
│   │   └── .keep
│   ├── system/
│   │   └── .keep
│   └── test_helper.rb
├── tmp/
│   └── .keep
├── uffizzi-compose-example.yml
└── vendor/
    └── .keep

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: Bug report
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Configuration:**
 - Browser [e.g. chrome, safari]
 - Version [e.g. 22]
 - Open Source, CLI, Cloud, Docker Desktop Extension

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: community-new
assignees: ''

---

**Tell us about your request**
A clear and concise description of what you want to happen or the change you would like to see

**Which service(s) is this request for?**
Let us know which product(s) you want this for - Open Source or Cloud solution or both?

**Tell us about the problem you're trying to solve. What are you trying to do, and why is it hard?**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Are you currently working around the issue?**
A clear and concise description of any alternative solutions or features you've considered or are using today.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/workflows/helm-release.yml
================================================
name: Release Helm Charts

on:
  push:
    branches:
      - main

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Configure Git
        run: |
          git config user.name "$GITHUB_ACTOR"
          git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

      - name: Run chart-releaser
        uses: helm/chart-releaser-action@v1.3.0
        env:
          CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"


================================================
FILE: .github/workflows/main.yml
================================================
name: Test, Lint, Build, and Publish Image
on:
  push:
    branches:
      - qa
      - develop
      - main
  pull_request:
    types: [opened,synchronize,reopened]
concurrency:
  group: ${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7.5
          bundler-cache: true
      - name: Run rubocop
        run: bundle exec rubocop
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Create env file
        uses: SpicyPizza/create-envfile@v1.3
      - name: Run tests
        run: docker-compose run --rm core bash -c "bundle install && bundle exec rails db:create && bundle exec rails test"
  build-and-push-some-branches:
    runs-on: ubuntu-latest
    needs:
      - lint
      - test
    if: ${{ github.ref_name == 'main' || github.ref_name == 'qa' || github.ref_name == 'develop' || github.event_name == 'pull_request' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Docker metadata
        id: meta
        uses: docker/metadata-action@v3
        with:
          images: uffizzi/app
          tags: |
            type=raw,value=latest,enable=${{ github.ref_name == 'main' }}
            type=ref,event=branch,enable=${{ github.ref_name == 'qa' || github.ref_name == 'develop' }}
            type=ref,event=pr
      - name: Build and Push Image to Docker Hub
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      - name: Update Docker Hub Description for Default Branch
        uses: peter-evans/dockerhub-description@v2.4.3
        if: ${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}
          repository: uffizzi/app
  notify:
    needs:
      - lint
      - test
      - build-and-push-some-branches
    if: ${{ always() }}
    runs-on: ubuntu-latest
    steps:
      - uses: technote-space/workflow-conclusion-action@v2
      - uses: 8398a7/action-slack@v3
        with:
          status: ${{ env.WORKFLOW_CONCLUSION }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: ${{ (github.ref_name == 'main' && env.WORKFLOW_CONCLUSION == 'success') || ((github.ref_name == 'main' || github.ref_name == 'qa' || github.ref_name == 'develop') && env.WORKFLOW_CONCLUSION == 'failure') }}



================================================
FILE: .github/workflows/release.yml
================================================
name: Uffizzi Core Release
on:
  push:
    tags:
      - core_v*
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.5.0
      - name: Create env file
        uses: SpicyPizza/create-envfile@v1.3
      - name: Release Gem
        run: docker compose run --rm core bash -c "make release_gem"
        env:
          RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: core
          push: true
          tags: uffizzi/core:${{ github.ref_name }}


================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
#   git config --global core.excludesfile '~/.gitignore_global'

# Ignore bundler config.
/.bundle

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
/db/*.sqlite3-*

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/
!/tmp/pids/.keep

# Ignore uploaded files in development.
/storage/*
!/storage/.keep

/public/assets
.byebug_history

# Ignore master key for decrypting credentials and more.
/config/master.key

/credentials/*.json
.env

# Ignore (intellij) idea config directory
/.idea


================================================
FILE: .rubocop.yml
================================================
require:
 - rubocop-minitest

AllCops:
  NewCops: disable
  SuggestExtensions: false
  Exclude:
    - core/test/dummy/**/*
    - db/schema.rb
    - vendor/**/*

Naming/AccessorMethodName:
  Description: Check the naming of accessor methods for get_/set_.
  Enabled: false

Naming/MethodParameterName:
  Enabled: false

Style/Alias:
  Description: 'Use alias_method instead of alias.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method'
  Enabled: false

Style/ArrayJoin:
  Description: 'Use Array#join instead of Array#*.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join'
  Enabled: false

Style/AsciiComments:
  Description: 'Use only ascii symbols in comments.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments'
  Enabled: false

Naming/AsciiIdentifiers:
  Description: 'Use only ascii symbols in identifiers.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers'
  Enabled: false

Style/Attr:
  Description: 'Checks for uses of Module#attr.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr'
  Enabled: false

Metrics/BlockNesting:
  Description: 'Avoid excessive block nesting'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count'
  Enabled: false

Style/CaseEquality:
  Description: 'Avoid explicit use of the case equality operator(===).'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality'
  Enabled: false

Style/CharacterLiteral:
  Description: 'Checks for uses of character literals.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals'
  Enabled: false

Style/ClassAndModuleChildren:
  Description: 'Checks style of children classes and modules.'
  Enabled: false

Metrics/ClassLength:
  Description: 'Avoid classes longer than 100 lines of code.'
  Enabled: false

Metrics/ModuleLength:
  Description: 'Avoid modules longer than 100 lines of code.'
  Enabled: false

Style/ClassVars:
  Description: 'Avoid the use of class variables.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars'
  Enabled: false

Style/CollectionMethods:
  Enabled: true
  PreferredMethods:
    find: detect
    inject: reduce
    collect: map
    find_all: select

Style/ColonMethodCall:
  Description: 'Do not use :: for method call.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons'
  Enabled: false

Style/CommentAnnotation:
  Description: >-
                 Checks formatting of special comments
                 (TODO, FIXME, OPTIMIZE, HACK, REVIEW).
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords'
  Enabled: false

Style/PreferredHashMethods:
  Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
  StyleGuide: '#hash-key'
  Enabled: false

Style/Documentation:
  Description: 'Document classes and non-namespace modules.'
  Enabled: false

Style/DoubleNegation:
  Description: 'Checks for uses of double negation (!!).'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang'
  Enabled: false

Style/EachWithObject:
  Description: 'Prefer `each_with_object` over `inject` or `reduce`.'
  Enabled: false

Style/EmptyLiteral:
  Description: 'Prefer literals to Array.new/Hash.new/String.new.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash'
  Enabled: false

Style/Encoding:
  Enabled: false

Style/EvenOdd:
  Description: 'Favor the use of Fixnum#even? && Fixnum#odd?'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
  Enabled: false

Naming/FileName:
  Description: 'Use snake_case for source file names.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files'
  Enabled: false

Style/FrozenStringLiteralComment:
  Description: >-
    Add the frozen_string_literal comment to the top of files
    to help transition from Ruby 2.3.0 to Ruby 3.0.
  Enabled: true

Style/FormatString:
  Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf'
  Enabled: false

Style/GlobalVars:
  Description: 'Do not introduce global variables.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars'
  Reference: 'http://www.zenspider.com/Languages/Ruby/QuickRef.html'
  Enabled: false

Style/GuardClause:
  Description: 'Check for conditionals that can be replaced with guard clauses'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
  Enabled: false

Style/IfUnlessModifier:
  Description: >-
                 Favor modifier if/unless usage when you have a
                 single-line body.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier'
  Enabled: false

Style/IfWithSemicolon:
  Description: 'Do not use if x; .... Use the ternary operator instead.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs'
  Enabled: false

Style/InlineComment:
  Description: 'Avoid inline comments.'
  Enabled: false

Style/Lambda:
  Description: 'Use the new lambda literal syntax for single-line blocks.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line'
  Enabled: false

Style/LambdaCall:
  Description: 'Use lambda.call(...) instead of lambda.(...).'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call'
  Enabled: false

Style/LineEndConcatenation:
  Description: >-
                 Use \ instead of + or << to concatenate two string literals at
                 line end.
  Enabled: false

Metrics/AbcSize:
  Description: >-
                 A calculated magnitude based on number of assignments,
                 branches, and conditions.
  Enabled: false

Metrics/BlockLength:
  CountComments: true
  Max: 50
  IgnoredMethods: []
  Exclude:
    - test/**/*
    - app/repositories/**/*
    - config/environments/**/*
    - core/test/**/*
    - core/app/repositories/**/*
    - core/config/routes.rb

Metrics/CyclomaticComplexity:
  Description: >-
                 A complexity metric that is strongly correlated to the number
                 of test cases needed to validate a method.
  Enabled: false

Metrics/MethodLength:
  Description: 'Avoid methods longer than 10 lines of code.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
  Enabled: false

Style/MixinUsage:
  Enabled: true
  Exclude:
    - test/test_helper.rb

Style/ModuleFunction:
  Description: 'Checks for usage of `extend self` in modules.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function'
  Enabled: false

Style/MultilineBlockChain:
  Description: 'Avoid multi-line chains of blocks.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks'
  Enabled: false

Style/NegatedIf:
  Description: >-
                 Favor unless over if for negative conditions
                 (or control flow or).
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives'
  Enabled: false

Style/NegatedWhile:
  Description: 'Favor until over while for negative conditions.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives'
  Enabled: false

Style/Next:
  Description: 'Use `next` to skip iteration instead of a condition at the end.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
  Enabled: false

Style/NilComparison:
  Description: 'Prefer x.nil? to x == nil.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
  Enabled: false

Style/Not:
  Description: 'Use ! instead of not.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not'
  Enabled: false

Style/NumericLiterals:
  Description: >-
                 Add underscores to large numeric literals to improve their
                 readability.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics'
  Enabled: false

Style/OneLineConditional:
  Description: >-
                 Favor the ternary operator(?:) over
                 if/then/else/end constructs.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator'
  Enabled: false

Naming/BinaryOperatorParameterName:
  Description: 'When defining binary operators, name the argument other.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg'
  Enabled: false

Metrics/ParameterLists:
  Description: 'Avoid parameter lists longer than three or four parameters.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
  Enabled: false

Style/PercentLiteralDelimiters:
  Description: 'Use `%`-literal delimiters consistently'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces'
  Enabled: false

Style/PerlBackrefs:
  Description: 'Avoid Perl-style regex back references.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers'
  Enabled: false

Naming/PredicateName:
  Description: 'Check the names of predicate methods.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark'
  ForbiddenPrefixes:
    - is_
  Exclude:
    - spec/**/*

Style/Proc:
  Description: 'Use proc instead of Proc.new.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc'
  Enabled: false

Style/RaiseArgs:
  Description: 'Checks the arguments passed to raise/fail.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages'
  Enabled: false

Style/RegexpLiteral:
  Description: 'Use / or %r around regular expressions.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r'
  Enabled: false

Style/Sample:
  Description: >-
                  Use `sample` instead of `shuffle.first`,
                  `shuffle.last`, and `shuffle[Fixnum]`.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
  Enabled: false

Style/SelfAssignment:
  Description: >-
                 Checks for places where self-assignment shorthand should have
                 been used.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment'
  Enabled: false

Style/SingleLineBlockParams:
  Description: 'Enforces the names of some block params.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks'
  Enabled: false

Style/SingleLineMethods:
  Description: 'Avoid single-line methods.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods'
  Enabled: false

Style/SignalException:
  Description: 'Checks for proper usage of fail and raise.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method'
  Enabled: false

Style/SpecialGlobalVars:
  Description: 'Avoid Perl-style global variables.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms'
  Enabled: false

Style/StringLiterals:
  Description: 'Checks if uses of quotes match the configured preference.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals'
  EnforcedStyle: single_quotes
  Enabled: true

Style/StructInheritance:
  Enabled: true

Style/SymbolArray:
  EnforcedStyle: brackets

Style/SymbolProc:
  Enabled: true

Style/TrailingCommaInArguments:
  Description: 'Checks for trailing comma in argument lists.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
  EnforcedStyleForMultiline: comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma
  Enabled: true

Style/TrailingCommaInArrayLiteral:
  Description: 'Checks for trailing comma in array literals.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
  EnforcedStyleForMultiline: comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma
  Enabled: true

Style/TrailingCommaInHashLiteral:
  Description: 'Checks for trailing comma in hash literals.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
  EnforcedStyleForMultiline: comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma
  Enabled: true

Style/TrivialAccessors:
  Description: 'Prefer attr_* methods to trivial readers/writers.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family'
  Enabled: false

Style/VariableInterpolation:
  Description: >-
                 Don't interpolate global, instance and class variables
                 directly in strings.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate'
  Enabled: false

Style/WhenThen:
  Description: 'Use when x then ... for one-line cases.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases'
  Enabled: false

Style/WhileUntilModifier:
  Description: >-
                 Favor modifier while/until usage when you have a
                 single-line body.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier'
  Enabled: false

Style/WordArray:
  Description: 'Use %w or %W for arrays of words.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w'
  EnforcedStyle: brackets

Style/MethodCallWithArgsParentheses:
  Description: 'Use parentheses for method calls with arguments.'
  Enabled: true
  IgnoredMethods:
    - require
    - require_relative
    - raise
    - head
    - render
    - respond_with
    - puts
  Exclude:
    - Gemfile
    - test/test_helper.rb
    - db/migrate/**/*
    - core/uffizzi_core.gemspec
    - core/db/migrate/**/*

Layout/ParameterAlignment:
  Description: 'Here we check if the parameters on a multi-line method call or definition are aligned.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent'
  Enabled: false

Layout/ConditionPosition:
  Description: >-
                 Checks for condition placed in a confusing position relative to
                 the keyword.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition'
  Enabled: false

Layout/DotPosition:
  Description: 'Checks the position of the dot in multi-line method calls.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains'
  EnforcedStyle: leading

Layout/ExtraSpacing:
  Description: 'Do not use unnecessary spacing.'
  Enabled: true

Layout/MultilineOperationIndentation:
  Description: >-
                 Checks indentation of binary operations that span more than
                 one line.
  Enabled: true
  EnforcedStyle: indented

Layout/MultilineMethodCallIndentation:
  Description: >-
                 Checks indentation of method calls with the dot operator
                 that span more than one line.
  Enabled: true
  EnforcedStyle: indented

Layout/InitialIndentation:
  Description: >-
    Checks the indentation of the first non-blank non-comment line in a file.
  Enabled: false

Layout/EndAlignment:
  Description: >-
    Checks whether the end keywords are aligned properly.
  EnforcedStyleAlignWith: variable

Layout/LineLength:
  Description: 'Limit lines to 140 characters.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits'
  Max: 140

Lint/AmbiguousOperator:
  Description: >-
                 Checks for ambiguous operators in the first argument of a
                 method invocation without parentheses.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args'
  Enabled: false

Lint/AmbiguousRegexpLiteral:
  Description: >-
                 Checks for ambiguous regexp literals in the first argument of
                 a method invocation without parenthesis.
  Enabled: false

Lint/AssignmentInCondition:
  Description: "Don't use assignment in conditions."
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition'
  Enabled: false

Lint/CircularArgumentReference:
  Description: "Don't refer to the keyword argument in the default value."
  Enabled: false

Lint/DeprecatedClassMethods:
  Description: 'Check for deprecated class method calls.'
  Enabled: false

Lint/DuplicateHashKey:
  Description: 'Check for duplicate keys in hash literals.'
  Enabled: false

Lint/EachWithObjectArgument:
  Description: 'Check for immutable argument given to each_with_object.'
  Enabled: false

Lint/ElseLayout:
  Description: 'Check for odd code arrangement in an else block.'
  Enabled: false

Lint/FlipFlop:
  Description: 'Checks for flip flops'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops'
  Enabled: false

Lint/FormatParameterMismatch:
  Description: 'The number of parameters to format/sprint must match the fields.'
  Enabled: false

Lint/SuppressedException:
  Description: "Don't suppress exception."
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions'
  Enabled: false

Lint/LiteralAsCondition:
  Description: 'Checks of literals used in conditions.'
  Enabled: false

Lint/LiteralInInterpolation:
  Description: 'Checks for literals used in interpolation.'
  Enabled: false

Lint/Loop:
  Description: >-
                 Use Kernel#loop with break rather than begin/end/until or
                 begin/end/while for post-loop tests.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break'
  Enabled: false

Lint/NestedMethodDefinition:
  Description: 'Do not use nested method definitions.'
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-methods'
  Enabled: false

Lint/NonLocalExitFromIterator:
  Description: 'Do not use return in iterator to cause non-local exit.'
  Enabled: false

Lint/ParenthesesAsGroupedExpression:
  Description: >-
                 Checks for method calls with a space before the opening
                 parenthesis.
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces'
  Enabled: false

Lint/RedundantCopDisableDirective:
  Description: >-
                 Checks for rubocop:disable comments that can be removed.
                 Note: this cop is not disabled when disabling all cops.
                 It must be explicitly disabled.
  Enabled: false

Lint/RequireParentheses:
  Description: >-
                 Use parentheses in the method call to avoid confusion
                 about precedence.
  Enabled: false

Lint/UnderscorePrefixedVariableName:
  Description: 'Do not use prefix `_` for a variable that is used.'
  Enabled: false

Lint/Void:
  Description: 'Possible use of operator/literal/variable in void context.'
  Enabled: false

Gemspec/DateAssignment:
  Enabled: true
Gemspec/RequireMFA:
  Enabled: false
Layout/LineEndStringConcatenationIndentation:
  Enabled: true
Layout/SpaceBeforeBrackets:
  Enabled: true
Lint/AmbiguousAssignment:
  Enabled: true
Lint/AmbiguousOperatorPrecedence:
  Enabled: true
Lint/AmbiguousRange:
  Enabled: true
Lint/DeprecatedConstants:
  Enabled: true
Lint/DuplicateBranch:
  Enabled: true
Lint/DuplicateRegexpCharacterClassElement:
  Enabled: true
Lint/EmptyBlock:
  Enabled: false
Lint/EmptyClass:
  Enabled: true
Lint/EmptyInPattern:
  Enabled: true
Lint/IncompatibleIoSelectWithFiberScheduler:
  Enabled: true
Lint/LambdaWithoutLiteralBlock:
  Enabled: true
Lint/NoReturnInBeginEndBlocks:
  Enabled: true
Lint/NumberedParameterAssignment:
  Enabled: true
Lint/OrAssignmentToConstant:
  Enabled: true
Lint/RedundantDirGlobSort:
  Enabled: true
Lint/RequireRelativeSelfPath:
  Enabled: true
Lint/SymbolConversion:
  Enabled: true
Lint/ToEnumArguments:
  Enabled: true
Lint/TripleQuotes:
  Enabled: true
Lint/UnexpectedBlockArity:
  Enabled: true
Lint/UnmodifiedReduceAccumulator:
  Enabled: true
Lint/UselessRuby2Keywords:
  Enabled: true
Naming/BlockForwarding:
  Enabled: true
Security/IoMethods:
  Enabled: true
Style/ArgumentsForwarding:
  Enabled: true
Style/CollectionCompact:
  Enabled: true
Style/DocumentDynamicEvalDefinition:
  Enabled: true
Style/EndlessMethod:
  Enabled: true
Style/FileRead:
  Enabled: true
Style/FileWrite:
  Enabled: true
Style/HashConversion:
  Enabled: true
Style/HashExcept:
  Enabled: true
Style/IfWithBooleanLiteralBranches:
  Enabled: true
Style/InPatternThen:
  Enabled: true
Style/MapToHash:
  Enabled: true
Style/MultilineInPatternThen:
  Enabled: true
Style/NegatedIfElseCondition:
  Enabled: true
Style/NilLambda:
  Enabled: true
Style/NumberedParameters:
  Enabled: true
Style/NumberedParametersLimit:
  Enabled: true
Style/OpenStructUse:
  Enabled: false
Style/OptionalBooleanParameter:
  Enabled: false
Style/QuotedSymbols:
  Enabled: true
Style/RedundantArgument:
  Enabled: true
Style/RedundantSelfAssignmentBranch:
  Enabled: true
Style/SelectByRegexp:
  Enabled: true
Style/StringChars:
  Enabled: true
Style/SwapValues:
  Enabled: true
Minitest/AssertInDelta:
  Enabled: true
Minitest/AssertionInLifecycleHook:
  Enabled: true
Minitest/AssertKindOf:
  Enabled: true
Minitest/AssertOutput:
  Enabled: true
Minitest/AssertPathExists:
  Enabled: true
Minitest/AssertSilent:
  Enabled: true
Minitest/AssertWithExpectedArgument:
  Enabled: true
Minitest/LiteralAsActualArgument:
  Enabled: true
Minitest/MultipleAssertions:
  Enabled: false
Minitest/RefuteInDelta:
  Enabled: true
Minitest/RefuteKindOf:
  Enabled: true
Minitest/RefutePathExists:
  Enabled: true
Minitest/TestMethodName:
  Enabled: true
Minitest/UnreachableAssertion:
  Enabled: true
Minitest/UnspecifiedException:
  Enabled: true


================================================
FILE: .ruby-version
================================================
ruby-2.5.3


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
This Code of Conduct is based on the [Mission Protocol Code of Conduct v1.1](https://missionprotocol.org/codeofconduct/), Creative Commons 4.0 License (CC BY 4.0), 2020.

## Mission

Our mission is to support the creators of the next generation of great products and services by facilitating high quality and rapid software delivery through lightweight, event-driven test environments.

## Objective

Our objective is to focus on the mission we set out to accomplish, which we believe will produce an important social good in the world. Our standards are directed towards achieving this mission. We will conduct ourselves with professional integrity and set aside divisive discourse that doesn’t help us achieve our mission.

## Standards

- Leadership principle: Project leaders are responsible and authorized to make judgments and take appropriate actions to define the mission and keep the project in line with this mission.

- **Mission focus**: We will focus our efforts on accomplishing the project’s mission, so that it is fulfilled to its highest potential.

- **Creative conflict**: We acknowledge that discussions and disagreements are a natural part of problem-solving and should happen in a constructive way.

- **The whole is greater than the parts**: We are a project with diverse opinions and fields of engagement, but we are here to focus on what unites us, instead of what divides us.

- **Principle of charity**: We assume positive intentions of members, contributors, and policies.

## Prohibited Behavior

- Harassment, i.e., excessive, hostile, or bad-faith communication directed at another member or contributor  
- Attacks based on personal characteristics  
- Threats of violence  
- Threatening to publish or publishing people’s personal information without their consent  
- Repeatedly attempting to involve the project in issues outside of its mission  
- Posting illegal content  
- Abuse of the system for reporting code of conduct violations  
- Promoting any behavior listed above  

## Responsibilities  

In line with the leadership principle, project leaders have the responsibility to clarify and interpret the mission, as well as the intentions and standards in this code of conduct, in order to maintain mission focus. When individuals engage in prohibited behavior, project leaders are expected to take expedient, fair, and appropriate action to address the violation(s). The standards and prohibitions in this document also apply to project leaders.

## Conflict Resolution

### Reporting

We highly encourage contributors to resolve conflicts by directly reaching out to the other party or parties involved in the dispute. When this is insufficient, members can report the issue to project leaders via email at support@uffizzi.com within 31 days of the inciting event and request a formal resolution.

Project leaders will make reasonable efforts to adjudicate incidents shortly after they are brought to their attention.

### Enforcement

Project leaders shall take all reasonable actions to ensure the successful execution of the mission statement and the maximum effectiveness of the project.

All material in official project spaces is subject to the code of conduct, and as such, can be deleted, modified, or rejected by project leaders if it is found to be in violation of the code of conduct. In repeated or severe cases, project leaders may exclude individuals from further contribution to the project on a temporary or permanent basis.

## Scope

This code of conduct applies to official project spaces, which include but are not limited to: social media, conferences, code repositories, and discussion boards. This code of conduct also applies to members and contributors who represent the project in non-project spaces, such as when contributors give a talk on behalf of the project at a conference. In official spaces, members and contributors should operate with decorum that reflects positively on the project, its objectives, and its community.

## Licensing

The Mission Protocol Code of Conduct was created under the CC BY 4.0 License in 2020. Frequently asked questions about Mission Protocol are available here.

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to `uffizzi_app`

Thanks for your interest! We are actively working to release `uffizzi_app` and define how you can contribute - please follow for updates!

Uffizzi welcomes contributions from everyone!

## Communication:

If you need any help contributing, several maintainers are on the Uffizzi Users Slack group https://join.slack.com/t/uffizzi/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A.

## Releases

We're using Semantic Versioning 2.0.0 to name our release tags: https://semver.org/

Be sure to update the `appVersion` within `charts/uffizzi-app/Chart.yaml` whenever you create a new release! And also update the tag for `image` within `charts/uffizzi-app/values.yaml`.

## Helm Chart Releases

When you change the Helm chart, even if it's just bumping the `appVersion` and `image` tag, also increment the `version` within `charts/uffizzi-app/Chart.yaml`.  This chart version does not need to match the app version, and it's probably better if it does not.

When the new `Chart.yaml` makes it into the default branch, then the `chart-releaser` GitHub Action will create a new tag with a `uffizzi-app-` prefix. It will also update our Helm repo within the `gh-pages` branch. Let the automation handle this.

# Procedures for outside collaborators:

- Fork the project on Github.

- Make any changes you want to `uffizzi_app`, commit them, and push them to your fork.

- Create a Pull Request against `UffizziCloud/uffizzi_app:main`, and a maintainer will come by and review your inputs. They may ask for some changes or more information, and hopefully your contribution will be merged to the `main` branch!

# Procedures for Uffizzi team members:

1. Clone the repository and checkout to `develop` branch.

2. Pull repository to ensure you have the latest changes.

```bash
git pull --rebase develop
```

3. Start new branch from `develop`

```bash
git checkout -b feature/ISSUE_NUMBER_short_issue_description (e.g. feature/53_add_domain_settings)
```

4. Make changes you need for the feature, commit them to the repo

```bash
git add .
git commit -m '[#ISSUE_NUMBER] short commit description' (e.g. git commit -m '[#53] added domain settings')
git push origin BRANCH_NAME
```

5. You already can create PR with develop branch as a target. Once the feature is ready let us know in the channel - we will review

6. Merge your feature to `qa` branch and push. Ensure your pipeline is successful.

```bash
git checkout qa
git pull --rebase qa
git merge --no-ff BRANCH_NAME
git push origin qa
```

# Running linter

```bash
docker-compose run --rm web bundle exec rubocop -A
```

# Running test

```bash
docker-compose run --rm core bash
bin/rails test
```

# Migrations

In order to add a new migration do the following steps:

1. Add a new migration inside the core
2. Run the command inside the `web` container

```bash
rake uffizzi_core:install:migrations
```

This command copies the new migration to the `db/migrate` folder


================================================
FILE: Dockerfile
================================================
FROM ruby:2.7.5-slim

ARG RAILS_ROOT=/app
RUN mkdir -p $RAILS_ROOT
WORKDIR $RAILS_ROOT

RUN apt-get update \
  && apt-get install -qq -y --no-install-recommends \
  vim-tiny \
  python2-dev \
  libpq-dev \
  build-essential \
  curl \
  less \
  tzdata \
  git \
  postgresql-client \
  bash \
  screen \
  shared-mime-info \
  && apt-get autoremove -y \
  && rm -rf /var/lib/apt/lists/*

RUN gem install bundler:2.3.9

COPY Gemfile Gemfile.lock $RAILS_ROOT/
COPY core/lib/uffizzi_core/version.rb $RAILS_ROOT/core/lib/uffizzi_core/version.rb
COPY core/uffizzi_core.gemspec $RAILS_ROOT/core/uffizzi_core.gemspec
COPY core/Gemfile* $RAILS_ROOT/core/

RUN bundle install --jobs 5

COPY . $RAILS_ROOT

ENV PATH $RAILS_ROOT/bin:$PATH

EXPOSE 7000

CMD /bin/bash -c "bundle exec rails db:create db:migrate && bundle exec puma -C config/puma.rb"


================================================
FILE: Gemfile
================================================
# frozen_string_literal: true

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.7.5'

gem 'bcrypt', '~> 3.1.7'
gem 'bootsnap', '>= 1.4.2', require: false
gem 'config'
gem 'health_check'
gem 'pg', '>= 0.18', '< 2.0'
gem 'puma', '~> 4.1'
gem 'rack-cors'
gem 'rails', '~> 6.1.0'
gem 'sidekiq'
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'uffizzi_core', path: './core'

group :development, :test do
  gem 'awesome_print'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'rubocop'
  gem 'rubocop-minitest'
  gem 'rubocop-rake'
end


================================================
FILE: INSTALL.md
================================================
# Installation overview

See the [Helm chart guide](https://github.com/UffizziCloud/uffizzi_app/blob/main/charts/uffizzi-app/README.md) for installing Uffizzi on your own Kubernetes cluster.

Once Uffizzi is installed, you can use the [Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli) to create and manage previews. Additionally, you can continuously deploy previews of your branches using [the GitHub Action](https://github.com/UffizziCloud/preview-action).

## Uffizzi Architecture
<img src="docs/images/uffizzi-architecture.png" description="Uffizzi Architecture" width="320"/>

Uffizzi consists of the following components:

* Uffizzi App (this repository) - The primary REST API for creating and managing Previews
* [Uffizzi Controller](https://github.com/UffizziCloud/uffizzi_controller) - A smart proxy service that handles requests from Uffizzi App to the Kubernetes API
* [Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli) - A command-line interface for Uffizzi App

Uffizzi App requires the following external dependencies:

 * Kubernetes (k8s) cluster
 * PostgreSQL database
 * Redis cache

## Controller Design

This `uffizzi_app` acts as a REST API for [`uffizzi_cli`](https://github.com/UffizziCloud/uffizzi_app) interface. It requires [`uffizzi_controller`](https://github.com/UffizziCloud/uffizzi_controller) as a supporting service.

## Uffizzi App Environment Variables

- `RAILS_SECRET_KEY_BASE` - secret_key_base of Rails::Application
- `DATABASE_HOST` - the database hostname (default: 127.0.0.1)
- `DATABASE_USER` - the database username (default: postgres)
- `DATABASE_PASSWORD` - the database password
- `DATABASE_PORT` - the database port (default: 5432)
- `BUNDLE_PATH` - the location of gems for `bundle install` command (not required)
- `GEM_PATH` - the location where gems can be found (not required)
- `GEM_HOME` - where gems will be installed (not required)
- `RAILS_WORKERS_COUNT` - the number of `puma` workers (default: 18)
- `RAILS_THREADS_COUNT` - the number of `puma` threads (default: 5)
- `RAILS_PORT` - the `puma` port (default: 7000)
- `RAILS_ENV` - the rails environment (default: development)
- `SIDEKIQ_CONCURRENCY` - sidekiq concurrency (default: 5)
- `ALLOWED_HOSTS` - allowed hosts for rails app used for Rack::Cors (default: [])
- `APP_URL` - URL of the application
- `REDIS_URL` - URL of a Redis server
- `CONTROLLER_URL` - URL of the controller application (default: http://controller:8080)
- `CONTROLLER_LOGIN` - the login of the controller application (default: '')
- `CONTROLLER_PASSWORD` - the password of the controller application (default: '')

# Test Uffizzi App Locally

If you want to run Uffizzi on your workstation instead of using [the Helm chart](charts/uffizzi-app/README.md), then you can run it using Docker Compose.

## Prepare

```bash
docker-compose run --rm web bash -c "bundle install && bundle exec rails db:setup"
docker-compose up
```

## Create a new user

Run the following command and follow instructions:

```bash
docker-compose run --rm web bash -c "rake uffizzi_core:create_user"
```

or run the command with environment variables:

- `UFFIZZI_USER_EMAIL` - user's email
- `UFFIZZI_USER_PASSWORD` - user's password
- `UFFIZZI_PROJECT_NAME` - user's project name

```bash
docker-compose run --rm -e UFFIZZI_USER_EMAIL=user@uffizzi.com -e UFFIZZI_USER_PASSWORD=password -e UFFIZZI_PROJECT_NAME=project web bash -c "rake uffizzi_core:create_user"
```

## Connect from uffizzi-cli to the app

```bash
docker-compose run --rm gem bash
bundle exec uffizzi login --hostname http://web:7000 -u admin@uffizzi.com
```

## API Documentation

* [Development](http://lvh.me:7000/api-docs/index.html)

Rebuild documentation locally:

```bash
docker-compose run --rm core bash
bundle exec rake core:generate_docs
```

# Health checks

The default health check uri is `health_check`. To use a custom uri please add the `HEALTH_CHECK_URI` environment variable to the docker-compose.yml


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [2021] [Uffizzi]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile
================================================
.PHONY: release release_patch release_minor release_major test

NEXT_PATCH=$(shell docker compose run --rm core bash -c "bundle exec bump show-next patch")
NEXT_MINOR=$(shell docker compose run --rm core bash -c "bundle exec bump show-next minor")
NEXT_MAJOR=$(shell docker compose run --rm core bash -c "bundle exec bump show-next major")

release_patch: export VERSION=${NEXT_PATCH}
release_patch:
	make release

release_minor: export VERSION=${NEXT_MINOR}
release_minor:
	make release

release_major: export VERSION=${NEXT_MAJOR}
release_major:
	make release

release:
	git checkout develop
	@echo 'Set a new version'
	docker compose run --rm core bash -c "bundle exec bump set ${VERSION}"
	docker compose run --rm core bash -c "bundle update uffizzi_core --conservative "
	docker compose run --rm web bash -c "bundle update uffizzi_core --conservative "
	git commit -am "Change version to ${VERSION}"
	@echo 'Update remote origin'
	git push origin develop
	git checkout main
	git pull origin --rebase main
	git merge --no-ff --no-edit develop
	git push origin main
	@echo 'Create a new tag'
	git tag core_v${VERSION}
	git push origin core_v${VERSION}

test:
	docker compose run --rm core bash -c "bundle exec rails test"

lint:
	docker compose run --rm web bash -c "bundle exec rubocop -A"


================================================
FILE: README.md
================================================
<div align="center" style="border-bottom: none">
  <h1>
    <div>
        <a href="https://www.uffizzi.com">
            <img src="misc/uffizzi-icon.png" width="80" />
            <br>
            Uffizzi
        </a>
    </div>
    Environments-as-a-Service <br>
    <a href="https://opensource.org/licenses/Apache-2.0">
        <img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg">
    </a>
  </h1>
    <p align="center">
        <a href="http://www.uffizzi.com"><b>Website</b></a> •
        <a href="https://join.slack.com/t/uffizzi/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A"><b>Slack</b></a> •
        <a href="https://uffizzi.com/blog"><b>Blog</b></a> •
        <a href="https://twitter.com/_Uffizzi"><b>Twitter</b></a> •
        <a href="https://docs.uffizzi.com/"><b>Documentation</b></a>
    </p>
</div align="center" style="border-bottom: none">

Uffizzi helps teams build [internal developer platforms (IDPs)](/core-concepts/internal-developer-platform) in minutes, not months, by providing out-of-the-box [Kubernetes multi-tenancy](https://www.uffizzi.com/kubernetes-multi-tenancy), [virtual clusters](/core-concepts/ephemeral-environments/virtual-clusters), cloud-based [dev environments](/core-concepts/ephemeral-environments/dev-clusters), customizable templating, and more.

Uffizzi provides a foundation for building IDPs, so platform teams can build end-to-end workflows, giving every developer access to self-service, [ephemeral environments](/core-concepts/ephemeral-environments) for development, testing, PRs, staging and more. Use Uffizzi environments to preview pull requests before merging or integrate with your CI pipeline for automated, end-to-end testing.  
&nbsp;  
&nbsp;  

<hr>

<h3 align="center" style="border-bottom: none">
 <div>
   Trusted by top teams
 </div>  
</h3>
   <p align="center">
    <a href="https://backstage.spotify.com"><b>Backstage</b></a> •
    <a href="https://www.nocodb.com"><b>NocoDB</b></a> •
    <a href="https://www.forem.com"><b>Forem</b></a> •
    <a href="https://github.com/jesseduffield/lazygit"><b>Lazygit</b></a> •
    <a href="https://d2iq.com"><b>D2IQ</b></a> •
    <a href="https://github.com/parse-community/parse-dashboard"><b>ParseDashboard</b></a> •
    <a href="https://fonoster.com/"><b>Fonoster</b></a>
   </p>

  <p align="center">
    <a href="https://answer.dev/"><b>Answer</b></a> •
    <a href="https://www.windmill.dev/"><b>Windmill</b></a> •
    <a href="https://flagsmith.com/"><b>Flagsmith</b></a> •
    <a href="https://usememos.com/"><b>Memos</b></a> •
    <a href="https://craterapp.com/"><b>Crater</b></a> •
    <a href="https://livebook.dev/"><b>Livebook</b></a> •
    <a href="https://online-go.com/"><b>OnlineGo</b></a> •
    <a href="https://boxyhq.com/"><b>BoxyHQ</b></a>
  </p>

&nbsp;
Teams like [Backstage](https://github.com/backstage/backstage/tree/master/.github/uffizzi), [NocoDB](https://github.com/nocodb/nocodb/tree/develop/.github/uffizzi), and [Forem](https://github.com/forem/forem/blob/main/.github/workflows/uffizzi-preview.yml) have adopted Uffizzi because it's lightweight, fast, scalable, and more cost effective than competing solutions. Did you know that Spotify's Backstage team achieves rapid releases at scale using nearly 400 ephemeral environments per month? [Learn how →](https://www.uffizzi.com/ephemeral-environments)

<hr>

![github-banner](https://user-images.githubusercontent.com/7218230/191119628-4d39c65d-465f-4011-9370-d53d7b54d8cc.png)


## Quickstart (~2 minute)

Go to the [Quickstart Guide](https://docs.uffizzi.com/quickstart) to get started creating ephemeral environments.

## How it works
Spin up ephemeral environments on demand from the CLI, web dashboard, or from a CI pipeline. Each ephemeral environment is continually refreshed when you push new commits. Uffizzi also handles clean up, so your environments last only as long as you need them.  

Uffizzi's modular design works with GitHub, GitLab, BitBucket, and any CI provider.

<img width="600" alt="preview-url" src="https://user-images.githubusercontent.com/7218230/194924634-391aff82-8adf-473b-800e-a20dcdab82dd.png">

## Give us a star ⭐️
If you're interested in Uffizzi, give us a star. It helps others discover the project.

## Use cases

Uffizzi is designed to integrate with any CI platform as a step in your pipeline. You can use Uffizzi to rapidly create:  

- Cloud dev environments with hot reloading of deployed services
- On-demand test environments for Kubernetes applications
- Pull request environments  
- Debugging environments  
- Hotfix environments  
- Demo environments  
- Release environments
- Staging environments  

## What types of apps are supported by Uffizzi?

Uffizzi supports application configurations in Kubernetes manifests, Helm, kustomize, or Docker Compose. See [Using Uffizzi](https://docs.uffizzi.com/usage) to learn about the ways you can use Uffizzi.

## Why Uffizzi?

Uffizzi provides a foundation for building IDPs, so platform teams can build end-to-end workflows, giving every developer access to self-service, ephemeral environments for development, testing, PRs, staging and more.

Uffizzi is also useful for helping busy open source project leaders approve pull requests faster. Testing a live preview provides a more holistic way to assess a new feature or bug fix, rather than simply reviewing code changes. Uffizzi also removes the added step of pulling down the branch to test it locally: Uffizzi seamlessly integrates with CI providers like GitHub Actions and posts comments directly to pull request issues, so there is no additional step for the maintainer or the contributor. Learn how Uffizzi is helping [Backstage accelerate their development velocity by 20%](https://www.uffizzi.com/ephemeral-environments).

## Set up ephemeral environments for your application

(If you haven't completed the [quickstart guide](https://docs.uffizzi.com/quickstart), we recommend starting there to understand how Uffizzi works and how it's configured.)  

There are three options to get Uffizzi:  

1. **[Uffizzi Cloud](https://docs.uffizzi.com/cloud) (SaaS)** - This is fastest and easiest way to get started. Uffizzi Cloud is our fully managed option, so you don't have to worry about managing any infrastructure. You can get two concurrent environments for free, or unlock unlimited ephemeral environments with Uffizzi Pro. See our [Pricing page](https://www.uffizzi.com/pricing) for details. 
2. **[Uffizzi Enterprise](https://docs.uffizzi.com/enterprise)** - Uffizzi Enterprise provides the option to run workloads on your own infrastucture, along with more flexibility in customizing your ephemeral environments experience.   
3. **[Uffizzi Open Source](https://docs.uffizzi.com/open-source)** - Alternatively, you can install the open source version of Uffizzi on your own cluster by following the [self-hosted installation guide](INSTALL.md).

## Documentation

- [Main documentation](https://docs.uffizzi.com)
- [Docker Compose for Uffizzi ](https://docs.uffizzi.com/compose)
- [Quickstart guide](https://docs.uffizzi.com/quickstart)

## Community

- [Slack channel](https://join.slack.com/t/uffizzi/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A) - Get support or discuss the project  
- [Subscribe to our newsletter](https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7011448505391042560) - Receive monthly updates about new features and special events  
- [Contributing to Uffizzi](CONTRIBUTING.md) - Start here if you want to contribute
- [Code of Conduct](CODE_OF_CONDUCT.md) - Let's keep it professional

## FAQs

<details><summary><b>My team tests locally. Why do I need Ephemeral Environments?</b></summary>
<ol>
  <li>Ephemeral Environments <a href="https://docs.uffizzi.com/core-concepts/production-like">more closely resemble production</a>. Uffizzi deploys images built from your CI pipeline—similar to the ones deployed to a production environment. Uffizzi Ephemeral Environments also include a full network stack, including a domain and TLS certificate.</li>
  <li>Ephemeral Environments provide many benefits including standardizing development configurations, avoiding the bottleneck of a single test/staging environment, acting as a quality gate to help keep dirty code out of your main branch. Teams can develop and test new features or bug fixes in clean, isolated environments.</li>
  <li>Public preview URLs allow every stakeholder on a team to review features and bug fixes. This helps shorten the feedback loop between developer and reviewer/tester, resulting in faster releases.</li>
</ol>
</details>

<details><summary><b>How is Uffizzi different from Codespaces, Gitpod, etc.?</b></summary>
<p>Codespaces, Gitpod, and similar tools focus soley on providing development environments hosted in the cloud. They let you code locally (or in a browser-emulated editor) and see your changes in a live deployed environments. They can also provide developers access to more powerful machines than typically available on a laptop or desktop.</p>

<p>Uffizzi is a more full-featured platform designed for building self-serve developer platforms and for standardizing end-to-end developer workflows through on-demand dev, test, CI, and staging environments. Similar to Codespaces and Gitpod, Uffizzi offers cloud-based dev environments, but unlike these tools, Uffizzi users have access to the underlying Kubernetes clusters, enabling more complex configurations and customization via kubectl and similar tools. Uffizzi also supports creating virtual clusters for ephemeral test environments, as well as, CI integrations for pull request previews.</p>

See <a href="https://docs.uffizzi.com">our documentation</a> for other common uses and guides.

</details>

<details><summary><b>How is Uffizzi different from GitHub Actions (or other CI providers)?</b></summary>
Uffizzi does not replace GitHub Actions or any other CI provider. Uffizzi can be added as a step in your existing CI pipeline, after your container images are built and pushed to a container registry. For example, when you open a pull request, a GitHub Actions workflow can trigger the creation of new virtual cluster on Uffizzi and deploy that branch onto it. See our <a href="https://docs.uffizzi.com/ci">CI Recipes</a> for configuration help.
</details>

<details><summary><b>What about my database?</b></summary>
<p>All services deployed to Uffizzi ephemeral environments are deployed as containers—this includes databases, caches, and other stateful services This means that even if you use a managed database service like Amazon RDS for production, you should use a database <i>image</i> in your configuration (See our <a href="https://docs.uffizzi.com/handbook/database-seeding">Ephemeral Environments Handbook</a> for strategies on managing stateful services on Uffizzi.</p>
</details>

<details><summary><b>What do you mean by "environments"?</b></summary>
See <a href="https://docs.uffizzi.com/core-concepts/ephemeral-environments">our documentaion</a> for what we mean.
</details>

<details><summary><b>Does Uffizzi support monorepos/polyrepos?</b></summary>
Yes. Whether created via you're creating ephemeral environments from the CLI, dashboard, or CI pipeline, Uffizzi can deploy applications from one source or many. If you're using Uffizzi virtual clusters, you should define the sources in your Helm Charts, kustomizations, or manifests. For Docker Compose users, Uffizzi just needs to know the fully qualified container registry URL for where to find these built images. See the <a href="https://docs.uffizzi.com/compose/reference">Uffizzi Compose reference</a> for details.
</details>

<details><summary><b>Does Uffizzi support _____________?</b></summary>
In general, if your application can be containerized, described with Kubernetes, Helm, kustomize, or Docker Compose, then it is likely compatible with Uffizzi. The one notable exception to this is that Uffizzi does not support Node-level access, such as Kubernetes DaemonSets.  
</details>

<details><summary><b>How can my application services communicate?</b></summary>
See <a href="https://docs.uffizzi.com/architecture/networking">Uffizzi Networking</a> for details.
</details>

<details><summary><b>Is Uffizzi open source?</b></summary>
Yes. If you have access to a Kubernetes cluster, you can install Uffizzi via Helm. Follow the <a href="INSTALL.md">self-hosted installation guide</a>.
</details>

## License

This library is licensed under the [Apache License, Version 2.0](LICENSE).

## Security

If you discover a security related issues, please do **not** create a public github issue. Notify the Uffizzi team privately by sending an email to `security@uffizzi.com`.


================================================
FILE: Rakefile
================================================
# frozen_string_literal: true

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require_relative 'config/application'

Rails.application.load_tasks


================================================
FILE: app/assets/config/manifest.js
================================================
//= link_tree ../images
//= link_directory ../stylesheets .css


================================================
FILE: app/assets/fonts/mtiFontTrackingCode.js
================================================
eval(function (p, a, c, k, e, d) { e = function (c) { return c.toString(36) }; if (!''.replace(/^/, String)) { while (c--) { d[c.toString(a)] = k[c] || c.toString(a) } k = [function (e) { return d[e] }]; e = function () { return '\\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p }('4 8=9.f;4 6=9.k.m(",");4 2=3.j(\'l\');2.h=\'g/5\';2.d=\'b\';2.e=(\'7:\'==3.i.s?\'7:\':\'u:\')+\'//v.n.w/x/1.5?t=5&c=\'+8+\'&o=\'+6;(3.a(\'p\')[0]||3.a(\'q\')[0]).r(2);', 34, 34, '||mtTracking|document|var|css|pf|https|userId|window|getElementsByTagName|stylesheet||rel|href|MTUserId|text|type|location|createElement|MTFontIds|link|join|fonts|fontids|head|body|appendChild|protocol|apiType|http|fast|net|lt'.split('|'), 0, {}))

================================================
FILE: app/assets/images/.keep
================================================


================================================
FILE: app/assets/stylesheets/application.css
================================================
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */


================================================
FILE: app/channels/application_cable/channel.rb
================================================
# frozen_string_literal: true

module ApplicationCable
  class Channel < ActionCable::Channel::Base
  end
end


================================================
FILE: app/channels/application_cable/connection.rb
================================================
# frozen_string_literal: true

module ApplicationCable
  class Connection < ActionCable::Connection::Base
  end
end


================================================
FILE: app/controllers/application_controller.rb
================================================
# frozen_string_literal: true

class ApplicationController < ActionController::Base
end


================================================
FILE: app/controllers/concerns/.keep
================================================


================================================
FILE: app/helpers/application_helper.rb
================================================
# frozen_string_literal: true

module ApplicationHelper
end


================================================
FILE: app/javascript/channels/consumer.js
================================================
// Action Cable provides the framework to deal with WebSockets in Rails.
// You can generate new channels where WebSocket features live using the `rails generate channel` command.

import { createConsumer } from "@rails/actioncable"

export default createConsumer()


================================================
FILE: app/javascript/channels/index.js
================================================
// Load all the channels within this directory and all subdirectories.
// Channel files must be named *_channel.js.

const channels = require.context('.', true, /_channel\.js$/)
channels.keys().forEach(channels)


================================================
FILE: app/javascript/packs/application.js
================================================
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")


// Uncomment to copy all static images under ../images to the output folder and reference
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
// or the `imagePath` JavaScript helper below.
//
// const images = require.context('../images', true)
// const imagePath = (name) => images(name, true)


================================================
FILE: app/jobs/application_job.rb
================================================
# frozen_string_literal: true

class ApplicationJob < ActiveJob::Base
  # Automatically retry jobs that encountered a deadlock
  # retry_on ActiveRecord::Deadlocked

  # Most jobs are safe to ignore if the underlying records are no longer available
  # discard_on ActiveJob::DeserializationError
end


================================================
FILE: app/mailers/application_mailer.rb
================================================
# frozen_string_literal: true

class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end


================================================
FILE: app/models/application_record.rb
================================================
# frozen_string_literal: true

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end


================================================
FILE: app/models/concerns/.keep
================================================


================================================
FILE: app/views/layouts/application.html.erb
================================================
<!DOCTYPE html>
<html>
  <head>
    <title>Uffizzi App</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>


================================================
FILE: app/views/layouts/mailer.html.erb
================================================
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <%= yield %>
  </body>
</html>


================================================
FILE: app/views/layouts/mailer.text.erb
================================================
<%= yield %>


================================================
FILE: bin/rails
================================================
#!/usr/bin/env ruby
# frozen_string_literal: true

APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'


================================================
FILE: bin/rake
================================================
#!/usr/bin/env ruby
# frozen_string_literal: true

require_relative '../config/boot'
require 'rake'
Rake.application.run


================================================
FILE: bin/setup
================================================
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'fileutils'

# path to your application root.
APP_ROOT = File.expand_path('..', __dir__)

def system!(*args)
  system(*args) || abort("\n== Command #{args} failed ==")
end

FileUtils.chdir(APP_ROOT) do
  # This script is a way to setup or update your development environment automatically.
  # This script is idempotent, so that you can run it at anytime and get an expectable outcome.
  # Add necessary setup steps to this file.

  puts '== Installing dependencies =='
  system! 'gem install bundler --conservative'
  system('bundle check') || system!('bundle install')

  # Install JavaScript dependencies
  # system('bin/yarn')

  # puts "\n== Copying sample files =="
  # unless File.exist?('config/database.yml')
  #   FileUtils.cp 'config/database.yml.sample', 'config/database.yml'
  # end

  puts "\n== Preparing database =="
  system! 'bin/rails db:prepare'

  puts "\n== Removing old logs and tempfiles =="
  system! 'bin/rails log:clear tmp:clear'

  puts "\n== Restarting application server =="
  system! 'bin/rails restart'
end


================================================
FILE: bin/yarn
================================================
#!/usr/bin/env ruby
# frozen_string_literal: true

APP_ROOT = File.expand_path('..', __dir__)
Dir.chdir(APP_ROOT) do
  exec('yarnpkg', *ARGV)
rescue Errno::ENOENT
  warn('Yarn executable was not detected in the system.')
  warn('Download Yarn at https://yarnpkg.com/en/docs/install')
  exit(1)
end


================================================
FILE: charts/uffizzi-app/Chart.yaml
================================================
apiVersion: v2
name: uffizzi-app
version: 1.3.0
kubeVersion: ">= 1.21.0-0" # https://issuetracker.google.com/issues/77503699
description: "Uffizzi is an open-source engine for creating lightweight, ephemeral test environments for APIs and full-stack applications. Uffizzi enables teams to preview new features before merging."
type: application
keywords:
  - devops
  - uffizzi
  - continuous-previews
  - ephemeral
  - environments
  - pull-request
  - merge-request
  - on-demand
  - ci
  - cd
  - cp
  - idp
home: https://uffizzi.com/
sources:
  - https://github.com/UffizziCloud/uffizzi
dependencies:
  - name: uffizzi-controller
    version: "^2"
    repository: https://uffizzicloud.github.io/uffizzi_controller/
  - name: postgresql
    version: "~13"
    repository: https://charts.bitnami.com/bitnami
    condition: postgresql.enabled
  - name: redis
    version: "~18"
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled
maintainers:
  - name: Uffizzi
    email: info@uffizzi.com
    url: https://uffizzi.com
  - name: Adam Vollrath
    email: adam.vollrath@uffizzi.com
    url: https://github.com/axisofentropy
icon: https://app.uffizzi.com/favicon.png
appVersion: "2.3.0"
deprecated: false
annotations:
  # Use this annotation to indicate that this chart version is a pre-release.
  # https://artifacthub.io/docs/topics/annotations/helm/
  artifacthub.io/prerelease: "false"


================================================
FILE: charts/uffizzi-app/README.md
================================================
# Helm chart guide

This chart installs Uffizzi.

## Requirements

This chart requires a Kubernetes Cluster. While it will likely function on k8s >= 1.19, we have only tested upon k8s 1.21 - 1.23.

The Cluster must be capable of provisioning `Ingress` resources that obtain public IP addresses and/or hostnames.

We've tested Uffizzi on:

- Google Kubernetes Engine (GKE)
- Azure Kubernetes Service (AKS)
- Amazon Elastic Kubernetes Service (EKS)

### Dependencies

This chart depends upon three subcharts:

- [`bitnami/postgresql`](https://artifacthub.io/packages/helm/bitnami/postgresql)
- [`bitnami/redis`](https://artifacthub.io/packages/helm/bitnami/redis)
- [`uffizzi-controller`](https://artifacthub.io/packages/helm/uffizzi-controller/uffizzi-controller)

You can disable the `bitnami` subcharts if you want to manage your own datastores.

## Configuration

This Helm chart requires integration with your DNS records and other services, so there are several required values. Create a YAML file with these values before installing this chart. There's an example below and you can read more about Helm Values Files here: https://helm.sh/docs/chart_template_guide/values_files/

### Controller

See the [Controller's Helm Chart](https://artifacthub.io/packages/helm/uffizzi-controller/uffizzi-controller) for its configuration, including its certificate authority.

The controller itself depends upon two other popular Helm charts:

- [`ingress-nginx`](https://kubernetes.github.io/ingress-nginx/)
- [`cert-manager`](https://cert-manager.io/docs/)

If you already have one or both of these applications installed, you may want to disable them for this Helm release. Specifically, your k8s Cluster may already have cert-manager's Custom Resource Definitions defined.

### Secrets

When installing Uffizzi in a sensitive or production environment, it's important to generate strong passwords. Provide new values for the `ChangeMeNow` values in the example below.

### Example Helm Values File
Example values file with required values:

```yaml
global:
  postgresql:
    auth:
      postgresPassword: ChangeMeNow
      password: ChangeMeNow
  redis:
    password: ChangeMeNow
  uffizzi:
    firstUser:
      email: user@example.com
      password: ChangeMeNow
    controller:
      password: ChangeMeNow
app_url: https://uffizzi.example.com
webHostname: uffizzi.example.com
allowed_hosts: uffizzi.example.com
managed_dns_zone_dns_name: uffizzi.example.com
uffizzi-controller:
  ingress:
    hostname: controller.uffizzi.example.com
  clusterIssuer: "letsencrypt"
  certEmail: admin@example.com
```

Edit these values and save them in a file named `myvals.yaml` or similar.

## Installation

If this is your first time using Helm, consult their documentation: https://helm.sh/docs/intro/quickstart/

Begin by adding our Helm repository:

```
helm repo add uffizzi https://uffizzicloud.github.io/uffizzi/
```

Then install the lastest version as a new release using the values you specified earlier. We recommend isolating Uffizzi in its own Namespace.

```
helm install my-uffizzi uffizzi/uffizzi-app --values myvals.yaml --namespace uffizzi --create-namespace
```

If you encounter any errors here, tell us about them in [our Slack](https://join.slack.com/t/uffizzi/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A).

You should then see the release is installed:
```
helm list --namespace uffizzi
```

### DNS

After the Helm release is installed, add DNS records for the hostnames you specified in your values file.  You can obtain the IP or hostname for Uffizzi's Ingress using `kubectl`:

```
kubectl get ingress --namespace uffizzi
```

Be sure to add a "wildcard" record for the domain specified in `managed_dns_zone_dns_name`. In the above example, that's `*.uffizzi.example.com`.

### Provisioning users

You'll need to create at least one User Account to access your Uffizzi installation. The easiest way to do this is specify values for `global.uffizzi.firstUser` as shown in the example values file above. Uffizzi will attempt to provision this User each time it starts.

If you did not specify a `firstUser`, or if you want to provision additional Users, you may execute an interactive `rake` task within the application server container:

```
kubectl exec -it deploy/my-uffizzi-web --namespace uffizzi -- rake uffizzi_core:create_user
Enter User Email (default: user@example.com): user@example.com
Enter Password:
Enter Project Name (default: default):
```

### Troubleshooting

When installing this chart, you may see errors like this:
```
clusterroles.rbac.authorization.k8s.io "my-uffizzi-controller-flux-default-source-controller-helmchart" already exists
```

This happens when more than one resource within a dependency chart (in this case `flux`) has a very long name truncated into the same name as another resource. To avoid this, use shorter release names as in the example above.

## Usage

If everything went well, you can now connect to the Uffizzi API service and begin Continously Deploying Previews! Use [the Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli) or [the Uffizzi GitHub Action](https://github.com/UffizziCloud/preview-action) or your own API client.

## More Info

See this project's main repository here: https://github.com/UffizziCloud/uffizzi

And explore Uffizzi https://uffizzi.com


================================================
FILE: charts/uffizzi-app/templates/configmap-common.yaml
================================================
apiVersion: v1
kind: ConfigMap
metadata:
  name: uffizzi-web-common-envs
data:
  DATABASE_POOL: "16"
  DATABASE_PORT: {{ .Values.global.postgresql.service.ports.postgresql | quote }}
  DATABASE_HOST: {{ default (print .Release.Name "-postgresql") .Values.db_host | quote }}
  RAILS_ENV: {{ .Values.env | quote }}
  APP_URL: {{ .Values.app_url }}
  CONTROLLER_URL: {{ default (print "http://" .Release.Name "-controller:8080") .Values.controller_url }}
  EMAIL_DELIVERY_ENABLED: {{ .Values.feature_email_delivery | quote }}
  MANAGED_DNS_ZONE_DNS_NAME: {{ .Values.managed_dns_zone_dns_name | quote }}
  UFFIZZI_USER_EMAIL: {{ .Values.global.uffizzi.firstUser.email }}
  UFFIZZI_USER_PASSWORD: {{ .Values.global.uffizzi.firstUser.password | quote }}
  UFFIZZI_PROJECT_NAME: {{ .Values.global.uffizzi.firstUser.projectName | quote }}


================================================
FILE: charts/uffizzi-app/templates/configmap-sidekiq.yaml
================================================
apiVersion: v1
kind: ConfigMap
metadata:
  name: uffizzi-web-sidekiq-envs

data:
  SIDEKIQ_CONCURRENCY: "10"


================================================
FILE: charts/uffizzi-app/templates/configmap-web.yaml
================================================
apiVersion: v1
kind: ConfigMap
metadata:
  name: uffizzi-web-service-envs

data:
  ALLOWED_HOSTS: {{ .Values.allowed_hosts | quote }}
  RAILS_PORT: "7000"
  RAILS_SERVE_STATIC_FILES: "true"
  RAILS_THREADS_COUNT: "8"
  RAILS_WORKERS_COUNT: "2"


================================================
FILE: charts/uffizzi-app/templates/secret-web.yaml
================================================
apiVersion: v1
kind: Secret
metadata:
  name: uffizzi-web-secret-envs
type: Opaque
data:
    DATABASE_USER: {{ .Values.global.postgresql.auth.username | b64enc }}
    DATABASE_PASSWORD: {{ .Values.global.postgresql.auth.password | b64enc }}
    DATABASE_NAME: {{ .Values.global.postgresql.auth.database | b64enc }}
    RAILS_SECRET_KEY_BASE: {{ .Values.rails_secret_key_base | default (printf "%x" (randAscii 64))| b64enc }}
    REDIS_URL: {{ default (print "redis://:" .Values.global.redis.password "@" .Release.Name "-redis-master") .Values.redis_url | b64enc }}
    APP_LOGIN: {{ .Values.basic_auth_login | b64enc }}
    APP_PASSWORD: {{ .Values.basic_auth_password | b64enc }}
    SIDEKIQ_LOGIN: {{ .Values.basic_auth_login | b64enc }}
    SIDEKIQ_PASSWORD: {{ .Values.basic_auth_password | b64enc }}
    CONTROLLER_LOGIN: {{ .Values.global.uffizzi.controller.username | b64enc }}
    CONTROLLER_PASSWORD: {{ .Values.global.uffizzi.controller.password | b64enc }}
    GITHUB_APP_ID: {{ .Values.github_app_id | b64enc }}
    GITHUB_APP_SLUG: {{ .Values.github_app_slug | b64enc }}
    GITHUB_CLIENT_ID: {{ .Values.github_client_id | b64enc }}
    GITHUB_CLIENT_SECRET: {{ .Values.github_client_secret | b64enc }}
    GITHUB_PRIVATE_KEY: {{ .Values.github_private_key | b64enc }}
    GITHUB_WEBHOOK_SECRET: {{ .Values.github_webhook_secret | b64enc }}


================================================
FILE: charts/uffizzi-app/templates/sidekiq-deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-sidekiq
  labels:
    app: uffizzi-sidekiq

spec:
  replicas: {{ .Values.sidekiq_replicas }}
  selector:
    matchLabels:
      app: uffizzi-sidekiq

  template:
    metadata:
      labels:
        app: uffizzi-sidekiq
    spec:
      automountServiceAccountToken: false
      containers:
      - name: uffizzi-sidekiq
        image: {{ .Values.image }}
        command:
        - /bin/bash
        - -c
        args:
        - bundle exec sidekiq -C /app/config/sidekiq.yml
        envFrom:
        - secretRef:
            name: uffizzi-web-secret-envs
            optional: false
        - configMapRef:
            name: uffizzi-web-common-envs
            optional: false
        - configMapRef:
            name: uffizzi-web-sidekiq-envs
            optional: false
        imagePullPolicy: Always
        resources:
          requests:
            cpu: 400m
            memory: 800Mi


================================================
FILE: charts/uffizzi-app/templates/web-deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
  labels:
    app: uffizzi-web

spec:
  replicas: {{ .Values.web_replicas }}
  selector:
    matchLabels:
      app: uffizzi-web

  template:
    metadata:
      labels:
        app: uffizzi-web
    spec:
      automountServiceAccountToken: false
      containers:
      - name: uffizzi-web
        image: {{ .Values.image }}
        command:
        - /bin/bash
        - -c
        args:
        - bundle exec rails db:create db:migrate && bundle exec rake uffizzi_core:create_user && bundle exec puma -C config/puma.rb
        envFrom:
        - secretRef:
            name: uffizzi-web-secret-envs
            optional: false
        - configMapRef:
            name: uffizzi-web-common-envs
            optional: false
        - configMapRef:
            name: uffizzi-web-service-envs
            optional: false
        imagePullPolicy: Always
        ports:
        - containerPort: 7000
          protocol: TCP
#        readinessProbe:
#          failureThreshold: 3
#          httpGet:
#            path: /health_check
#            port: 7000
#            scheme: HTTP
#          periodSeconds: 10
#          successThreshold: 1
#          timeoutSeconds: 1
        resources:
          requests:
            cpu: 150m
            memory: 800Mi


================================================
FILE: charts/uffizzi-app/templates/web-ingress.yaml
================================================
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Release.Name }}-web-ingress
  annotations:
    cert-manager.io/cluster-issuer: {{ print .Release.Name "-" (index (.Values) "uffizzi-controller" "clusterIssuer") }}
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: {{ .Values.webHostname }}
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: {{ .Release.Name }}-web-service
            port:
              number: 80
  tls:
  - secretName: {{ .Values.webHostname }}
    hosts:
    - {{ .Values.webHostname }}


================================================
FILE: charts/uffizzi-app/templates/web-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-web-service

spec:
  type: NodePort

  selector:
    app: uffizzi-web

  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 7000

  sessionAffinity: ClientIP


================================================
FILE: charts/uffizzi-app/values.yaml
================================================
global:
  postgresql:
    auth:
      postgresPassword: ChangeMeNow
      username: uffizzi-user
      password: ChangeMeNow
      database: uffizzi-app
    service:
      ports:
        postgresql: "5432"
  redis:
    password: ChangeMeNow
  uffizzi:
    firstUser:
      email: ""
      password: ""
      projectName: default
    controller:
      username: username
      password: ChangeMeNow

env: production
app_url: https://uffizzi.example.com
webHostname: uffizzi.example.com
image: uffizzi/app
web-replicas: 3
sidekiq-replicas: 1
hostname: localhost
controller_url: ""
allowed_hosts: ""
db_host: "" # default to dependent postgresql
rails_secret_key_base: "" # default to half-random string
redis_url: "" # default to dependent redis
managed_dns_zone_dns_name: uffizzi.example.com
basic_auth_login: username
basic_auth_password: ChangeMeNow
github_app_id: ChangeMeNow
github_app_slug: ChangeMeNow
github_client_id: ChangeMeNow
github_client_secret: ChangeMeNow
github_private_key: ChangeMeNow
github_webhook_secret: ChangeMeNow
sql_credentials_secret_name: example
feature_mailchimp: false
feature_email_delivery: false
feature_google_maps: false
feature_sentry: false
feature_stripe: false

uffizzi-controller: #dependency
  clusterIssuer: "letsencrypt"
  image: uffizzi/controller:latest
  ingress:
    hostname: uffizzi.example.com
  podCidr: 10.0.0.0/8
  zerossl:
    eab:
      hmacKey: foo
      keyId: bar
  env: "production"
  sandbox: "false"
  certEmail: "user@example.com"
  cert-manager: # dependency of dependency
    installCRDs: true

postgresql: #dependency
  enabled: true

redis: # dependency
  enabled: true


================================================
FILE: ci/github-actions/README.md
================================================
# Use Uffizzi with GitHub Actions

You can configure Uffizzi to create, update, and delete on-demand test environments with the GitHub Actions [reusable workflow](https://github.com/UffizziCloud/preview-action/blob/master/.github/workflows/reusable.yaml). This reusable workflow will execute the [Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli) on a GitHub Actions runner, which then opens a connection to the Uffizzi API.

## Example usage

The following example application demonstrates how to use Uffizzi with GitHub Actions:

[Example voting app](https://github.com/UffizziCloud/example-voting-app/blob/main/.github/workflows/uffizzi-previews.yml)



================================================
FILE: ci/gitlab/README.md
================================================
# Use Uffizzi with GitLab CI

You can configure Uffizzi to create, update, and delete on-demand Preview Environments with the GitLab CI [Environment Action](https://gitlab.com/uffizzi/environment-action). This action will execute the [Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli) on a GitLab runner, which then opens a connection to the Uffizzi API.



================================================
FILE: config/application.rb
================================================
# frozen_string_literal: true

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

require 'uffizzi_core'

module UffizziApp
  class Application < Rails::Application
    config.load_defaults(6.0)

    config.hosts = Settings.allowed_hosts

    config.middleware.insert_before(0, Rack::Cors) do
      allow do
        origins do |source|
          uri = URI.parse(source)
          Settings.allowed_hosts.any? { |host| uri.host == host || uri.host.ends_with?(host) }
        end
        resource '*', headers: :any, methods: [:get, :post, :options, :put, :patch, :delete], credentials: true
      end
    end
  end
end


================================================
FILE: config/boot.rb
================================================
# frozen_string_literal: true

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)

require 'bundler/setup' # Set up gems listed in the Gemfile.
require 'bootsnap/setup' # Speed up boot time by caching expensive operations.


================================================
FILE: config/cable.yml
================================================
development:
  adapter: async

test:
  adapter: test

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: uffizzi_app_production


================================================
FILE: config/credentials.yml.enc
================================================
/panGyOWYw7RDiAdnBU58UQcCf5LmUrtROWE1pQpIAlZ1BUUsCat6oE8MVO5TDTc4q0XOGjndQ28i+ffjpHCob1TPHlTwGmAWcaKawSOQeLPOgHHvtzumHfS5erwYLMn6DgKyUNqobtk0+0PFTiwY5Cpbukri+gwb7pc8rjweYSRilreS++X/pf7zm606NvRiIKgoVMciie25CVR9g1ll1jgjE/L750rrROrGsobLuMp6XEBdzjqI1O2P9fiyCFND3a2g4kq3ARnK7b/T2yk3NG31UABfSkNoGJk72vyxW+gottHKe1RhZ4kYWQvegycS1FrxSj2bEXcdjnWzOxs1lCzJgj2ImaYm/sN7pyDZ1zXiyYYqWpRWDbGtER0IOUVUg1bAxDK8BfFFj8kX3W4en8VkmmVcJWv7lDX--f9oik+xRebXs6ijD--rZd8unbXjXvCf6ar117b4Q==

================================================
FILE: config/database.yml
================================================
default: &default
  adapter: postgresql
  encoding: unicode
  host: <%= ENV.fetch("DATABASE_HOST") {"127.0.0.1"} %>
  port: <%= ENV.fetch("DATABASE_PORT") {5432} %>
  pool: <%= ENV.fetch("DATABASE_POOL") {5} %>
  username: <%= ENV.fetch("DATABASE_USER") {"postgres"} %>
  password: <%= ENV.fetch("DATABASE_PASSWORD") {""} %>

development:
  <<: *default
  database: uffizzi_development

test:
  <<: *default
  database: uffizzi_test

production:
  <<: *default
  database: uffizzi_production


================================================
FILE: config/environment.rb
================================================
# frozen_string_literal: true

# Load the Rails application.
require_relative 'application'

# Initialize the Rails application.
Rails.application.initialize!


================================================
FILE: config/environments/development.rb
================================================
# frozen_string_literal: true

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = false

  # Do not eager load code on boot.
  config.eager_load = false

  # Show full error reports.
  config.consider_all_requests_local = true

  # Enable/disable caching. By default caching is disabled.
  # Run rails dev:cache to toggle caching.
  if Rails.root.join('tmp', 'caching-dev.txt').exist?
    config.action_controller.perform_caching = true
    config.action_controller.enable_fragment_cache_logging = true

    config.cache_store = :memory_store
    config.public_file_server.headers = {
      'Cache-Control' => "public, max-age=#{2.days.to_i}",
    }
  else
    config.action_controller.perform_caching = false

    config.cache_store = :null_store
  end

  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :local

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false

  config.action_mailer.perform_caching = false

  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  config.logger = Logger.new($stdout)
  config.log_level = :debug

  # Raise an error on page load if there are pending migrations.
  config.active_record.migration_error = :page_load

  # Highlight code that triggered database queries in logs.
  config.active_record.verbose_query_logs = true

  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true

  # Suppress logger output for asset requests.
  config.assets.quiet = true

  # Raises error for missing translations.
  # config.action_view.raise_on_missing_translations = true

  # Use an evented file watcher to asynchronously detect changes in source code,
  # routes, locales, etc. This feature depends on the listen gem.
  config.file_watcher = ActiveSupport::FileUpdateChecker
end


================================================
FILE: config/environments/production.rb
================================================
# frozen_string_literal: true

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
  # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
  # config.require_master_key = true

  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

  # Compress CSS using a preprocessor.
  # config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = 'http://assets.example.com'

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :local

  # Mount Action Cable outside main process or domain.
  # config.action_cable.mount_path = nil
  # config.action_cable.url = 'wss://example.com/cable'
  # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # Use the lowest log level to ensure availability of diagnostic information
  # when problems arise.
  config.log_level = :debug

  # Prepend all log lines with the following tags.
  config.log_tags = [:request_id]

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Use a real queuing backend for Active Job (and separate queues per environment).
  # config.active_job.queue_adapter     = :resque
  # config.active_job.queue_name_prefix = "uffizzi_app_production"

  config.action_mailer.perform_caching = false

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Use a different logger for distributed setups.
  # require 'syslog/logger'
  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')

  if ENV['RAILS_LOG_TO_STDOUT'].present?
    logger           = ActiveSupport::Logger.new($stdout)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false

  # Inserts middleware to perform automatic connection switching.
  # The `database_selector` hash is used to pass options to the DatabaseSelector
  # middleware. The `delay` is used to determine how long to wait after a write
  # to send a subsequent read to the primary.
  #
  # The `database_resolver` class is used by the middleware to determine which
  # database is appropriate to use based on the time delay.
  #
  # The `database_resolver_context` class is used by the middleware to set
  # timestamps for the last write to the primary. The resolver uses the context
  # class timestamps to determine how long to wait before reading from the
  # replica.
  #
  # By default Rails will store a last write timestamp in the session. The
  # DatabaseSelector middleware is designed as such you can define your own
  # strategy for connection switching and pass that into the middleware through
  # these configuration options.
  # config.active_record.database_selector = { delay: 2.seconds }
  # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
  # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end


================================================
FILE: config/environments/test.rb
================================================
# frozen_string_literal: true

# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  config.cache_classes = false
  config.action_view.cache_template_loading = true

  # Do not eager load code on boot. This avoids loading your whole application
  # just for the purpose of running a single test. If you are using a tool that
  # preloads Rails for running tests, you may have to set it to true.
  config.eager_load = false

  # Configure public file server for tests with Cache-Control for performance.
  config.public_file_server.enabled = true
  config.public_file_server.headers = {
    'Cache-Control' => "public, max-age=#{1.hour.to_i}",
  }

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false
  config.cache_store = :null_store

  # Raise exceptions instead of rendering exception templates.
  config.action_dispatch.show_exceptions = false

  # Disable request forgery protection in test environment.
  config.action_controller.allow_forgery_protection = false

  # Store uploaded files on the local file system in a temporary directory.
  config.active_storage.service = :test

  config.action_mailer.perform_caching = false

  # Tell Action Mailer not to deliver emails to the real world.
  # The :test delivery method accumulates sent emails in the
  # ActionMailer::Base.deliveries array.
  config.action_mailer.delivery_method = :test

  # Print deprecation notices to the stderr.
  config.active_support.deprecation = :stderr

  # Raises error for missing translations.
  # config.action_view.raise_on_missing_translations = true
end


================================================
FILE: config/initializers/application_controller_renderer.rb
================================================
# frozen_string_literal: true
# Be sure to restart your server when you modify this file.

# ActiveSupport::Reloader.to_prepare do
#   ApplicationController.renderer.defaults.merge!(
#     http_host: 'example.org',
#     https: false
#   )
# end


================================================
FILE: config/initializers/assets.rb
================================================
# frozen_string_literal: true

# Be sure to restart your server when you modify this file.

# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'

# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join('node_modules')

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in the app/assets
# folder are already added.
# Rails.application.config.assets.precompile += %w( admin.js admin.css )


================================================
FILE: config/initializers/backtrace_silencers.rb
================================================
# frozen_string_literal: true
# Be sure to restart your server when you modify this file.

# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }

# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
# Rails.backtrace_cleaner.remove_silencers!


================================================
FILE: config/initializers/content_security_policy.rb
================================================
# frozen_string_literal: true
# Be sure to restart your server when you modify this file.

# Define an application-wide content security policy
# For further information see the following documentation
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy

# Rails.application.config.content_security_policy do |policy|
#   policy.default_src :self, :https
#   policy.font_src    :self, :https, :data
#   policy.img_src     :self, :https, :data
#   policy.object_src  :none
#   policy.script_src  :self, :https
#   policy.style_src   :self, :https
#   # If you are using webpack-dev-server then specify webpack-dev-server host
#   policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?

#   # Specify URI for violation reports
#   # policy.report_uri "/csp-violation-report-endpoint"
# end

# If you are using UJS then enable automatic nonce generation
# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }

# Set the nonce only to specific directives
# Rails.application.config.content_security_policy_nonce_directives = %w(script-src)

# Report CSP violations to a specified URI
# For further information see the following documentation:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
# Rails.application.config.content_security_policy_report_only = true


================================================
FILE: config/initializers/cookies_serializer.rb
================================================
# frozen_string_literal: true

# Be sure to restart your server when you modify this file.

# Specify a serializer for the signed and encrypted cookie jars.
# Valid options are :json, :marshal, and :hybrid.
Rails.application.config.action_dispatch.cookies_serializer = :json


================================================
FILE: config/initializers/filter_parameter_logging.rb
================================================
# frozen_string_literal: true

# Be sure to restart your server when you modify this file.

# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [:password]


================================================
FILE: config/initializers/health_check.rb
================================================
# frozen_string_literal: true

HealthCheck.setup do |config|
  config.uri = ENV['HEALTH_CHECK_URI'] || 'health_check'
  config.success = 'success'
  config.http_status_for_error_text = 500
  config.http_status_for_error_object = 500
  config.standard_checks = ['database', 'migrations']
  config.full_checks = ['database', 'migrations']
end


================================================
FILE: config/initializers/inflections.rb
================================================
# frozen_string_literal: true
# Be sure to restart your server when you modify this file.

# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.plural /^(ox)$/i, '\1en'
#   inflect.singular /^(ox)en/i, '\1'
#   inflect.irregular 'person', 'people'
#   inflect.uncountable %w( fish sheep )
# end

# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.acronym 'RESTful'
# end


================================================
FILE: config/initializers/mime_types.rb
================================================
# frozen_string_literal: true
# Be sure to restart your server when you modify this file.

# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf


================================================
FILE: config/initializers/sidekiq.rb
================================================
# frozen_string_literal: true

require 'sidekiq/web'
require 'sidekiq-unique-jobs'

Sidekiq.configure_client do |config|
  config.redis = { url: ENV['REDIS_URL'], size: 2 }

  config.client_middleware do |chain|
    chain.add(SidekiqUniqueJobs::Middleware::Client)
  end
end

Sidekiq.configure_server do |config|
  config.redis = { url: ENV['REDIS_URL'], size: 20 }

  config.client_middleware do |chain|
    chain.add(SidekiqUniqueJobs::Middleware::Client)
  end

  config.server_middleware do |chain|
    chain.add(SidekiqUniqueJobs::Middleware::Server)
  end

  SidekiqUniqueJobs::Server.configure(config)
end

if Settings.sidekiq.login.present?
  Sidekiq::Web.use(Rack::Auth::Basic) do |username, password|
    valid_login = ActiveSupport::SecurityUtils.secure_compare(
      ::Digest::SHA256.hexdigest(username),
      ::Digest::SHA256.hexdigest(Settings.sidekiq.login),
    )
    valid_password = ActiveSupport::SecurityUtils.secure_compare(
      ::Digest::SHA256.hexdigest(password),
      ::Digest::SHA256.hexdigest(Settings.sidekiq.password),
    )
    valid_login & valid_password
  end
end

SidekiqUniqueJobs.configure do |config|
  config.enabled = !Rails.env.test?
end


================================================
FILE: config/initializers/wrap_parameters.rb
================================================
# frozen_string_literal: true

# Be sure to restart your server when you modify this file.

# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.

# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end

# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
#   self.include_root_in_json = true
# end


================================================
FILE: config/locales/en.yml
================================================
# Files in the config/locales directory are used for internationalization
# and are automatically loaded by Rails. If you want to use locales other
# than English, add the necessary files in this directory.
#
# To use the locales, use `I18n.t`:
#
#     I18n.t 'hello'
#
# In views, this is aliased to just `t`:
#
#     <%= t('hello') %>
#
# To use a different locale, set it with `I18n.locale`:
#
#     I18n.locale = :es
#
# This would use the information in config/locales/es.yml.
#
# The following keys must be escaped otherwise they will not be retrieved by
# the default I18n backend:
#
# true, false, on, off, yes, no
#
# Instead, surround them with single quotes.
#
# en:
#   'true': 'foo'
#
# To learn more, please read the Rails Internationalization guide
# available at https://guides.rubyonrails.org/i18n.html.

en:


================================================
FILE: config/puma.rb
================================================
# frozen_string_literal: true

threads_count = ENV.fetch('RAILS_THREADS_COUNT', 5)
threads threads_count, threads_count

port ENV.fetch('RAILS_PORT', 7000)
environment ENV.fetch('RAILS_ENV', 'development')

workers ENV.fetch('RAILS_WORKERS_COUNT', 18)

preload_app! if ENV.fetch('RAILS_WORKERS_COUNT').to_i.positive?

before_fork do
  ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord)
end

on_worker_boot do
  ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end


================================================
FILE: config/routes.rb
================================================
# frozen_string_literal: true

Rails.application.routes.draw do
  mount UffizziCore::Engine => '/'
  health_check_routes
end


================================================
FILE: config/secrets.yml
================================================
default: &default
  secret_key_base: <%=Settings.rails.secret_key_base%>

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default


================================================
FILE: config/settings.yml
================================================
rails:
  secret_key_base: <%= ENV['RAILS_SECRET_KEY_BASE'] %>
app:
  ttl_reset_password_token: 900
  host: <%= ENV['APP_URL'] %>
  login:  <%= ENV['APP_LOGIN'] || '' %>
  password:  <%= ENV['APP_PASSWORD'] || '' %>
  managed_dns_zone: <%= ENV['MANAGED_DNS_ZONE_DNS_NAME'] %>
github:
  app_id: <%= ENV['GITHUB_APP_ID'] %>
  app_slug: <%= ENV['GITHUB_APP_SLUG'] %>
  client_id: <%= ENV['GITHUB_CLIENT_ID'] %>
  client_secret: <%= ENV['GITHUB_CLIENT_SECRET'] %>
  private_key: "<%= ENV['GITHUB_PRIVATE_KEY'] %>"
  webhook_secret: <%= ENV['GITHUB_WEBHOOK_SECRET'] %>
docker_hub:
  registry_url: 'https://index.docker.io/v1/'
  public_namespace: 'library'
sidekiq:
  login:  <%= ENV['SIDEKIQ_LOGIN'] || '' %>
  password:  <%= ENV['SIDEKIQ_PASSWORD'] || '' %>
controller:
  url:  <%= ENV['CONTROLLER_URL'] || 'http://controller:8080' %>
  login:  <%= ENV['CONTROLLER_LOGIN'] || '' %>
  password:  <%= ENV['CONTROLLER_PASSWORD'] || '' %>
  connection:
    retires_count: 1
    next_retry_timeout_seconds: 1
    timeout: 7
    open_timeout: 5
  limits:
    cpu: '200m'
  namespace_prefix: 'app-'
  resource_create_retry_time: <%= 15.seconds %>
  resource_update_retry_count: 60
vcluster_controller:
  url:  <%= ENV['VCLUSTER_CONTROLLER_URL'] || 'http://controller:8080' %>
  login:  <%= ENV['VCLUSTER_CONTROLLER_LOGIN'] || '' %>
  password:  <%= ENV['VCLUSTER_CONTROLLER_PASSWORD'] || '' %>
  managed_dns_zone: <%= ENV['VCLUSTER_MANAGED_DNS_ZONE_DNS_NAME'] %>
  connection:
    retires_count: 1
    next_retry_timeout_seconds: 1
    timeout: 15
    open_timeout: 10
billing_cycle:
  hours_count: 720
slack:
  invite_url: https://join.slack.com/t/uffizzi/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A
allowed_hosts: <%= ENV['ALLOWED_HOSTS']&.split(',') || [] %>
domain: <%= ENV['APP_URL'] %>
sentry:
  dsn: <%= ENV['SENTRY_DSN'] %>
  release: <%= ENV['SENTRY_RELEASE'] %>
  env: <%= Rails.env %>
features:
  email_delivery_enabled: <%= !!ActiveModel::Type::Boolean.new.cast(ENV['EMAIL_DELIVERY_ENABLED']) %>
  stripe_enabled: <%= !!ActiveModel::Type::Boolean.new.cast(ENV['STRIPE_ENABLED']) %>
platform_cluster:
  project_id: <%= ENV['PLATFORM_PROJECT_ID'] %>
google:
  registry_url: 'https://gcr.io/'
github_container_registry:
  registry_url: 'https://ghcr.io/'
compose:
  default_memory: 125
  memory_postfixes: <%= ['b', 'k', 'm', 'g'] %>
  memory_values: <%= [125, 250, 500, 1000, 2000, 4000] %>
  port_min_value: 1
  port_max_value: 65535
  delete_after_postfixes: <%= ['h'] %>
  delete_after_min_value: 1
  delete_after_max_value: 720
  default_tag: latest
  dockerfile_default_path: Dockerfile
  default_branch: 'master'
continuous_preview:
  default_delete_preview_after: 72
deployment:
  max_memory_limit: 8000
  subdomain:
    length_limit: 63
default_job_retry_count: 5
vcluster:
  max_creation_retry_count: 5


================================================
FILE: config/sidekiq.yml
================================================
---
:concurrency: <%= ENV["SIDEKIQ_CONCURRENCY"].nil? ? 5 : ENV["SIDEKIQ_CONCURRENCY"].to_i %>
:verbose: true
:queues:
  - [default, 5]
  - [active_storage_analysis, 5]
  - [active_storage_purge, 5]
  - [mailers, 5]
  - [billing, 6]
  - [deployments, 10]
  - [config_files, 10]
  - [compose_files, 10]
  - [resources, 10]
  - [databases, 10]
  - [projects, 10]
  - [accounts, 10]
  - [containers, 10]
  - [github, 10]
  - [disable_deployments, 5]
  - [clusters, 10]


================================================
FILE: config/storage.yml
================================================
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>


================================================
FILE: config.ru
================================================
# frozen_string_literal: true

# This file is used by Rack-based servers to start the application.

require_relative 'config/environment'

run Rails.application


================================================
FILE: core/.gitignore
================================================
/.bundle/
/doc/
/log/*.log
/pkg/
/tmp/
/test/dummy/db/*.sqlite3
/test/dummy/db/*.sqlite3-*
/test/dummy/log/*.log
/test/dummy/storage/
/test/dummy/tmp/
.byebug_history


================================================
FILE: core/CHANGELOG.md
================================================
## [0.1.0] - 2022-04-05

- Initial release


================================================
FILE: core/Dockerfile
================================================
FROM ruby:3.0.2-alpine3.14

RUN apk update && apk upgrade && apk add bash curl-dev ruby-dev build-base git gcompat \
                                 curl ruby-json openssl postgresql-dev postgresql-client tzdata

RUN mkdir -p /gem
WORKDIR /gem

ENV GEM_HOME="/usr/local/bundle"

COPY lib/uffizzi_core/version.rb /gem/lib/uffizzi_core/
COPY uffizzi_core.gemspec /gem/
COPY Gemfile* /gem/
RUN bundle install --jobs 4

COPY . /gem

ENV PATH /gem/bin:$GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH


================================================
FILE: core/Gemfile
================================================
# frozen_string_literal: true

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

gem 'iri'

gemspec


================================================
FILE: core/LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: core/Makefile
================================================
release_gem:
	mkdir -p ${HOME}/.gem
	touch ${HOME}/.gem/credentials
	chmod 0600 ${HOME}/.gem/credentials
	printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}\n" > ${HOME}/.gem/credentials
	gem build *.gemspec
	gem push *.gem


================================================
FILE: core/README.md
================================================
# Uffizzi Core

**Uffizzi CLI API, Models, Services and core libraries**

## Uffizzi Overview

Uffizzi is the Full-stack Previews Engine that makes it easy for your team to preview code changes before merging—whether frontend, backend or microserivce. Define your full-stack apps with a familiar syntax based on Docker Compose, and Uffizzi will create on-demand test environments when you open pull requests or build new images. Preview URLs are updated when there’s a new commit, so your team can catch issues early, iterate quickly, and accelerate your release cycles.

## Getting started with Uffizzi

The fastest and easiest way to get started with Uffizzi is via the fully hosted version available at https://uffizzi.com, which includes free plans for small teams and qualifying open-source projects. 

Alternatively, you can self-host Uffizzi via the open-source repositories available here on GitHub. The remainder of this README is intended for users interested in self-hosting Uffizzi or for those who are just curious about how Uffizzi works.

## Uffizzi Architecture

Uffizzi consists of the following components:

* [Uffizzi App](https://github.com/UffizziCloud/uffizzi_app) - The primary REST API for creating and managing Previews
* [Uffizzi Controller](https://github.com/UffizziCloud/uffizzi_controller) - A smart proxy service that handles requests from Uffizzi App to the Kubernetes API
* Uffizzi CLI (this repository) - A command-line interface for Uffizzi App
* [Uffizzi Dashboard](https://app.uffizzi.com) - A graphical user interface for Uffizzi App, available as a paid service at https://uffizzi.com

To host Uffizzi yourself, you will also need the following external dependencies:

 * Kubernetes (k8s) cluster
 * Postgres database
 * Redis cache

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'uffizzi_core'
```

And then execute:
```bash
$ bundle
```

Or install it yourself as:
```bash
$ gem install uffizzi_core
```


================================================
FILE: core/Rakefile
================================================
# frozen_string_literal: true

require 'bundler/setup'

APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
load 'rails/tasks/engine.rake'

load 'rails/tasks/statistics.rake'

require 'bundler/gem_tasks'

require 'rake/testtask'

Rake::TestTask.new(:test) do |t|
  t.libs << 'test'
  t.pattern = 'test/**/*_test.rb'
  t.verbose = false
end

task default: :test

namespace :core do
  desc 'Generate api docs'
  task generate_docs: :environment do
    SwaggerYard.register_custom_yard_tags!

    spec = SwaggerYard::Swagger.new

    File.open('swagger/v1/swagger.json', 'w') { |f| f << JSON.pretty_generate(spec.to_h) }
  end
end


================================================
FILE: core/app/assets/config/uffizzi_core_manifest.js
================================================
//= link_directory ../stylesheets/uffizzi_core .css


================================================
FILE: core/app/assets/images/uffizzi_core/.keep
================================================


================================================
FILE: core/app/assets/stylesheets/uffizzi_core/application.css
================================================
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */


================================================
FILE: core/app/clients/uffizzi_core/amazon_registry_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::AmazonRegistryClient
  attr_accessor :client, :token, :registry_url

  def initialize(region:, access_key_id:, secret_access_key:)
    credentials = Aws::Credentials.new(access_key_id, secret_access_key)
    @client = Aws::ECR::Client.new(region: region, credentials: credentials)
  end

  def authorization_token
    client.get_authorization_token({})
  end

  def batch_get_image(image:, tag:)
    client.batch_get_image({ image_ids: [{ image_tag: tag }], repository_name: image })
  end
end


================================================
FILE: core/app/clients/uffizzi_core/azure_registry_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::AzureRegistryClient::RequestResult < Hashie::Mash
  disable_warnings :key
end


================================================
FILE: core/app/clients/uffizzi_core/azure_registry_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::AzureRegistryClient
  attr_accessor :connection, :token, :registry_url

  def initialize(registry_url:, username:, password:)
    @registry_url = registry_url
    @connection = build_connection(registry_url, username, password)
    @token = oauth2_token&.result&.access_token
  end

  def manifests(image:, tag:)
    url = "/v2/#{image}/manifests/#{tag}"
    response = connection.get(url)

    RequestResult.quiet.new(result: response.body, headers: response.headers)
  end

  def oauth2_token
    service = URI.parse(registry_url).hostname
    url = "/oauth2/token?service=#{service}"

    response = connection.get(url, {})

    RequestResult.new(result: response.body)
  end

  def authenticated?
    token.present?
  end

  private

  def build_connection(registry_url, username, password)
    connection = Faraday.new(registry_url) do |faraday|
      faraday.request(:basic_auth, username, password)
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end
end


================================================
FILE: core/app/clients/uffizzi_core/container_registry_request_decorator.rb
================================================
# frozen_string_literal: true

module UffizziCore::ContainerRegistryRequestDecorator
  [:get, :post, :head].each do |method|
    define_method(method) do |url, params_or_body = nil, headers = nil, &block|
      super(url, params_or_body, headers, &block)
    rescue Faraday::ClientError => e
      raise UffizziCore::ContainerRegistryError.new(e.response)
    end
  end
end


================================================
FILE: core/app/clients/uffizzi_core/controller_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::ControllerClient::RequestResult < Hashie::Mash
  disable_warnings :key
end


================================================
FILE: core/app/clients/uffizzi_core/controller_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::ControllerClient
  class ConnectionError < StandardError; end

  attr_accessor :connection

  def initialize(connection_settings)
    @connection = build_connection(connection_settings)
  end

  def apply_config_file(deployment_id:, config_file_id:, body:)
    connection.post("/deployments/#{deployment_id}/config_files/#{config_file_id}", body)
  end

  def deployment_containers(deployment_id:)
    get("/deployments/#{deployment_id}/containers")
  end

  def deploy_containers(deployment_id:, body:)
    connection.post("/deployments/#{deployment_id}/containers", body)
  end

  def deployment_containers_metrics(deployment_id:)
    get("/deployments/#{deployment_id}/containers/metrics")
  end

  def deployment_container_logs(deployment_id:, container_name:, limit:, previous:)
    get("/deployments/#{deployment_id}/containers/#{container_name}/logs?limit=#{limit}&previous=#{previous}")
  end

  def deployment_containers_events(deployment_id:)
    events = get("/deployments/#{deployment_id}/containers/events").result.items
    pods_events = events.select { |event| event.involved_object.kind == 'Pod' }
    pods_events.map do |event|
      { first_timestamp: event.first_timestamp, last_timestamp: event.last_timestamp, reason: event.reason, message: event.message }
    end
  end

  def nodes
    get('/nodes')
  end

  def apply_credential(deployment_id:, body:)
    connection.post("/deployments/#{deployment_id}/credentials", body)
  end

  def delete_credential(deployment_id:, credential_id:)
    connection.delete("/deployments/#{deployment_id}/credentials/#{credential_id}")
  end

  def get_deployments_usage_metrics_containers(deployment_ids:, begin_at:, end_at:)
    query_params = {
      deployment_ids: deployment_ids,
      begin_at: begin_at,
      end_at: end_at,
    }
    get('/deployments/usage_metrics/containers', query_params)
  end

  def create_namespace(body:)
    post('/namespaces', body)
  end

  def namespace(namespace:)
    get("/namespaces/#{namespace}")
  end

  def delete_namespace(namespace:)
    connection.delete("/namespaces/#{namespace}")
  end

  def create_cluster(namespace:, body:)
    post("/namespaces/#{namespace}/cluster", body)
  end

  def show_cluster(namespace:, name:)
    get("/namespaces/#{namespace}/cluster/#{name}")
  end

  def patch_cluster(name:, namespace:, body:)
    patch("/namespaces/#{namespace}/cluster/#{name}", body)
  end

  def ingresses(namespace:)
    get("/namespaces/#{namespace}/ingresses")
  end

  private

  def get(url, params = {})
    make_request(:get, url, params)
  end

  def post(url, params = {})
    make_request(:post, url, params)
  end

  def patch(url, params = {})
    make_request(:patch, url, params)
  end

  def make_request(method, url, params)
    response = connection.send(method, url, params)
    body = response.body
    underscored_body = UffizziCore::Converters.deep_underscore_keys(body)

    RequestResult.quiet.new(code: response.status, result: underscored_body)
  rescue Faraday::ServerError
    raise ConnectionError
  end

  def build_connection(settings)
    connection = settings.connection
    handled_exceptions = Faraday::Request::Retry::DEFAULT_EXCEPTIONS + [Faraday::ConnectionFailed]

    Faraday.new(settings.url) do |conn|
      conn.options.timeout = connection.timeout
      conn.options.open_timeout = connection.open_timeout
      conn.request(:basic_auth, settings.login, settings.password)
      conn.request(:json)
      conn.request(:retry,
                   max: connection.retires_count,
                   interval: connection.next_retry_timeout_seconds,
                   exceptions: handled_exceptions)
      conn.response(:json)
      conn.response(:raise_error)
      conn.adapter(Faraday.default_adapter)
    end
  end
end


================================================
FILE: core/app/clients/uffizzi_core/docker_hub_client/not_authorized_error.rb
================================================
# frozen_string_literal: true

class UffizziCore::DockerHubClient
  class NotAuthorizedError < StandardError
  end
end


================================================
FILE: core/app/clients/uffizzi_core/docker_hub_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::DockerHubClient
  class RequestResult < Hashie::Mash
    disable_warnings :key
  end
end


================================================
FILE: core/app/clients/uffizzi_core/docker_hub_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::DockerHubClient
  attr_accessor :connection, :jwt, :credential

  BASE_URL = 'https://hub.docker.com'

  def initialize(credential = nil)
    @connection = build_connection
    @credential = credential
    return unless credential

    @jwt = authenticate
  end

  def authenticate
    params = { username: credential.username, password: credential.password }
    url = "#{BASE_URL}/v2/users/login/"
    response = connection.post(url, params)
    request_result = RequestResult.new(result: response.body)
    request_result.result.token
  rescue NoMethodError
    nil
  end

  def repository(namespace:, image:)
    url = "#{BASE_URL}/v2/repositories/#{namespace}/#{image}"

    response = connection.get(url) do |request|
      request.headers['Authorization'] = "JWT #{jwt}"
    end
    RequestResult.new(status: response.status, result: response.body)
  end

  def public_images(q:, page: 1, per_page: 25)
    url = "#{BASE_URL}/api/content/v1/products/search"
    params = { page_size: per_page, q: q, type: :image, page: page }
    response = connection.get(url, params) do |request|
      request.headers['Search-Version'] = 'v3'
    end
    RequestResult.new(result: response.body)
  end

  def private_images(account:, page: 1, per_page: 25)
    raise NotAuthorizedError if !authenticated? || account.empty?

    url =  BASE_URL + "/v2/repositories/#{account}/"
    params = { page_size: per_page, page: page }
    response = connection.get(url, params) do |request|
      request.headers['Authorization'] = "JWT #{jwt}"
    end
    RequestResult.new(result: response.body)
  end

  def accounts
    raise NotAuthorizedError if !authenticated?

    url = "#{BASE_URL}/v2/repositories/namespaces/"
    response = connection.get(url) do |request|
      request.headers['Authorization'] = "JWT #{jwt}"
    end
    RequestResult.new(result: response.body)
  end

  def metadata(namespace:, image:)
    url = BASE_URL + "/v2/repositories/#{namespace}/#{image}/"
    response = connection.get(url) do |request|
      request.headers['Authorization'] = "JWT #{jwt}"
    end
    RequestResult.quiet.new(result: response.body)
  end

  def tags(namespace:, image:, q: '', page: 1, per_page: 10)
    url = BASE_URL + "/v2/repositories/#{namespace}/#{image}/tags"
    params = { page_size: per_page, page: page, name: q }
    response = connection.get(url, params) do |request|
      request.headers['Authorization'] = "JWT #{jwt}"
    end
    RequestResult.quiet.new(result: response.body)
  end

  def digest(image:, tag:, token:)
    url = "https://index.docker.io/v2/#{image}/manifests/#{tag}"
    response = connection.get(url) do |request|
      request.headers['Accept'] = 'application/vnd.docker.distribution.manifest.v2+json'
      request.headers['Authorization'] = "Bearer #{token}"
    end

    RequestResult.quiet.new(result: response.body, headers: response.headers)
  end

  def get_token(repository)
    params = { username: credential.username, password: credential.password }
    url = "https://auth.docker.io/token?service=registry.docker.io&scope=repository:#{repository}:pull"
    response = connection.get(url, params)
    RequestResult.new(result: response.body)
  end

  def authenticated?
    jwt.present?
  end

  private

  def build_connection
    connection = Faraday.new do |faraday|
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end
end


================================================
FILE: core/app/clients/uffizzi_core/docker_registry_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::DockerRegistryClient::RequestResult < Hashie::Mash
  disable_warnings :key
end


================================================
FILE: core/app/clients/uffizzi_core/docker_registry_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::DockerRegistryClient
  ACCEPTED_TYPES = [
    'application/vnd.oci.image.index.v1+json',
    'application/vnd.oci.image.manifest.v1+json',
    'application/vnd.docker.distribution.manifest.v1+json',
    'application/vnd.docker.distribution.manifest.v2+json',
    'application/vnd.docker.distribution.manifest.list.v2+json',
    '*/*',
  ].freeze

  def initialize(registry_url:, username: nil, password: nil)
    @registry_url = registry_url
    @connection = build_connection(username, password)
  end

  def authenticated?
    @connection.get("#{@registry_url}/v2/")

    true
  end

  def manifests(image:, tag:, namespace: nil)
    full_image = [namespace, image].compact.join('/')
    url = "#{@registry_url}/v2/#{full_image}/manifests/#{tag}"
    response = @connection.get(url)

    RequestResult.new(status: response.status, result: response.body)
  end

  private

  def build_connection(username, password)
    # initializing Faraday with the registry_url will trim the trailing slash required for the /v2/ request
    connection = Faraday.new do |faraday|
      faraday.headers['Accept'] = ACCEPTED_TYPES
      faraday.request(:basic_auth, username, password) if username.present? && password.present?
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:follow_redirects)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end
end


================================================
FILE: core/app/clients/uffizzi_core/github_container_registry_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::GithubContainerRegistryClient
  class RequestResult < Hashie::Mash
    disable_warnings :key
  end
end


================================================
FILE: core/app/clients/uffizzi_core/github_container_registry_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::GithubContainerRegistryClient
  attr_accessor :token, :registry_url

  def initialize(registry_url:, username:, password:)
    @registry_url = registry_url
    @username = username
    @password = password
    @token = access_token&.result&.token
  end

  def access_token
    service = URI.parse(registry_url).hostname
    url = "/token?service=#{service}"

    response = connection.get(url, {})

    RequestResult.new(result: response.body)
  end

  def authenticated?
    token.present?
  end

  def manifests(image:, tag:)
    url = "/v2/#{@username}/#{image}/manifests/#{tag}"
    response = token_connection.get(url)

    RequestResult.quiet.new(result: response.body, headers: response.headers)
  end

  private

  def connection
    connection = Faraday.new(registry_url) do |faraday|
      faraday.request(:basic_auth, @username, @password)
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end

  def token_connection
    connection = Faraday.new(registry_url) do |faraday|
      faraday.request(:authorization, 'Bearer', token)
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end
end


================================================
FILE: core/app/clients/uffizzi_core/google_registry_client/request_result.rb
================================================
# frozen_string_literal: true

class UffizziCore::GoogleRegistryClient::RequestResult < Hashie::Mash
  disable_warnings :key
end


================================================
FILE: core/app/clients/uffizzi_core/google_registry_client.rb
================================================
# frozen_string_literal: true

class UffizziCore::GoogleRegistryClient
  attr_accessor :connection, :token, :registry_url

  def initialize(registry_url:, username:, password:)
    @registry_url = registry_url
    @connection = build_connection(registry_url, username, password)
    @token = access_token&.result&.token
  end

  def manifests(image:, tag:)
    url = "/v2/#{image}/manifests/#{tag}"
    response = connection.get(url)

    RequestResult.quiet.new(result: response.body, headers: response.headers)
  end

  def access_token
    service = URI.parse(registry_url).hostname
    url = "/v2/token?service=#{service}"

    response = connection.get(url, {})

    RequestResult.new(result: response.body)
  end

  def authenticated?
    token.present?
  end

  private

  def build_connection(registry_url, username, password)
    connection = Faraday.new(registry_url) do |faraday|
      faraday.request(:basic_auth, username, password)
      faraday.request(:json)
      faraday.response(:json)
      faraday.response(:raise_error)
      faraday.adapter(Faraday.default_adapter)
    end

    connection.extend(UffizziCore::ContainerRegistryRequestDecorator)
  end
end


================================================
FILE: core/app/contexts/uffizzi_core/account_context.rb
================================================
# frozen_string_literal: true

class UffizziCore::AccountContext
  attr_reader :user, :user_access_module, :account, :params

  def initialize(user, user_access_module, account, params)
    @user = user
    @user_access_module = user_access_module
    @account = account
    @params = params
  end
end


================================================
FILE: core/app/contexts/uffizzi_core/base_context.rb
================================================
# frozen_string_literal: true

class UffizziCore::BaseContext
  attr_reader :user, :user_access_module, :params

  def initialize(user, user_access_module, params)
    @user = user
    @user_access_module = user_access_module
    @params = params
  end
end


================================================
FILE: core/app/contexts/uffizzi_core/project/cluster_context.rb
================================================
# frozen_string_literal: true

class UffizziCore::Project::ClusterContext
  attr_reader :user, :user_access_module, :project, :cluster, :params

  def initialize(user, project, user_access_module, cluster, params)
    @user = user
    @user_access_module = user_access_module
    @project = project
    @cluster = cluster
    @params = params
  end
end


================================================
FILE: core/app/contexts/uffizzi_core/project_context.rb
================================================
# frozen_string_literal: true

class UffizziCore::ProjectContext
  attr_reader :user, :user_access_module, :project, :account, :params

  def initialize(user, user_access_module, project, account, params)
    @user = user
    @user_access_module = user_access_module
    @account = account
    @project = project
    @params = params
  end
end


================================================
FILE: core/app/contexts/uffizzi_core/webhooks_context.rb
================================================
# frozen_string_literal: true

class UffizziCore::WebhooksContext
  attr_reader :request

  def initialize(request)
    @request = request
  end
end


================================================
FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/accounts_controller_module.rb
================================================
# frozen_string_literal: true

module UffizziCore::Api::Cli::V1::AccountsControllerModule
  def update; end
end


================================================
FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects/clusters_controller_module.rb
================================================
# frozen_string_literal: true

module UffizziCore::Api::Cli::V1::Projects::ClustersControllerModule
  private

  def update_show_trial_quota_exceeded_warning; end

  def check_account_quota; end

  def check_current_plan; end
end


================================================
FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects/deployments_controller_module.rb
================================================
# frozen_string_literal: true

module UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerModule
  private

  def check_account_quota; end

  def update_show_trial_quota_exceeded_warning; end

  def check_current_plan; end
end


================================================
FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects_controller_module.rb
================================================
# frozen_string_literal: true

module UffizziCore::Api::Cli::V1::ProjectsControllerModule
  private

  def update_show_trial_quota_exceeded_warning; end
end


================================================
FILE: core/app/controllers/concerns/uffizzi_core/auth_management.rb
================================================
# frozen_string_literal: true

module UffizziCore::AuthManagement
  def sign_in(user)
    session[:user_id] = user.id
  end

  def sign_out
    session[:user_id] = @current_user = nil
  end

  def signed_in?
    session[:user_id].present? && current_user.present?
  end

  def current_user
    @current_user ||= UffizziCore::User.find_by(id: current_user_id)
  end

  def auth_token
    header = request.headers['Authorization']
    header&.split(' ')&.last
  end

  def current_user_id
    return session[:user_id] if session[:user_id].present?
    return unless auth_token.present?

    decoded_token = UffizziCore::TokenService.decode(auth_token)
    return unless decoded_token
    return if decoded_token.first['expires_at'] < DateTime.now

    decoded_token.first['user_id']
  end

  def authenticate_request!
    current_user ? true : head(:unauthorized)
  end
end


================================================
FILE: core/app/controllers/concerns/uffizzi_core/authorization_concern.rb
================================================
# frozen_string_literal: true

module UffizziCore::AuthorizationConcern
  extend ActiveSupport::Concern

  included do
    before_action :init_authorize
  end

  def init_authorize
    return unless self.class.ancestors.include?(UffizziCore::ApplicationController)

    self.class.send(:define_method, policy_method_name) { send(:authorize, policy_method_params) }
  end

  def pundit_user
    policy_context
  end

  private

  def policy_method_name
    [:authorize, policy_name].join('_')
  end

  def policy_name
    controller_class = self.class.to_s

    controller_class.gsub(/::|Controller/, '').underscore
  end

  def policy_method_params
    controller_class = self.class.to_s

    params = controller_class.gsub(/Controller/, '').split('::')
    params.map(&:underscore).map(&:downcase).map(&:to_sym)
  end
end


================================================
FILE: core/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb
================================================
# frozen_string_literal: true

module UffizziCore::DependencyInjectionConcern
  extend ActiveSupport::Concern

  class_methods do
    def include_module_if_exists(module_name)
      include(Object.const_get(module_name)) if Object.const_defined?(module_name)
    end

    def prepend_module_if_exists(module_name)
      prepend(Object.const_get(module_name)) if Object.const_defined?(module_name)
    end
  end

  def user_access_module
    return unless module_exists?(:rbac)

    UffizziCore::UserAccessService.new(module_class(:rbac))
  end

  def find_build_parser_module
    module_class(:build_parser)
  end

  def find_volume_parser_module
    module_class(:volume_parser)
  end

  def ci_module
    return unless module_exists?(:ci_module)

    module_class(:ci_module)
  end

  def ci_session
    return unless module_exists?(:ci_session)

    module_class(:ci_session)
  end

  def password_protection_module
    return unless module_exists?(:password_protection)

    module_class(:password_protection)
  end

  def find_ingress_parser_module
    module_class(:ingress_parser)
  end

  def notification_module
    return unless module_exists?(:notification_module)

    module_class(:notification_module)
  end

  def domain_module
    return unless module_exists?(:domain_module)

    module_class(:domain_module)
  end

  def deployment_memory_module
    return unless module_exists?(:deployment_memory_module)

    module_class(:deployment_memory_module)
  end

  def template_memory_module
    return unless module_exists?(:template_memory_module)

    module_class(:template_memory_module)
  end

  def controller_settings_service
    return unless module_exists?(:controller_settings)

    module_class(:controller_settings)
  end

  private

  def module_exists?(module_name)
    module_class(module_name).present?
  end

  def module_class(module_name)
    UffizziCore.dependencies[module_name]&.constantize
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Accounts::ApplicationController < UffizziCore::Api::Cli::V1::ApplicationController
  def resource_account
    @resource_account ||= current_user.accounts.find(params[:account_id])
  end

  def policy_context
    UffizziCore::AccountContext.new(current_user, user_access_module, resource_account, params)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/clusters_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Accounts::ClustersController < UffizziCore::Api::Cli::V1::Accounts::ApplicationController
  include UffizziCore::DependencyInjectionConcern
  before_action :authorize_uffizzi_core_api_cli_v1_accounts_clusters

  def index
    return respond_with(clusters_by_account.includes(:project)) if valid_request_from_ci_workflow?

    clusters = clusters_by_user.or(clusters_by_admin_projects)
    respond_with(clusters.includes(:project))
  end

  private

  def valid_request_from_ci_workflow?
    ci_module.valid_request_from_ci_workflow?(params)
  end

  def clusters_by_admin_projects
    projects = UffizziCore::Project
      .active
      .joins(:user_projects)
      .where(account: resource_account)
      .where(user_projects: { role: UffizziCore::UserProject.role.admin, user: current_user })

    UffizziCore::Cluster.enabled.where(project_id: projects.select(:id))
  end

  def clusters_by_user
    UffizziCore::Cluster.enabled.by_projects(account_projects).deployed_by_user(current_user)
  end

  def clusters_by_account
    UffizziCore::Cluster.enabled.by_projects(account_projects)
  end

  def account_projects
    UffizziCore::Project.active.where(account: resource_account)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/credentials_controller.rb
================================================
# frozen_string_literal: true

# @resource Account/Credential
class UffizziCore::Api::Cli::V1::Accounts::CredentialsController < UffizziCore::Api::Cli::V1::Accounts::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_accounts_credentials

  # Get a list of accounts credential
  #
  # @path [GET] /api/cli/v1/account/credentials
  #
  # @parameter credential(required,body) [object<username:string, password: string, type:string>]
  def index
    credentials = resource_account.credentials.pluck(:type)

    render json: { credentials: credentials }, status: :ok
  end

  # Create account credential
  #
  # @path [POST] /api/cli/v1/account/credentials
  #
  # @parameter credential(required,body) [object<username:string, password: string, type:string>]
  # @response [object<id:integer, username:string, password:string, type:string, state:string>] 201 Created successfully
  # @response [object<errors>] 422 Unprocessable entity
  #
  # @example
  #    Possible types:
  #    UffizziCore::Credential::Amazon, UffizziCore::Credential::Azure, UffizziCore::Credential::DockerHub,
  #    UffizziCore::Credential::DockerRegistry, UffizziCore::Credential::Google, UffizziCore::Credential::GithubContainerRegistry
  def create
    credential_form = UffizziCore::Api::Cli::V1::Account::Credential::CreateForm.new
    credential_form.assign_attributes(credential_params)
    credential_form.account = resource_account
    credential_form.registry_url = registry_url(credential_form)
    credential_form.username = '_json_key' if credential_form.google?
    credential_form.activate

    UffizziCore::Account::CreateCredentialJob.perform_async(credential_form.id) if credential_form.save

    respond_with credential_form
  end

  # Update existing credential of the given type
  #
  # @path [PUT] /api/cli/v1/account/credentials/{type}
  #
  # @parameter type(required,path) [string] Credential type
  # @parameter credential(required,body) [object<type:string>]
  # @response [object<id:integer, registry_url:string, username:string, password:string>] 200 OK
  # @response [object<errors>] 422 Unprocessable entity
  def update
    credential = resource_account.credentials.find_by!(type: params[:type])
    # Called every pipeline run from CLI with the --update-if-exists-option
    return respond_with credential unless credential_changed?(credential, credential_params)

    credential_form = credential.becomes(UffizziCore::Api::Cli::V1::Account::Credential::UpdateForm)
    credential_form.assign_attributes(credential_params)

    if credential_form.save
      UffizziCore::Account::UpdateCredentialJob.perform_async(credential_form.id)
      respond_with credential_form
    else
      respond_with credential_form, status: :unprocessable_entity
    end
  end

  # Check if credential of the type already exists in the account
  #
  # @path [GET] /api/cli/v1/account/credentials/{type}/check_credential
  #
  # @parameter credential(required,body) [object<type:string>]
  # @response 422 Unprocessable entity
  # @response 200 OK
  def check_credential
    credential_form = UffizziCore::Api::Cli::V1::Account::Credential::CheckCredentialForm.new
    credential_form.type = params[:type]
    credential_form.account = resource_account
    if credential_form.valid?
      respond_with credential_form
    else
      respond_with credential_form.errors, status: :unprocessable_entity
    end
  end

  # Delete account credential
  #
  # @path [DELETE] /api/cli/v1/account/credentials/{type}
  #
  # @parameter type(required,path) [string] Type of the credential
  # @response 204 No Content
  # @response 401 Not authorized
  # @response [object<errors: object<title: string>>] 404 Not found
  def destroy
    credential = resource_account.credentials.find_by!(type: params[:type])
    credential.destroy
  end

  private

  def credential_params
    params.require(:credential)
  end

  def registry_url(credential_form)
    if credential_form.docker_hub?
      Settings.docker_hub.registry_url
    elsif credential_form.google?
      Settings.google.registry_url
    elsif credential_form.github_container_registry?
      Settings.github_container_registry.registry_url
    else
      credential_form.registry_url
    end
  end

  def credential_changed?(credential, credential_params)
    credential.password != credential_params[:password] ||
      credential.username != credential_params[:username] ||
      credential.registry_url != credential_params[:registry_url]
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/projects_controller.rb
================================================
# frozen_string_literal: true

# @resource Project

class UffizziCore::Api::Cli::V1::Accounts::ProjectsController < UffizziCore::Api::Cli::V1::Accounts::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_accounts_projects

  def index
    projects = resource_account.projects.active

    respond_with projects, each_serializer: UffizziCore::Api::Cli::V1::ShortProjectSerializer
  end

  # Create a project
  #
  # @path [POST] /api/cli/v1/accounts/{account_id}/projects
  # @parameter params(required,body) [object<name: string, slug: string, description: string>]
  #
  # @response <object< project: Project>> 200 OK
  # @response 404 Not Found
  # @response 401 Not authorized
  # @response [object<errors: object<password: string >>] 422 Unprocessable entity

  def create
    project_form = UffizziCore::Api::Cli::V1::Project::CreateForm.new(project_params)
    project_form.account = resource_account
    UffizziCore::ProjectService.add_users_to_project!(project_form, project_form.account) if project_form.save

    respond_with project_form
  end

  private

  def project_params
    params.require(:project)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts_controller.rb
================================================
# frozen_string_literal: true

# @resource Project

class UffizziCore::Api::Cli::V1::AccountsController < UffizziCore::Api::Cli::V1::ApplicationController
  include UffizziCore::Api::Cli::V1::AccountsControllerModule

  before_action :authorize_uffizzi_core_api_cli_v1_accounts

  # Get accounts of current user
  #
  # @path [GET] /api/cli/v1/accounts
  #
  # @response [object<accounts: Array<object<id: integer, name: string>> >] 200 OK
  # @response 401 Not authorized
  def index
    accounts = current_user.accounts.order(name: :desc)

    respond_with accounts
  end

  # Get account by name
  #
  # @path [GET] /api/cli/v1/accounts/{name}
  #
  # @response [object<account: <object<id: integer, name: string, projects: Array<object<id: integer, slug: string>>>> >] 200 OK
  # @response 401 Not authorized
  def show
    respond_with resource_account
  end

  private

  def policy_context
    account = resource_account || current_user.default_account

    UffizziCore::AccountContext.new(current_user, user_access_module, account, params)
  end

  def resource_account
    @resource_account ||= if params[:name]
      current_user.accounts.find_by!(name: params[:name])
    else
      current_user.default_account
    end
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::ApplicationController < UffizziCore::ApplicationController
  before_action :authenticate_request!

  def resource_project
    @resource_project ||= current_user.projects.find_by!(slug: params[:slug])
  end

  def resource_account
    @resource_account ||= resource_project.account
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/ci/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Ci::ApplicationController < UffizziCore::Api::Cli::V1::ApplicationController
  before_action :authenticate_request!
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/ci/sessions_controller.rb
================================================
# frozen_string_literal: true

# @resource Uffizzi

class UffizziCore::Api::Cli::V1::Ci::SessionsController < UffizziCore::Api::Cli::V1::Ci::ApplicationController
  skip_before_action :authenticate_request!, only: [:create]

  # Create session
  #
  # @path [POST] /api/cli/v1/github/session
  #
  # @parameter user(required,body)   [object<token: string >]
  # @response [object<account_id: string, project_slug: string>] 201 Created successfully
  # @response [object<errors: object<token: string >>] 422 Unprocessable entity
  def create
    return render json: { errors: { title: [I18n.t('session.unsupported_login_type')] } }, status: :unprocessable_entity unless ci_session

    session_data, errors = ci_session.session_data_from_ci(user_params)
    return render json: { errors: errors }, status: :unprocessable_entity if errors.present?

    sign_in(session_data[:user])

    data = {
      account_id: session_data[:account_id],
      project_slug: session_data[:project_slug],
    }

    render json: data, status: :created
  end

  private

  def user_params
    params.require(:user).permit(:token, :github_access_token)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::ApplicationController < UffizziCore::Api::Cli::V1::ApplicationController
  def resource_project
    @resource_project ||= current_user.projects.find_by!(slug: params[:project_slug])
  end

  def resource_account
    @resource_account ||= resource_project.account
  end

  def policy_context
    UffizziCore::ProjectContext.new(current_user, user_access_module, resource_project, resource_account, params)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::Clusters::ApplicationController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  def resource_cluster
    @resource_cluster ||= if request_by_admin? || valid_request_from_ci_workflow?
      active_project_clusters.find_by!(name: params[:cluster_name])
    else
      active_project_clusters.deployed_by_user(current_user).find_by!(name: params[:cluster_name])
    end
  end

  private

  def active_project_clusters
    @active_project_clusters ||= resource_project.clusters.enabled
  end

  def request_by_admin?
    current_user.admin_access_to_project?(resource_project)
  end

  def valid_request_from_ci_workflow?
    ci_module.valid_request_from_ci_workflow?(params)
  end

  def policy_context
    UffizziCore::Project::ClusterContext.new(current_user, resource_project, user_access_module, resource_cluster, params)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/ingresses_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesController <
  UffizziCore::Api::Cli::V1::Projects::Clusters::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_clusters_ingresses

  def index
    hosts = UffizziCore::ControllerService.ingress_hosts(resource_cluster)
    user_hosts = UffizziCore::ClusterService.filter_user_ingress_host(resource_cluster, hosts)

    data = {
      ingresses: user_hosts,
    }

    respond_with data
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::ClustersController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  include UffizziCore::Api::Cli::V1::Projects::ClustersControllerModule

  before_action :authorize_uffizzi_core_api_cli_v1_projects_clusters
  before_action :check_account_quota, only: [:create]
  before_action :check_current_plan
  after_action :update_show_trial_quota_exceeded_warning, only: [:create, :destroy]

  def index
    clusters = resource_project.clusters.enabled
    return respond_with clusters if request_by_admin? || valid_request_from_ci_workflow?

    respond_with clusters.deployed_by_user(current_user), each_serializer: UffizziCore::Api::Cli::V1::Projects::ShortClusterSerializer
  end

  def create
    version = cluster_params[:k8s_version]
    kubernetes_distribution = find_kubernetes_distribution(version)
    return render_distribution_version_error(version) if kubernetes_distribution.blank?

    cluster_form = UffizziCore::Api::Cli::V1::Cluster::CreateForm.new(cluster_params)
    cluster_form.project = resource_project
    cluster_form.deployed_by = current_user
    cluster_form.kubernetes_distribution = kubernetes_distribution
    return respond_with cluster_form unless cluster_form.save

    UffizziCore::ClusterService.start_deploy(cluster_form)

    respond_with cluster_form
  end

  def scale_down
    if resource_cluster.deployed?
      UffizziCore::ClusterService.scale_down!(resource_cluster)
      return respond_with resource_cluster
    end

    return render_scale_error(I18n.t('cluster.already_asleep', name: resource_cluster.name)) if resource_cluster.scaled_down?

    if resource_cluster.deploying_namespace? || resource_cluster.deploying?
      render_scale_error(I18n.t('cluster.deploy_in_process', name: resource_cluster.name))
    end
  rescue AASM::InvalidTransition, UffizziCore::ClusterScaleError => e
    render_scale_error(e.message)
  end

  def scale_up
    if resource_cluster.scaled_down?
      UffizziCore::ClusterService.scale_up!(resource_cluster)
      return respond_with resource_cluster
    end

    return render_scale_error(I18n.t('cluster.already_awake', name: resource_cluster.name)) if resource_cluster.deployed?
  rescue AASM::InvalidTransition, UffizziCore::ClusterScaleError => e
    render_scale_error(e.message)
  end

  def show
    respond_with resource_cluster
  end

  def sync
    cluster_form = resource_cluster.becomes(UffizziCore::Api::Cli::V1::Cluster::SyncForm)
    cluster_form.sync_status
    cluster_form.save

    respond_with cluster_form
  end

  def destroy
    resource_cluster.disable!

    head(:no_content)
  end

  private

  def resource_cluster
    active_project_clusters = resource_project.clusters.enabled
    @resource_cluster ||= if request_by_admin? || valid_request_from_ci_workflow?
      active_project_clusters.find_by!(name: params[:name])
    else
      active_project_clusters.deployed_by_user(current_user).find_by!(name: params[:name])
    end
  end

  def request_by_admin?
    current_user.admin_access_to_project?(resource_project)
  end

  def valid_request_from_ci_workflow?
    ci_module.valid_request_from_ci_workflow?(params)
  end

  def cluster_params
    params.require(:cluster)
  end

  def render_scale_error(message)
    render json: { errors: { state: [message] } }, status: :unprocessable_entity
  end

  def find_kubernetes_distribution(version)
    return UffizziCore::KubernetesDistribution.default if version.blank?

    UffizziCore::KubernetesDistribution.find_by(version: version)
  end

  def render_distribution_version_error(version)
    available_versions = UffizziCore::KubernetesDistribution.pluck(:version).join(', ')
    message = I18n.t('kubernetes_distribution.not_available', version: version, available_versions: available_versions)
    render json: { errors: { kubernetes_distribution: [message] } }, status: :unprocessable_entity
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb
================================================
# frozen_string_literal: true

# @resource ComposeFile
class UffizziCore::Api::Cli::V1::Projects::ComposeFilesController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_compose_files

  # Get the compose file for the project
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/compose_file
  #
  # @parameter project_slug(required,path) [string] The project slug
  #
  # @response [ComposeFile] 200 OK
  # @response 401 Not authorized
  # @response [object<errors: object<title: string>>] 404 Not found
  def show
    respond_with compose_file
  end

  # Create a compose file for the project
  #
  # @path [POST] /api/cli/v1/projects/{project_slug}/compose_file
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter params(required,body) [object <
  #    compose_file: object<path: string, source: string, content: string>,
  #    dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
  #
  # @response [ComposeFile] 201 OK
  # @response 422 A compose file already exists for this project
  # @response [ComposeFile] 422 Invalid compose file
  # @response 401 Not authorized
  def create
    params = {
      project: resource_project,
      user: current_user,
      compose_file_params: compose_file_params,
      dependencies: dependencies_params[:dependencies] || [],
    }

    compose_file_form, errors = create_or_update_compose_file(params)
    return render_errors(errors) if errors.present?

    respond_with compose_file_form
  end

  # Delete the compose file for the project
  #
  # @path [DELETE] /api/cli/v1/projects/{project_slug}/compose_file
  #
  # @parameter project_slug(required,path) [string] The project slug
  #
  # @response 204 No Content
  # @response 401 Not authorized
  def destroy
    compose_file.destroy

    head :no_content
  end

  private

  def compose_file
    compose_file = resource_project.compose_file
    raise ActiveRecord::RecordNotFound.new("Couldn't find UffizziCore::ComposeFile", UffizziCore::ComposeFile) if compose_file.blank?

    compose_file
  end

  def compose_file_params
    params.require(:compose_file)
  end

  def dependencies_params
    params.permit(dependencies: [:path, :source, :content, :use_kind, :is_file])
  end

  def create_or_update_compose_file(params)
    existing_compose_file = resource_project.compose_file
    if existing_compose_file.present?
      UffizziCore::ComposeFileService.update(existing_compose_file, params)
    else
      kind = UffizziCore::ComposeFile.kind.main
      UffizziCore::ComposeFileService.create(params, kind)
    end
  end

  def render_errors(errors)
    json = { errors: errors }

    render json: json, status: :unprocessable_entity
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsController <
  UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_deployments_activity_items

  # Get activity items for a deployment
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployment/{deployment_id}/actiivity_items
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter deployment_d(required,path) [integer] The id of the deployment
  #
  # @response [ActivtyItem] 200 OK
  # @response 401 Not authorized
  # @response 404 Not found
  def index
    deployment = resource_project.deployments.enabled.find(params[:deployment_id])

    unless deployment.active?
      return render json: { errors: { title: [I18n.t('deployment.invalid_state', id: deployment.id, state: deployment.state)] } },
                    status: :unprocessable_entity
    end

    activity_items = deployment
      .activity_items
      .page(page)
      .per(per_page)
      .order(updated_at: :desc)
      .ransack(q_param)
      .result

    meta = meta(activity_items)
    activity_items = activity_items.map do |activity_item|
      UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemSerializer.new(activity_item).as_json
    end

    render json: {
      activity_items: activity_items,
      meta: meta,
    }
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  def resource_deployment
    @resource_deployment ||= resource_project.deployments.active.find(params[:deployment_id])
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb
================================================
# frozen_string_literal: true

class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::ApplicationController <
  UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController
  def resource_container
    @resource_container ||= resource_deployment.active_containers.find_by!(service_name: params[:container_name])
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb
================================================
# frozen_string_literal: true

# @resource Project/Deployment/Container/Log

class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::LogsController <
  UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::ApplicationController
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployments/{deployment_id}/containers/{container_name}/logs
  #
  # @parameter project_slug(required,path) [string] The slug of the project
  # @parameter deployment_id(required,path) [integer] The id of the deployment
  # @parameter container_name(required,path) [integer] The name of the container
  #
  # @response [object <logs: Array<object<insert_id: string, payload: string>>>] 200 OK
  # @response [object<errors: object<title: string>>] 404 Not found
  # @response 401 Not authorized
  def index
    response = UffizziCore::LogsService.fetch_container_logs(resource_container, logs_params)

    render json: response
  end

  private

  def logs_params
    params.permit(:limit, :previous)
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb
================================================
# frozen_string_literal: true

# @resource Container

class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersController <
  UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_deployments_containers

  # Get a list of container services for a deployment
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployments/{deployment_id}/containers
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter deployment_id(required,path) [integer] The id of the deployment
  #
  # @response [Container] 200 OK
  # @response 401 Not authorized
  # @response 404 Not found
  def index
    containers = resource_deployment.containers.active

    respond_with containers
  end

  def k8s_container_description
    deployment ||= resource_project.deployments.enabled.find(params[:deployment_id])
    container = deployment.containers.active.find_by!(service_name: params[:container_name])
    last_state = UffizziCore::ContainerService.last_state(container)

    render json: { last_state: last_state }
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb
================================================
# frozen_string_literal: true

# @resource Event
class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsController <
  UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_deployments_events

  # Get the events associated with deployment
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployments/{deployment_id}/events
  #
  # @parameter project_slug(required,path) [string] The project_slug for the project
  # @parameter deployment_id(required,path) [integer] The id of the deployment
  #
  # @response [object<
  #   events: Array<object
  #     <first_timestamp: string, last_timestamp: string, reason: string, message: string>
  #   > >] 200 OK
  #
  # @response 401 Not authorized
  # @response 404 Not found
  def index
    response = UffizziCore::ControllerService.fetch_deployment_events(resource_deployment)

    events = { events: response }

    render json: events
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb
================================================
# frozen_string_literal: true

# @resource Deployment

class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  include UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerModule

  before_action :authorize_uffizzi_core_api_cli_v1_projects_deployments
  before_action :check_account_quota, only: :create
  before_action :check_current_plan
  after_action :update_show_trial_quota_exceeded_warning, only: :destroy

  # Get a list of active deployements for a project
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployments
  #
  # @parameter project_slug(required,path) [string] The project slug
  #
  # @response [Array<Deployment>] 200 OK
  # @response 401 Not authorized
  def index
    search_labels = JSON.parse(q_param)
    filtered_deployments = deployments.with_labels(search_labels)

    respond_with filtered_deployments, each_serializer: UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer
  end

  # Get deployment information by id
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/deployments/{id}
  #
  # @parameter project_slug(required,path) [string] The project slug
  #
  # @response [Deployment] 200 OK
  # @response [object<errors: object<title: string>>] 404 Not found
  # @response 401 Not authorized
  def show
    respond_with deployment
  end

  # Create a deployment from a compose file
  #
  # @path [POST] /api/cli/v1/projects/{project_slug}/deployments
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter params(required,body)   [object<
  #    compose_file: object<path: string, source: string, content: string>,
  #    dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
  #
  # @response [Deployment] 201 OK
  # @response [object<errors: object<state: string>>] 422 Unprocessable Entity
  # @response [object<errors: object<title: string>>] 404 Not found
  # @response 401 Not authorized
  def create
    return render_deployment_exists_error if deployments.with_metadata.with_labels(metadata_params).exists?

    compose_file, errors = find_or_create_compose_file
    return render_invalid_file if compose_file.invalid_file?
    return render_errors(errors) if errors.present?

    errors = check_credentials(compose_file)
    return render_errors(errors) if errors.present?

    params = {
      metadata: metadata_params,
      creation_source: creation_source_params,
    }

    deployment = UffizziCore::DeploymentService.create_from_compose(compose_file, resource_project, current_user, params)

    respond_with deployment
  end

  # Update the deployment with new compose file
  #
  # @path [PUT] /api/cli/v1/projects/{project_slug}/deployments/{id}"
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter params(required,body)   [object<
  #    compose_file: object<path: string, source: string, content: string>,
  #    dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
  #
  # @response [Deployment] 201 OK
  # @response [object<errors: object<state: string>>] 422 Unprocessable Entity
  # @response [object<errors: object<title: string>>] 404 Not found
  # @response 401 Not authorized
  def update
    compose_file, errors = UffizziCore::ComposeFileService.create_temporary_compose(
      resource_project,
      current_user,
      compose_file_params,
      dependencies_params[:dependencies],
    )
    return render_invalid_file if compose_file.invalid_file?
    return render_errors(errors) if errors.present?

    errors = check_credentials(compose_file)
    return render_errors(errors) if errors.present?

    deployment = deployments.find(params[:id])
    updated_deployment = UffizziCore::DeploymentService.update_from_compose(compose_file, resource_project, current_user, deployment,
                                                                            metadata_params)

    respond_with updated_deployment
  end

  # @path [POST] /api/cli/v1/projects/{project_slug}/deployments/{id}/deploy_containers
  #
  # @parameter project_slug(required,path) [string] The project slug
  # @parameter id(required,path) [string] The id of the deployment
  #
  # @response 204 No Content
  # @response [object<errors: object<title: string>>] 404 Not found
  # @response 401 Not authorized
  def deploy_containers
    deployment = resource_project.deployments.active.find(params[:id])

    deployment.update(deployed_by: current_user)

    resource_project.config_files.by_deployment(deployment).each do |config_file|
      UffizziCore::ConfigFile::ApplyJob.perform_async(deployment.id, config_file.id)
    end

    UffizziCore::Deployment::DeployContainersJob.perform_async(deployment.id)
  end

  # Disable deployment by id
  #
  # @path [DELETE] /api/cli/v1/projects/{project_slug}/deployments/{id}
  #
  # @parameter project_slug(required,path) [string] The project slug
  #
  # @response 204 No Content
  # @response 401 Not authorized
  def destroy
    UffizziCore::DeploymentService.disable!(deployment)
    deployment.deployment_events.create!(deployment_state: deployment.state, message: 'Destroyed by CLI')

    head :no_content
  end

  private

  def deployment
    @deployment ||= deployments.find(params[:id])
  end

  def find_or_create_compose_file
    existing_compose_file = resource_project.compose_file
    if compose_file_params.present?
      UffizziCore::ComposeFileService.create_temporary_compose(
        resource_project,
        current_user,
        compose_file_params,
        dependencies_params[:dependencies],
      )
    else
      raise ActiveRecord::RecordNotFound if existing_compose_file.blank?

      errors = []
      [existing_compose_file, errors]
    end
  end

  def check_credentials(compose_file)
    credentials = resource_project.account.credentials
    check_credentials_form = UffizziCore::Api::Cli::V1::ComposeFile::CheckCredentialsForm.new
    check_credentials_form.compose_file = compose_file
    check_credentials_form.credentials = credentials
    return check_credentials_form.errors if check_credentials_form.invalid?

    nil
  end

  def deployments
    @deployments ||= resource_project.deployments.enabled
  end

  def deployment_params
    params.required(:deployment)
  end

  def compose_file_params
    params[:compose_file]
  end

  def dependencies_params
    params.permit(dependencies: [:path, :source, :content, :use_kind, :is_file])
  end

  def metadata_params
    params[:metadata]
  end

  def creation_source_params
    params[:creation_source]
  end

  def render_invalid_file
    render json: { errors: { state: [I18n.t('compose.invalid_compose')] } }, status: :unprocessable_entity
  end

  def render_deployment_exists_error
    render json: { errors: { state: [I18n.t('deployment.already_exists')] } }, status: :unprocessable_entity
  end
end


================================================
FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb
================================================
# frozen_string_literal: true

# @resource Project/Secrets
class UffizziCore::Api::Cli::V1::Projects::SecretsController < UffizziCore::Api::Cli::V1::Projects::ApplicationController
  before_action :authorize_uffizzi_core_api_cli_v1_projects_secrets

  # Get secrets for the project
  #
  # @path [GET] /api/cli/v1/projects/{project_slug}/secrets
  # @parameter project_slug(required,path) [string]
  # @response [object<secrets: Array<object<name: string, created_at: date, updated_at: date>>>] 200 OK
  # @response 401 Not authorized
  def index
    respond_with resource_project.secrets, root: :secrets
  end

  # Add secret to project
  #
  # @path [POST] /api/cli/v1/projects/{project_slug}/secrets/bulk_create
  # @parameter project_slug(required,path) [string]
  # @parameter secrets(required,body) [object<secrets: Array<object <name: string, value: string>>>]
  # @response [object<secrets: Array<object<name: string, created_at: date, updated_at: date>>>] 201 Created
  # @response 422 A compose file already exists for this project
  # @response 401 Not authorized
  def
Download .txt
gitextract_iyyaf1qh/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── helm-release.yml
│       ├── main.yml
│       └── release.yml
├── .gitignore
├── .rubocop.yml
├── .ruby-version
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Gemfile
├── INSTALL.md
├── LICENSE
├── Makefile
├── README.md
├── Rakefile
├── app/
│   ├── assets/
│   │   ├── config/
│   │   │   └── manifest.js
│   │   ├── fonts/
│   │   │   └── mtiFontTrackingCode.js
│   │   ├── images/
│   │   │   └── .keep
│   │   └── stylesheets/
│   │       └── application.css
│   ├── channels/
│   │   └── application_cable/
│   │       ├── channel.rb
│   │       └── connection.rb
│   ├── controllers/
│   │   ├── application_controller.rb
│   │   └── concerns/
│   │       └── .keep
│   ├── helpers/
│   │   └── application_helper.rb
│   ├── javascript/
│   │   ├── channels/
│   │   │   ├── consumer.js
│   │   │   └── index.js
│   │   └── packs/
│   │       └── application.js
│   ├── jobs/
│   │   └── application_job.rb
│   ├── mailers/
│   │   └── application_mailer.rb
│   ├── models/
│   │   ├── application_record.rb
│   │   └── concerns/
│   │       └── .keep
│   └── views/
│       └── layouts/
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── bin/
│   ├── rails
│   ├── rake
│   ├── setup
│   └── yarn
├── charts/
│   └── uffizzi-app/
│       ├── Chart.yaml
│       ├── README.md
│       ├── templates/
│       │   ├── configmap-common.yaml
│       │   ├── configmap-sidekiq.yaml
│       │   ├── configmap-web.yaml
│       │   ├── secret-web.yaml
│       │   ├── sidekiq-deployment.yaml
│       │   ├── web-deployment.yaml
│       │   ├── web-ingress.yaml
│       │   └── web-service.yaml
│       └── values.yaml
├── ci/
│   ├── github-actions/
│   │   └── README.md
│   └── gitlab/
│       └── README.md
├── config/
│   ├── application.rb
│   ├── boot.rb
│   ├── cable.yml
│   ├── credentials.yml.enc
│   ├── database.yml
│   ├── environment.rb
│   ├── environments/
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers/
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── content_security_policy.rb
│   │   ├── cookies_serializer.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── health_check.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── sidekiq.rb
│   │   └── wrap_parameters.rb
│   ├── locales/
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   ├── settings.yml
│   ├── sidekiq.yml
│   └── storage.yml
├── config.ru
├── core/
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── Dockerfile
│   ├── Gemfile
│   ├── LICENSE
│   ├── Makefile
│   ├── README.md
│   ├── Rakefile
│   ├── app/
│   │   ├── assets/
│   │   │   ├── config/
│   │   │   │   └── uffizzi_core_manifest.js
│   │   │   ├── images/
│   │   │   │   └── uffizzi_core/
│   │   │   │       └── .keep
│   │   │   └── stylesheets/
│   │   │       └── uffizzi_core/
│   │   │           └── application.css
│   │   ├── clients/
│   │   │   └── uffizzi_core/
│   │   │       ├── amazon_registry_client.rb
│   │   │       ├── azure_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── azure_registry_client.rb
│   │   │       ├── container_registry_request_decorator.rb
│   │   │       ├── controller_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── controller_client.rb
│   │   │       ├── docker_hub_client/
│   │   │       │   ├── not_authorized_error.rb
│   │   │       │   └── request_result.rb
│   │   │       ├── docker_hub_client.rb
│   │   │       ├── docker_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── docker_registry_client.rb
│   │   │       ├── github_container_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       ├── github_container_registry_client.rb
│   │   │       ├── google_registry_client/
│   │   │       │   └── request_result.rb
│   │   │       └── google_registry_client.rb
│   │   ├── contexts/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_context.rb
│   │   │       ├── base_context.rb
│   │   │       ├── project/
│   │   │       │   └── cluster_context.rb
│   │   │       ├── project_context.rb
│   │   │       └── webhooks_context.rb
│   │   ├── controller_modules/
│   │   │   └── uffizzi_core/
│   │   │       └── api/
│   │   │           └── cli/
│   │   │               └── v1/
│   │   │                   ├── accounts_controller_module.rb
│   │   │                   ├── projects/
│   │   │                   │   ├── clusters_controller_module.rb
│   │   │                   │   └── deployments_controller_module.rb
│   │   │                   └── projects_controller_module.rb
│   │   ├── controllers/
│   │   │   ├── concerns/
│   │   │   │   └── uffizzi_core/
│   │   │   │       ├── auth_management.rb
│   │   │   │       ├── authorization_concern.rb
│   │   │   │       └── dependency_injection_concern.rb
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   ├── clusters_controller.rb
│   │   │       │           │   ├── credentials_controller.rb
│   │   │       │           │   └── projects_controller.rb
│   │   │       │           ├── accounts_controller.rb
│   │   │       │           ├── application_controller.rb
│   │   │       │           ├── ci/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   └── sessions_controller.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── application_controller.rb
│   │   │       │           │   ├── clusters/
│   │   │       │           │   │   ├── application_controller.rb
│   │   │       │           │   │   └── ingresses_controller.rb
│   │   │       │           │   ├── clusters_controller.rb
│   │   │       │           │   ├── compose_files_controller.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_items_controller.rb
│   │   │       │           │   │   ├── application_controller.rb
│   │   │       │           │   │   ├── containers/
│   │   │       │           │   │   │   ├── application_controller.rb
│   │   │       │           │   │   │   └── logs_controller.rb
│   │   │       │           │   │   ├── containers_controller.rb
│   │   │       │           │   │   └── events_controller.rb
│   │   │       │           │   ├── deployments_controller.rb
│   │   │       │           │   └── secrets_controller.rb
│   │   │       │           ├── projects_controller.rb
│   │   │       │           └── sessions_controller.rb
│   │   │       └── application_controller.rb
│   │   ├── errors/
│   │   │   └── uffizzi_core/
│   │   │       ├── cluster_scale_error.rb
│   │   │       ├── compose_file/
│   │   │       │   ├── build_error.rb
│   │   │       │   ├── credential_error.rb
│   │   │       │   ├── parse_error.rb
│   │   │       │   └── secrets_error.rb
│   │   │       ├── compose_file_error.rb
│   │   │       ├── container_registry_error.rb
│   │   │       ├── deployment/
│   │   │       │   └── image_pull_error.rb
│   │   │       ├── deployment_not_found_error.rb
│   │   │       └── registry_not_supported_error.rb
│   │   ├── forms/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── account/
│   │   │       │           │   └── credential/
│   │   │       │           │       ├── check_credential_form.rb
│   │   │       │           │       ├── create_form.rb
│   │   │       │           │       └── update_form.rb
│   │   │       │           ├── cluster/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── sync_form.rb
│   │   │       │           ├── compose_file/
│   │   │       │           │   ├── check_credentials_form.rb
│   │   │       │           │   ├── cli_form.rb
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   ├── template_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── config_file/
│   │   │       │           │   └── create_form.rb
│   │   │       │           ├── deployment/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── project/
│   │   │       │           │   ├── create_form.rb
│   │   │       │           │   └── update_form.rb
│   │   │       │           ├── secret/
│   │   │       │           │   └── bulk_assign_form.rb
│   │   │       │           ├── session_create_form.rb
│   │   │       │           └── template/
│   │   │       │               └── create_form.rb
│   │   │       ├── application_form.rb
│   │   │       ├── application_form_without_active_record.rb
│   │   │       └── mass_assignment_control_concern.rb
│   │   ├── helpers/
│   │   │   └── uffizzi_core/
│   │   │       └── application_helper.rb
│   │   ├── jobs/
│   │   │   └── uffizzi_core/
│   │   │       ├── account/
│   │   │       │   ├── create_credential_job.rb
│   │   │       │   └── update_credential_job.rb
│   │   │       ├── activity_item/
│   │   │       │   └── docker/
│   │   │       │       └── update_digest_job.rb
│   │   │       ├── application_job.rb
│   │   │       ├── cluster/
│   │   │       │   ├── delete_job.rb
│   │   │       │   ├── deploy_job.rb
│   │   │       │   ├── manage_deploying_job.rb
│   │   │       │   ├── manage_scaling_down_job.rb
│   │   │       │   └── manage_scaling_up_job.rb
│   │   │       ├── config_file/
│   │   │       │   └── apply_job.rb
│   │   │       └── deployment/
│   │   │           ├── create_credential_job.rb
│   │   │           ├── create_credentials_job.rb
│   │   │           ├── create_job.rb
│   │   │           ├── delete_credential_job.rb
│   │   │           ├── delete_job.rb
│   │   │           ├── deploy_containers_job.rb
│   │   │           ├── manage_deploy_activity_item_job.rb
│   │   │           └── update_credential_job.rb
│   │   ├── lib/
│   │   │   └── uffizzi_core/
│   │   │       ├── concerns/
│   │   │       │   └── models/
│   │   │       │       ├── account.rb
│   │   │       │       ├── activity_item.rb
│   │   │       │       ├── cluster.rb
│   │   │       │       ├── comment.rb
│   │   │       │       ├── compose_file.rb
│   │   │       │       ├── config_file.rb
│   │   │       │       ├── container.rb
│   │   │       │       ├── container_config_file.rb
│   │   │       │       ├── container_host_volume_file.rb
│   │   │       │       ├── coupon.rb
│   │   │       │       ├── credential.rb
│   │   │       │       ├── deployment.rb
│   │   │       │       ├── deployment_event.rb
│   │   │       │       ├── event.rb
│   │   │       │       ├── host_volume_file.rb
│   │   │       │       ├── kubernetes_distribution.rb
│   │   │       │       ├── membership.rb
│   │   │       │       ├── payment.rb
│   │   │       │       ├── price.rb
│   │   │       │       ├── product.rb
│   │   │       │       ├── project.rb
│   │   │       │       ├── rating.rb
│   │   │       │       ├── repo.rb
│   │   │       │       ├── role.rb
│   │   │       │       ├── secret.rb
│   │   │       │       ├── template.rb
│   │   │       │       ├── user.rb
│   │   │       │       └── user_project.rb
│   │   │       └── rbac/
│   │   │           └── user_access_service.rb
│   │   ├── mailers/
│   │   │   └── uffizzi_core/
│   │   │       └── application_mailer.rb
│   │   ├── models/
│   │   │   ├── concerns/
│   │   │   │   └── uffizzi_core/
│   │   │   │       ├── hashid_concern.rb
│   │   │   │       └── state_machine_concern.rb
│   │   │   └── uffizzi_core/
│   │   │       ├── account.rb
│   │   │       ├── activity_item/
│   │   │       │   ├── docker.rb
│   │   │       │   ├── github.rb
│   │   │       │   └── memory_limit.rb
│   │   │       ├── activity_item.rb
│   │   │       ├── application_record.rb
│   │   │       ├── cluster.rb
│   │   │       ├── comment.rb
│   │   │       ├── compose_file.rb
│   │   │       ├── config_file.rb
│   │   │       ├── container.rb
│   │   │       ├── container_config_file.rb
│   │   │       ├── container_host_volume_file.rb
│   │   │       ├── continuous_preview.rb
│   │   │       ├── coupon.rb
│   │   │       ├── credential/
│   │   │       │   ├── amazon.rb
│   │   │       │   ├── azure.rb
│   │   │       │   ├── docker_hub.rb
│   │   │       │   ├── docker_registry.rb
│   │   │       │   ├── github_container_registry.rb
│   │   │       │   └── google.rb
│   │   │       ├── credential.rb
│   │   │       ├── database.rb
│   │   │       ├── database_offering.rb
│   │   │       ├── deployment.rb
│   │   │       ├── deployment_event.rb
│   │   │       ├── event.rb
│   │   │       ├── host_volume_file.rb
│   │   │       ├── kubernetes_distribution.rb
│   │   │       ├── membership.rb
│   │   │       ├── payment.rb
│   │   │       ├── price.rb
│   │   │       ├── product.rb
│   │   │       ├── project.rb
│   │   │       ├── rating.rb
│   │   │       ├── repo/
│   │   │       │   ├── amazon.rb
│   │   │       │   ├── azure.rb
│   │   │       │   ├── docker_hub.rb
│   │   │       │   ├── docker_registry.rb
│   │   │       │   ├── github_container_registry.rb
│   │   │       │   └── google.rb
│   │   │       ├── repo.rb
│   │   │       ├── role.rb
│   │   │       ├── secret.rb
│   │   │       ├── template.rb
│   │   │       ├── user.rb
│   │   │       └── user_project.rb
│   │   ├── policies/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── clusters_policy.rb
│   │   │       │           │   ├── credentials_policy.rb
│   │   │       │           │   └── projects_policy.rb
│   │   │       │           ├── accounts_policy.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── clusters/
│   │   │       │           │   │   └── ingresses_policy.rb
│   │   │       │           │   ├── clusters_policy.rb
│   │   │       │           │   ├── compose_files_policy.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_items_policy.rb
│   │   │       │           │   │   ├── containers_policy.rb
│   │   │       │           │   │   └── events_policy.rb
│   │   │       │           │   ├── deployments_policy.rb
│   │   │       │           │   └── secrets_policy.rb
│   │   │       │           └── projects_policy.rb
│   │   │       └── application_policy.rb
│   │   ├── repositories/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_repo.rb
│   │   │       ├── activity_item_repo.rb
│   │   │       ├── basic_order_repo.rb
│   │   │       ├── cluster_repo.rb
│   │   │       ├── comment_repo.rb
│   │   │       ├── compose_file_repo.rb
│   │   │       ├── config_file_repo.rb
│   │   │       ├── container_repo.rb
│   │   │       ├── credential_repo.rb
│   │   │       ├── deployment_repo.rb
│   │   │       ├── event_repo.rb
│   │   │       ├── host_volume_file_repo.rb
│   │   │       ├── membership_repo.rb
│   │   │       ├── price_repo.rb
│   │   │       ├── product_repo.rb
│   │   │       ├── project_repo.rb
│   │   │       ├── repo_repo.rb
│   │   │       ├── template_repo.rb
│   │   │       ├── usage_repo.rb
│   │   │       └── user_repo.rb
│   │   ├── responders/
│   │   │   └── uffizzi_core/
│   │   │       └── json_responder.rb
│   │   ├── serializers/
│   │   │   └── uffizzi_core/
│   │   │       ├── api/
│   │   │       │   └── cli/
│   │   │       │       └── v1/
│   │   │       │           ├── account_serializer.rb
│   │   │       │           ├── accounts/
│   │   │       │           │   ├── cluster_serializer/
│   │   │       │           │   │   └── project_serializer.rb
│   │   │       │           │   ├── cluster_serializer.rb
│   │   │       │           │   ├── credential_serializer.rb
│   │   │       │           │   └── project_serializer.rb
│   │   │       │           ├── project_serializer/
│   │   │       │           │   ├── account_serializer.rb
│   │   │       │           │   ├── compose_file_serializer.rb
│   │   │       │           │   └── deployment_serializer.rb
│   │   │       │           ├── project_serializer.rb
│   │   │       │           ├── projects/
│   │   │       │           │   ├── cluster_serializer.rb
│   │   │       │           │   ├── compose_file_serializer.rb
│   │   │       │           │   ├── deployment_serializer/
│   │   │       │           │   │   ├── container_serializer.rb
│   │   │       │           │   │   └── user_serializer.rb
│   │   │       │           │   ├── deployment_serializer.rb
│   │   │       │           │   ├── deployments/
│   │   │       │           │   │   ├── activity_item_serializer.rb
│   │   │       │           │   │   ├── container_serializer/
│   │   │       │           │   │   │   ├── container_config_file_serializer/
│   │   │       │           │   │   │   │   └── config_file_serializer.rb
│   │   │       │           │   │   │   └── container_config_file_serializer.rb
│   │   │       │           │   │   └── container_serializer.rb
│   │   │       │           │   ├── deployments_serializer/
│   │   │       │           │   │   └── user_serializer.rb
│   │   │       │           │   ├── deployments_serializer.rb
│   │   │       │           │   ├── secret_serializer.rb
│   │   │       │           │   └── short_cluster_serializer.rb
│   │   │       │           ├── short_project_serializer.rb
│   │   │       │           ├── user_serializer/
│   │   │       │           │   └── account_serializer.rb
│   │   │       │           └── user_serializer.rb
│   │   │       ├── base_serializer.rb
│   │   │       └── controller/
│   │   │           ├── apply_config_file/
│   │   │           │   └── config_file_serializer.rb
│   │   │           ├── create_cluster/
│   │   │           │   └── cluster_serializer.rb
│   │   │           ├── create_credential/
│   │   │           │   └── credential_serializer.rb
│   │   │           ├── create_deployment/
│   │   │           │   └── deployment_serializer.rb
│   │   │           ├── deploy_containers/
│   │   │           │   ├── compose_file_serializer.rb
│   │   │           │   ├── container_serializer/
│   │   │           │   │   ├── container_config_file_serializer/
│   │   │           │   │   │   └── config_file_serializer.rb
│   │   │           │   │   ├── container_config_file_serializer.rb
│   │   │           │   │   └── container_host_volume_file_serializer.rb
│   │   │           │   ├── container_serializer.rb
│   │   │           │   ├── credential_serializer.rb
│   │   │           │   └── host_volume_file_serializer.rb
│   │   │           └── update_cluster/
│   │   │               └── cluster_serializer.rb
│   │   ├── services/
│   │   │   └── uffizzi_core/
│   │   │       ├── account_service.rb
│   │   │       ├── activity_item_service.rb
│   │   │       ├── ci_service.rb
│   │   │       ├── cluster_service.rb
│   │   │       ├── compose_file/
│   │   │       │   ├── builders/
│   │   │       │   │   ├── container_builder_service.rb
│   │   │       │   │   ├── container_config_files_builder_service.rb
│   │   │       │   │   ├── container_host_volume_files_builder_service.rb
│   │   │       │   │   ├── docker_repo_builder_service.rb
│   │   │       │   │   ├── template_builder_service.rb
│   │   │       │   │   └── variables_builder_service.rb
│   │   │       │   ├── config_files_service.rb
│   │   │       │   ├── config_option_service.rb
│   │   │       │   ├── container_service.rb
│   │   │       │   ├── dependencies_service.rb
│   │   │       │   ├── errors_service.rb
│   │   │       │   ├── github_dependencies_service.rb
│   │   │       │   ├── host_volume_files_service.rb
│   │   │       │   ├── parsers/
│   │   │       │   │   ├── configs_parser_service.rb
│   │   │       │   │   ├── continuous_preview_parser_service.rb
│   │   │       │   │   ├── ingress_parser_service.rb
│   │   │       │   │   ├── named_volumes_parser_service.rb
│   │   │       │   │   ├── secrets_parser_service.rb
│   │   │       │   │   ├── services/
│   │   │       │   │   │   ├── command_parser_service.rb
│   │   │       │   │   │   ├── configs_parser_service.rb
│   │   │       │   │   │   ├── deploy_parser_service.rb
│   │   │       │   │   │   ├── entrypoint_parser_service.rb
│   │   │       │   │   │   ├── env_file_parser_service.rb
│   │   │       │   │   │   ├── environment_parser_service.rb
│   │   │       │   │   │   ├── healthcheck_parser_service.rb
│   │   │       │   │   │   ├── image_parser_service.rb
│   │   │       │   │   │   ├── secrets_parser_service.rb
│   │   │       │   │   │   └── volumes_parser_service.rb
│   │   │       │   │   ├── services_parser_service.rb
│   │   │       │   │   └── variables_parser_service.rb
│   │   │       │   └── template_service.rb
│   │   │       ├── compose_file_service.rb
│   │   │       ├── container_registry/
│   │   │       │   ├── amazon_service.rb
│   │   │       │   ├── azure_service.rb
│   │   │       │   ├── docker_hub_service.rb
│   │   │       │   ├── docker_registry_service.rb
│   │   │       │   ├── github_container_registry_service.rb
│   │   │       │   └── google_service.rb
│   │   │       ├── container_registry_service.rb
│   │   │       ├── container_service.rb
│   │   │       ├── controller_service.rb
│   │   │       ├── controller_settings_service.rb
│   │   │       ├── deployment/
│   │   │       │   ├── domain_service.rb
│   │   │       │   └── memory_service.rb
│   │   │       ├── deployment_service.rb
│   │   │       ├── logs_service.rb
│   │   │       ├── manage_activity_items_service.rb
│   │   │       ├── project_service.rb
│   │   │       ├── repo_service.rb
│   │   │       ├── response_service.rb
│   │   │       ├── template/
│   │   │       │   └── memory_service.rb
│   │   │       ├── token_service.rb
│   │   │       ├── user_access_service.rb
│   │   │       └── user_generator_service.rb
│   │   ├── utils/
│   │   │   └── uffizzi_core/
│   │   │       └── converters.rb
│   │   └── validators/
│   │       └── uffizzi_core/
│   │           ├── email_validator.rb
│   │           ├── environment_variable_list_validator.rb
│   │           └── image_command_args_validator.rb
│   ├── bin/
│   │   └── rails
│   ├── config/
│   │   ├── initializers/
│   │   │   ├── rswag_api.rb
│   │   │   ├── rswag_ui.rb
│   │   │   └── swagger_yard.rb
│   │   ├── locales/
│   │   │   ├── en.activerecord.yml
│   │   │   └── en.yml
│   │   └── routes.rb
│   ├── db/
│   │   ├── migrate/
│   │   │   ├── 20220218121438_create_uffizzi_core_tables.rb
│   │   │   ├── 20220309110201_remove_secrets_from_projects.rb
│   │   │   ├── 20220310110150_create_project_secrets.rb
│   │   │   ├── 20220325113342_add_name_to_uffizzi_containers.rb
│   │   │   ├── 20220329123323_rename_project_secrets_to_secrets.rb
│   │   │   ├── 20220329124542_add_resource_to_secrets.rb
│   │   │   ├── 20220329143241_remove_project_ref_from_secrets.rb
│   │   │   ├── 20220419074956_add_health_check_to_containers.rb
│   │   │   ├── 20220422151523_add_volumes_to_uffizzi_core_containers.rb
│   │   │   ├── 20220525113412_rename_name_to_uffizzi_containers.rb
│   │   │   ├── 20220704135629_add_disabled_at_to_deployments.rb
│   │   │   ├── 20220805164628_add_metadata_to_deployment.rb
│   │   │   ├── 20220901110752_create_host_volume_files.rb
│   │   │   ├── 20220901165313_create_container_host_volume_files.rb
│   │   │   ├── 20220927113647_add_additional_subdomains_to_containers.rb
│   │   │   ├── 20230111000000_add_state_to_memberships.rb
│   │   │   ├── 20230306142513_add_last_deploy_at_to_deployments.rb
│   │   │   ├── 20230406154451_add_full_image_name_to_container.rb
│   │   │   ├── 20230531135739_create_deployment_events.rb
│   │   │   ├── 20230613101901_create_clusters.rb
│   │   │   ├── 20230711101901_add_host_to_clusters.rb
│   │   │   ├── 20230810140316_add_source_to_uffizzi_core_clusters.rb
│   │   │   ├── 20230824150022_update_name_constraint_to_projects.rb
│   │   │   ├── 20231009162719_create_uffizzi_core_kubernetes_distributions.rb
│   │   │   ├── 20231009182412_add_kubernetes_distribution_id_to_uffizzi_core_clusters.rb
│   │   │   ├── 20240301200235_add_node_selector_to_cluster.rb
│   │   │   └── 20240314170113_delete_node_selector_from_cluster.rb
│   │   └── seeds.rb
│   ├── lib/
│   │   ├── tasks/
│   │   │   └── uffizzi_core_tasks.rake
│   │   ├── uffizzi_core/
│   │   │   ├── engine.rb
│   │   │   └── version.rb
│   │   └── uffizzi_core.rb
│   ├── swagger/
│   │   └── v1/
│   │       └── swagger.json
│   ├── test/
│   │   ├── controllers/
│   │   │   └── uffizzi_core/
│   │   │       └── api/
│   │   │           └── cli/
│   │   │               └── v1/
│   │   │                   ├── accounts/
│   │   │                   │   ├── clusters_controller_test.rb
│   │   │                   │   ├── credentials_controller_test.rb
│   │   │                   │   └── projects_controller_test.rb
│   │   │                   ├── accounts_controller_test.rb
│   │   │                   ├── projects/
│   │   │                   │   ├── clusters/
│   │   │                   │   │   └── ingresses_controller_test.rb
│   │   │                   │   ├── clusters_controller_test.rb
│   │   │                   │   ├── compose_files_controller_test.rb
│   │   │                   │   ├── deployments/
│   │   │                   │   │   ├── activity_items_controller_test.rb
│   │   │                   │   │   ├── containers/
│   │   │                   │   │   │   └── logs_controller_test.rb
│   │   │                   │   │   ├── containers_controller_test.rb
│   │   │                   │   │   └── events_controller_test.rb
│   │   │                   │   ├── deployments_controller/
│   │   │                   │   │   ├── create_test.rb
│   │   │                   │   │   ├── deploy_containers_test.rb
│   │   │                   │   │   ├── destroy_test.rb
│   │   │                   │   │   └── update_test.rb
│   │   │                   │   └── secrets_controller_test.rb
│   │   │                   ├── projects_controller_test.rb
│   │   │                   └── sessions_controller_test.rb
│   │   ├── dummy/
│   │   │   ├── Rakefile
│   │   │   ├── app/
│   │   │   │   ├── assets/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── manifest.js
│   │   │   │   │   ├── images/
│   │   │   │   │   │   └── .keep
│   │   │   │   │   └── stylesheets/
│   │   │   │   │       └── application.css
│   │   │   │   ├── channels/
│   │   │   │   │   └── application_cable/
│   │   │   │   │       ├── channel.rb
│   │   │   │   │       └── connection.rb
│   │   │   │   ├── controllers/
│   │   │   │   │   ├── application_controller.rb
│   │   │   │   │   └── concerns/
│   │   │   │   │       └── .keep
│   │   │   │   ├── helpers/
│   │   │   │   │   └── application_helper.rb
│   │   │   │   ├── javascript/
│   │   │   │   │   └── packs/
│   │   │   │   │       └── application.js
│   │   │   │   ├── jobs/
│   │   │   │   │   └── application_job.rb
│   │   │   │   ├── mailers/
│   │   │   │   │   └── application_mailer.rb
│   │   │   │   ├── models/
│   │   │   │   │   ├── application_record.rb
│   │   │   │   │   └── concerns/
│   │   │   │   │       └── .keep
│   │   │   │   └── views/
│   │   │   │       └── layouts/
│   │   │   │           ├── application.html.erb
│   │   │   │           ├── mailer.html.erb
│   │   │   │           └── mailer.text.erb
│   │   │   ├── bin/
│   │   │   │   ├── rails
│   │   │   │   ├── rake
│   │   │   │   ├── setup
│   │   │   │   └── spring
│   │   │   ├── config/
│   │   │   │   ├── application.rb
│   │   │   │   ├── boot.rb
│   │   │   │   ├── cable.yml
│   │   │   │   ├── database.yml
│   │   │   │   ├── environment.rb
│   │   │   │   ├── environments/
│   │   │   │   │   ├── development.rb
│   │   │   │   │   ├── production.rb
│   │   │   │   │   └── test.rb
│   │   │   │   ├── initializers/
│   │   │   │   │   ├── application_controller_renderer.rb
│   │   │   │   │   ├── assets.rb
│   │   │   │   │   ├── backtrace_silencers.rb
│   │   │   │   │   ├── config.rb
│   │   │   │   │   ├── content_security_policy.rb
│   │   │   │   │   ├── cookies_serializer.rb
│   │   │   │   │   ├── filter_parameter_logging.rb
│   │   │   │   │   ├── inflections.rb
│   │   │   │   │   ├── mime_types.rb
│   │   │   │   │   ├── octokit.rb
│   │   │   │   │   ├── permissions_policy.rb
│   │   │   │   │   └── wrap_parameters.rb
│   │   │   │   ├── locales/
│   │   │   │   │   └── en.yml
│   │   │   │   ├── puma.rb
│   │   │   │   ├── routes.rb
│   │   │   │   ├── settings.yml
│   │   │   │   ├── spring.rb
│   │   │   │   └── storage.yml
│   │   │   ├── config.ru
│   │   │   ├── db/
│   │   │   │   └── schema.rb
│   │   │   ├── lib/
│   │   │   │   └── assets/
│   │   │   │       └── .keep
│   │   │   ├── log/
│   │   │   │   └── .keep
│   │   │   └── public/
│   │   │       ├── 404.html
│   │   │       ├── 422.html
│   │   │       └── 500.html
│   │   ├── factories/
│   │   │   ├── account.rb
│   │   │   ├── activity_item.rb
│   │   │   ├── cluster.rb
│   │   │   ├── comments.rb
│   │   │   ├── compose_files.rb
│   │   │   ├── config_files.rb
│   │   │   ├── container_config_files.rb
│   │   │   ├── container_host_volume_files.rb
│   │   │   ├── containers.rb
│   │   │   ├── credentials.rb
│   │   │   ├── deployment.rb
│   │   │   ├── host_volume_files.rb
│   │   │   ├── kubernetes_distribution.rb
│   │   │   ├── membership.rb
│   │   │   ├── payments.rb
│   │   │   ├── project.rb
│   │   │   ├── ratings.rb
│   │   │   ├── repos.rb
│   │   │   ├── secrets.rb
│   │   │   ├── sequences.rb
│   │   │   ├── templates.rb
│   │   │   ├── user.rb
│   │   │   └── user_project.rb
│   │   ├── fixtures/
│   │   │   └── files/
│   │   │       ├── cluster/
│   │   │       │   └── manifest.yml
│   │   │       ├── compose_dependencies/
│   │   │       │   └── configs/
│   │   │       │       └── vote_conf.json
│   │   │       ├── compose_files/
│   │   │       │   ├── azure_services/
│   │   │       │   │   └── nginx.yml
│   │   │       │   ├── boolean_option.yml
│   │   │       │   ├── compose_empty.yml
│   │   │       │   ├── compose_memory.yml
│   │   │       │   ├── compose_vote_app_github.yml
│   │   │       │   ├── compose_with_continuous_preview.yml
│   │   │       │   ├── compose_with_only_line.yml
│   │   │       │   ├── compose_with_syntax_error.yml
│   │   │       │   ├── compose_with_volumes.yml
│   │   │       │   ├── compose_without_image.yml
│   │   │       │   ├── compose_without_services.yml
│   │   │       │   ├── config_file_dependencies.yml
│   │   │       │   ├── dockerhub_services/
│   │   │       │   │   ├── account_custom_image.yml
│   │   │       │   │   ├── nginx.yml
│   │   │       │   │   ├── nginx_auto_deploy_off.yml
│   │   │       │   │   ├── nginx_config_files.yml
│   │   │       │   │   ├── nginx_config_invalid_ingress_service.yml
│   │   │       │   │   ├── nginx_configs_long_syntax.yml
│   │   │       │   │   ├── nginx_configs_long_syntax_without_target.yml
│   │   │       │   │   ├── nginx_configs_short_syntax.yml
│   │   │       │   │   ├── nginx_configs_short_syntax_invalid_path.yml
│   │   │       │   │   ├── nginx_configs_short_syntax_unknown_config.yml
│   │   │       │   │   ├── nginx_cp_delete_after_integer.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_hours.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_max.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_min.yml
│   │   │       │   │   ├── nginx_cp_invalid_delete_after_postfix.yml
│   │   │       │   │   ├── nginx_env_file.yml
│   │   │       │   │   ├── nginx_env_file_duplicates.yml
│   │   │       │   │   ├── nginx_env_file_empty.yml
│   │   │       │   │   ├── nginx_env_file_empty_in_array.yml
│   │   │       │   │   ├── nginx_envs.yml
│   │   │       │   │   ├── nginx_ingress_port_non_integer.yml
│   │   │       │   │   ├── nginx_invalid_deploy_auto.yml
│   │   │       │   │   ├── nginx_invalid_memory.yml
│   │   │       │   │   ├── nginx_invalid_memory_min_value.yml
│   │   │       │   │   ├── nginx_invalid_memory_postfix.yml
│   │   │       │   │   ├── nginx_invalid_memory_type.yml
│   │   │       │   │   ├── nginx_invalid_port.yml
│   │   │       │   │   ├── nginx_uffizzi_ingress.yml
│   │   │       │   │   ├── nginx_with_continuous_preview_without_x-uffizzi.yml
│   │   │       │   │   ├── nginx_with_ingress_without_x-uffizzi.yml
│   │   │       │   │   ├── nginx_without_ingress.yml
│   │   │       │   │   ├── nginx_without_ingress_port.yml
│   │   │       │   │   ├── nginx_without_ingress_service.yml
│   │   │       │   │   ├── nginx_without_tag.yml
│   │   │       │   │   ├── postgres_secrets.yml
│   │   │       │   │   ├── postgres_secrets_duplicates.yml
│   │   │       │   │   ├── postgres_secrets_unknown.yml
│   │   │       │   │   ├── postgres_secrets_without_external.yml
│   │   │       │   │   ├── postgres_secrets_without_name.yml
│   │   │       │   │   ├── volumes_anonymous.yml
│   │   │       │   │   └── volumes_named.yml
│   │   │       │   ├── github_services/
│   │   │       │   │   └── hello_world.yml
│   │   │       │   ├── google_services/
│   │   │       │   │   ├── cloudsql.yml
│   │   │       │   │   ├── cloudsql_entrypoint.yml
│   │   │       │   │   └── nginx.yml
│   │   │       │   ├── healthcheck/
│   │   │       │   │   ├── array_command_success.yml
│   │   │       │   │   ├── disabled_healthcheck.yml
│   │   │       │   │   ├── healthcheck_with_disable.yml
│   │   │       │   │   ├── invalid_command.yml
│   │   │       │   │   ├── invalid_interval.yml
│   │   │       │   │   ├── invalid_options.yml
│   │   │       │   │   ├── invalid_retries.yml
│   │   │       │   │   └── string_command_success.yml
│   │   │       │   └── invalid_service.yml
│   │   │       ├── controller/
│   │   │       │   ├── cluster_asleep.json
│   │   │       │   ├── cluster_awake.json
│   │   │       │   ├── cluster_not_ready.json
│   │   │       │   ├── cluster_ready.json
│   │   │       │   ├── deployment_containers.json
│   │   │       │   ├── deployment_containers_with_error.json
│   │   │       │   ├── deployments.json
│   │   │       │   ├── ingresses.json
│   │   │       │   └── logs.json
│   │   │       ├── dockerhub/
│   │   │       │   ├── digest.json
│   │   │       │   ├── login_fail.json
│   │   │       │   ├── repository.json
│   │   │       │   └── webhooks/
│   │   │       │       └── push/
│   │   │       │           └── event_data.json
│   │   │       ├── github/
│   │   │       │   └── compose_files/
│   │   │       │       └── hello_world_compose_github_container_registry.json
│   │   │       ├── test-compose-full.yml
│   │   │       ├── test-compose-success-jfrog.yml
│   │   │       ├── test-compose-success-without-dependencies.yml
│   │   │       ├── test-compose-success.yml
│   │   │       ├── test-compose-without-images.yml
│   │   │       ├── uffizzi-compose-amazon.yml
│   │   │       ├── uffizzi-compose-azure.yml
│   │   │       ├── uffizzi-compose-docker-registry-anonymous.yml
│   │   │       ├── uffizzi-compose-dockerhub.yml
│   │   │       ├── uffizzi-compose-ghcr.yml
│   │   │       ├── uffizzi-compose-google.yml
│   │   │       ├── uffizzi-compose-invalid-service-name.yml
│   │   │       ├── uffizzi-compose-vote-app-docker-with-memory-request.yml
│   │   │       ├── uffizzi-compose-vote-app-docker.yml
│   │   │       ├── uffizzi-compose-vote-app-with-command-as-string.yml
│   │   │       ├── uffizzi-compose-with-host-volumes.yml
│   │   │       └── uffizzi-compose-with_alias.yml
│   │   ├── services/
│   │   │   ├── activity_item_service_test.rb
│   │   │   ├── compose_file_service_test.rb
│   │   │   ├── deployment_service_test.rb
│   │   │   ├── google_service_test.rb
│   │   │   ├── image_parser_service_test.rb
│   │   │   ├── manage_activity_items_service_test.rb
│   │   │   └── user_generator_service_test.rb
│   │   ├── support/
│   │   │   ├── azure_registry_stub_support.rb
│   │   │   ├── controller_stub_support.rb
│   │   │   ├── docker_hub_stub_support.rb
│   │   │   ├── docker_registry_stub_support.rb
│   │   │   ├── fixture_support.rb
│   │   │   ├── github_container_registry_support.rb
│   │   │   ├── google_registry_stub_support.rb
│   │   │   └── stub_support.rb
│   │   ├── test_helper.rb
│   │   └── uffizzi_core_test.rb
│   └── uffizzi_core.gemspec
├── db/
│   ├── migrate/
│   │   ├── 20220219114713_create_uffizzi_core_tables.uffizzi_core.rb
│   │   ├── 20220317112742_remove_secrets_from_projects.uffizzi_core.rb
│   │   ├── 20220317112743_create_project_secrets.uffizzi_core.rb
│   │   ├── 20220325113623_add_name_to_uffizzi_containers.uffizzi_core.rb
│   │   ├── 20220412133606_rename_project_secrets_to_secrets.uffizzi_core.rb
│   │   ├── 20220412133607_add_resource_to_secrets.uffizzi_core.rb
│   │   ├── 20220412133608_remove_project_ref_from_secrets.uffizzi_core.rb
│   │   ├── 20220420103952_add_health_check_to_containers.uffizzi_core.rb
│   │   ├── 20220527135654_rename_name_to_uffizzi_containers.uffizzi_core.rb
│   │   ├── 20220617184754_add_volumes_to_uffizzi_core_containers.uffizzi_core.rb
│   │   ├── 20220708093405_add_disabled_at_to_deployments.uffizzi_core.rb
│   │   ├── 20220817140346_add_metadata_to_deployment.uffizzi_core.rb
│   │   ├── 20220901110752_create_host_volume_files.rb
│   │   ├── 20220901165313_create_container_host_volume_files.rb
│   │   ├── 20220927113647_add_additional_subdomains_to_containers.rb
│   │   ├── 20230111000000_add_state_to_memberships.rb
│   │   ├── 20230306142805_add_last_deploy_at_to_deployments.uffizzi_core.rb
│   │   ├── 20230406154547_add_full_image_name_to_container.uffizzi_core.rb
│   │   ├── 20230531135739_create_deployment_events.rb
│   │   ├── 20230613110517_create_clusters.uffizzi_core.rb
│   │   ├── 20230711101901_add_host_to_clusters.rb
│   │   ├── 20230824150022_update_name_constraint_to_projects.rb
│   │   ├── 20231009103942_add_source_to_uffizzi_core_clusters.uffizzi_core.rb
│   │   ├── 20231009163516_create_uffizzi_core_kubernetes_distributions.uffizzi_core.rb
│   │   ├── 20231009201239_add_kubernetes_distribution_id_to_uffizzi_core_clusters.uffizzi_core.rb
│   │   ├── 20240301200916_add_node_selector_to_cluster.uffizzi_core.rb
│   │   └── 20240314170425_delete_node_selector_from_cluster.uffizzi_core.rb
│   ├── schema.rb
│   └── seeds.rb
├── docker-compose.yml
├── docs/
│   ├── continuous-previews.md
│   └── quickstart-guide.md
├── lib/
│   ├── assets/
│   │   └── .keep
│   └── tasks/
│       └── .keep
├── log/
│   └── .keep
├── public/
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   └── robots.txt
├── storage/
│   └── .keep
├── test/
│   ├── application_system_test_case.rb
│   ├── channels/
│   │   └── application_cable/
│   │       └── connection_test.rb
│   ├── controllers/
│   │   └── .keep
│   ├── fixtures/
│   │   ├── .keep
│   │   └── files/
│   │       └── .keep
│   ├── helpers/
│   │   └── .keep
│   ├── integration/
│   │   └── .keep
│   ├── mailers/
│   │   └── .keep
│   ├── models/
│   │   └── .keep
│   ├── system/
│   │   └── .keep
│   └── test_helper.rb
├── tmp/
│   └── .keep
├── uffizzi-compose-example.yml
└── vendor/
    └── .keep
Download .txt
SYMBOL INDEX (1238 symbols across 427 files)

FILE: app/channels/application_cable/channel.rb
  type ApplicationCable (line 3) | module ApplicationCable
    class Channel (line 4) | class Channel < ActionCable::Channel::Base

FILE: app/channels/application_cable/connection.rb
  type ApplicationCable (line 3) | module ApplicationCable
    class Connection (line 4) | class Connection < ActionCable::Connection::Base

FILE: app/controllers/application_controller.rb
  class ApplicationController (line 3) | class ApplicationController < ActionController::Base

FILE: app/helpers/application_helper.rb
  type ApplicationHelper (line 3) | module ApplicationHelper

FILE: app/jobs/application_job.rb
  class ApplicationJob (line 3) | class ApplicationJob < ActiveJob::Base

FILE: app/mailers/application_mailer.rb
  class ApplicationMailer (line 3) | class ApplicationMailer < ActionMailer::Base

FILE: app/models/application_record.rb
  class ApplicationRecord (line 3) | class ApplicationRecord < ActiveRecord::Base

FILE: config/application.rb
  type UffizziApp (line 13) | module UffizziApp
    class Application (line 14) | class Application < Rails::Application

FILE: core/app/clients/uffizzi_core/amazon_registry_client.rb
  class UffizziCore::AmazonRegistryClient (line 3) | class UffizziCore::AmazonRegistryClient
    method initialize (line 6) | def initialize(region:, access_key_id:, secret_access_key:)
    method authorization_token (line 11) | def authorization_token
    method batch_get_image (line 15) | def batch_get_image(image:, tag:)

FILE: core/app/clients/uffizzi_core/azure_registry_client.rb
  class UffizziCore::AzureRegistryClient (line 3) | class UffizziCore::AzureRegistryClient
    method initialize (line 6) | def initialize(registry_url:, username:, password:)
    method manifests (line 12) | def manifests(image:, tag:)
    method oauth2_token (line 19) | def oauth2_token
    method authenticated? (line 28) | def authenticated?
    method build_connection (line 34) | def build_connection(registry_url, username, password)

FILE: core/app/clients/uffizzi_core/azure_registry_client/request_result.rb
  class UffizziCore::AzureRegistryClient::RequestResult (line 3) | class UffizziCore::AzureRegistryClient::RequestResult < Hashie::Mash

FILE: core/app/clients/uffizzi_core/container_registry_request_decorator.rb
  type UffizziCore::ContainerRegistryRequestDecorator (line 3) | module UffizziCore::ContainerRegistryRequestDecorator

FILE: core/app/clients/uffizzi_core/controller_client.rb
  class UffizziCore::ControllerClient (line 3) | class UffizziCore::ControllerClient
    class ConnectionError (line 4) | class ConnectionError < StandardError; end
    method initialize (line 8) | def initialize(connection_settings)
    method apply_config_file (line 12) | def apply_config_file(deployment_id:, config_file_id:, body:)
    method deployment_containers (line 16) | def deployment_containers(deployment_id:)
    method deploy_containers (line 20) | def deploy_containers(deployment_id:, body:)
    method deployment_containers_metrics (line 24) | def deployment_containers_metrics(deployment_id:)
    method deployment_container_logs (line 28) | def deployment_container_logs(deployment_id:, container_name:, limit:,...
    method deployment_containers_events (line 32) | def deployment_containers_events(deployment_id:)
    method nodes (line 40) | def nodes
    method apply_credential (line 44) | def apply_credential(deployment_id:, body:)
    method delete_credential (line 48) | def delete_credential(deployment_id:, credential_id:)
    method get_deployments_usage_metrics_containers (line 52) | def get_deployments_usage_metrics_containers(deployment_ids:, begin_at...
    method create_namespace (line 61) | def create_namespace(body:)
    method namespace (line 65) | def namespace(namespace:)
    method delete_namespace (line 69) | def delete_namespace(namespace:)
    method create_cluster (line 73) | def create_cluster(namespace:, body:)
    method show_cluster (line 77) | def show_cluster(namespace:, name:)
    method patch_cluster (line 81) | def patch_cluster(name:, namespace:, body:)
    method ingresses (line 85) | def ingresses(namespace:)
    method get (line 91) | def get(url, params = {})
    method post (line 95) | def post(url, params = {})
    method patch (line 99) | def patch(url, params = {})
    method make_request (line 103) | def make_request(method, url, params)
    method build_connection (line 113) | def build_connection(settings)

FILE: core/app/clients/uffizzi_core/controller_client/request_result.rb
  class UffizziCore::ControllerClient::RequestResult (line 3) | class UffizziCore::ControllerClient::RequestResult < Hashie::Mash

FILE: core/app/clients/uffizzi_core/docker_hub_client.rb
  class UffizziCore::DockerHubClient (line 3) | class UffizziCore::DockerHubClient
    method initialize (line 8) | def initialize(credential = nil)
    method authenticate (line 16) | def authenticate
    method repository (line 26) | def repository(namespace:, image:)
    method public_images (line 35) | def public_images(q:, page: 1, per_page: 25)
    method private_images (line 44) | def private_images(account:, page: 1, per_page: 25)
    method accounts (line 55) | def accounts
    method metadata (line 65) | def metadata(namespace:, image:)
    method tags (line 73) | def tags(namespace:, image:, q: '', page: 1, per_page: 10)
    method digest (line 82) | def digest(image:, tag:, token:)
    method get_token (line 92) | def get_token(repository)
    method authenticated? (line 99) | def authenticated?
    method build_connection (line 105) | def build_connection

FILE: core/app/clients/uffizzi_core/docker_hub_client/not_authorized_error.rb
  class UffizziCore::DockerHubClient (line 3) | class UffizziCore::DockerHubClient
    class NotAuthorizedError (line 4) | class NotAuthorizedError < StandardError

FILE: core/app/clients/uffizzi_core/docker_hub_client/request_result.rb
  class UffizziCore::DockerHubClient (line 3) | class UffizziCore::DockerHubClient
    class RequestResult (line 4) | class RequestResult < Hashie::Mash

FILE: core/app/clients/uffizzi_core/docker_registry_client.rb
  class UffizziCore::DockerRegistryClient (line 3) | class UffizziCore::DockerRegistryClient
    method initialize (line 13) | def initialize(registry_url:, username: nil, password: nil)
    method authenticated? (line 18) | def authenticated?
    method manifests (line 24) | def manifests(image:, tag:, namespace: nil)
    method build_connection (line 34) | def build_connection(username, password)

FILE: core/app/clients/uffizzi_core/docker_registry_client/request_result.rb
  class UffizziCore::DockerRegistryClient::RequestResult (line 3) | class UffizziCore::DockerRegistryClient::RequestResult < Hashie::Mash

FILE: core/app/clients/uffizzi_core/github_container_registry_client.rb
  class UffizziCore::GithubContainerRegistryClient (line 3) | class UffizziCore::GithubContainerRegistryClient
    method initialize (line 6) | def initialize(registry_url:, username:, password:)
    method access_token (line 13) | def access_token
    method authenticated? (line 22) | def authenticated?
    method manifests (line 26) | def manifests(image:, tag:)
    method connection (line 35) | def connection
    method token_connection (line 47) | def token_connection

FILE: core/app/clients/uffizzi_core/github_container_registry_client/request_result.rb
  class UffizziCore::GithubContainerRegistryClient (line 3) | class UffizziCore::GithubContainerRegistryClient
    class RequestResult (line 4) | class RequestResult < Hashie::Mash

FILE: core/app/clients/uffizzi_core/google_registry_client.rb
  class UffizziCore::GoogleRegistryClient (line 3) | class UffizziCore::GoogleRegistryClient
    method initialize (line 6) | def initialize(registry_url:, username:, password:)
    method manifests (line 12) | def manifests(image:, tag:)
    method access_token (line 19) | def access_token
    method authenticated? (line 28) | def authenticated?
    method build_connection (line 34) | def build_connection(registry_url, username, password)

FILE: core/app/clients/uffizzi_core/google_registry_client/request_result.rb
  class UffizziCore::GoogleRegistryClient::RequestResult (line 3) | class UffizziCore::GoogleRegistryClient::RequestResult < Hashie::Mash

FILE: core/app/contexts/uffizzi_core/account_context.rb
  class UffizziCore::AccountContext (line 3) | class UffizziCore::AccountContext
    method initialize (line 6) | def initialize(user, user_access_module, account, params)

FILE: core/app/contexts/uffizzi_core/base_context.rb
  class UffizziCore::BaseContext (line 3) | class UffizziCore::BaseContext
    method initialize (line 6) | def initialize(user, user_access_module, params)

FILE: core/app/contexts/uffizzi_core/project/cluster_context.rb
  class UffizziCore::Project::ClusterContext (line 3) | class UffizziCore::Project::ClusterContext
    method initialize (line 6) | def initialize(user, project, user_access_module, cluster, params)

FILE: core/app/contexts/uffizzi_core/project_context.rb
  class UffizziCore::ProjectContext (line 3) | class UffizziCore::ProjectContext
    method initialize (line 6) | def initialize(user, user_access_module, project, account, params)

FILE: core/app/contexts/uffizzi_core/webhooks_context.rb
  class UffizziCore::WebhooksContext (line 3) | class UffizziCore::WebhooksContext
    method initialize (line 6) | def initialize(request)

FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/accounts_controller_module.rb
  type UffizziCore::Api::Cli::V1::AccountsControllerModule (line 3) | module UffizziCore::Api::Cli::V1::AccountsControllerModule
    function update (line 4) | def update; end

FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects/clusters_controller_module.rb
  type UffizziCore::Api::Cli::V1::Projects::ClustersControllerModule (line 3) | module UffizziCore::Api::Cli::V1::Projects::ClustersControllerModule
    function update_show_trial_quota_exceeded_warning (line 6) | def update_show_trial_quota_exceeded_warning; end
    function check_account_quota (line 8) | def check_account_quota; end
    function check_current_plan (line 10) | def check_current_plan; end

FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects/deployments_controller_module.rb
  type UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerModule (line 3) | module UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerModule
    function check_account_quota (line 6) | def check_account_quota; end
    function update_show_trial_quota_exceeded_warning (line 8) | def update_show_trial_quota_exceeded_warning; end
    function check_current_plan (line 10) | def check_current_plan; end

FILE: core/app/controller_modules/uffizzi_core/api/cli/v1/projects_controller_module.rb
  type UffizziCore::Api::Cli::V1::ProjectsControllerModule (line 3) | module UffizziCore::Api::Cli::V1::ProjectsControllerModule
    function update_show_trial_quota_exceeded_warning (line 6) | def update_show_trial_quota_exceeded_warning; end

FILE: core/app/controllers/concerns/uffizzi_core/auth_management.rb
  type UffizziCore::AuthManagement (line 3) | module UffizziCore::AuthManagement
    function sign_in (line 4) | def sign_in(user)
    function sign_out (line 8) | def sign_out
    function signed_in? (line 12) | def signed_in?
    function current_user (line 16) | def current_user
    function auth_token (line 20) | def auth_token
    function current_user_id (line 25) | def current_user_id
    function authenticate_request! (line 36) | def authenticate_request!

FILE: core/app/controllers/concerns/uffizzi_core/authorization_concern.rb
  type UffizziCore::AuthorizationConcern (line 3) | module UffizziCore::AuthorizationConcern
    function init_authorize (line 10) | def init_authorize
    function pundit_user (line 16) | def pundit_user
    function policy_method_name (line 22) | def policy_method_name
    function policy_name (line 26) | def policy_name
    function policy_method_params (line 32) | def policy_method_params

FILE: core/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb
  type UffizziCore::DependencyInjectionConcern (line 3) | module UffizziCore::DependencyInjectionConcern
    function include_module_if_exists (line 7) | def include_module_if_exists(module_name)
    function prepend_module_if_exists (line 11) | def prepend_module_if_exists(module_name)
    function user_access_module (line 16) | def user_access_module
    function find_build_parser_module (line 22) | def find_build_parser_module
    function find_volume_parser_module (line 26) | def find_volume_parser_module
    function ci_module (line 30) | def ci_module
    function ci_session (line 36) | def ci_session
    function password_protection_module (line 42) | def password_protection_module
    function find_ingress_parser_module (line 48) | def find_ingress_parser_module
    function notification_module (line 52) | def notification_module
    function domain_module (line 58) | def domain_module
    function deployment_memory_module (line 64) | def deployment_memory_module
    function template_memory_module (line 70) | def template_memory_module
    function controller_settings_service (line 76) | def controller_settings_service
    function module_exists? (line 84) | def module_exists?(module_name)
    function module_class (line 88) | def module_class(module_name)

FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/application_controller.rb
  class UffizziCore::Api::Cli::V1::Accounts::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ApplicationController < Uffiz...
    method resource_account (line 4) | def resource_account
    method policy_context (line 8) | def policy_context

FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/clusters_controller.rb
  class UffizziCore::Api::Cli::V1::Accounts::ClustersController (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ClustersController < UffizziC...
    method index (line 7) | def index
    method valid_request_from_ci_workflow? (line 16) | def valid_request_from_ci_workflow?
    method clusters_by_admin_projects (line 20) | def clusters_by_admin_projects
    method clusters_by_user (line 30) | def clusters_by_user
    method clusters_by_account (line 34) | def clusters_by_account
    method account_projects (line 38) | def account_projects

FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/credentials_controller.rb
  class UffizziCore::Api::Cli::V1::Accounts::CredentialsController (line 4) | class UffizziCore::Api::Cli::V1::Accounts::CredentialsController < Uffiz...
    method index (line 12) | def index
    method create (line 30) | def create
    method update (line 51) | def update
    method check_credential (line 74) | def check_credential
    method destroy (line 93) | def destroy
    method credential_params (line 100) | def credential_params
    method registry_url (line 104) | def registry_url(credential_form)
    method credential_changed? (line 116) | def credential_changed?(credential, credential_params)

FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts/projects_controller.rb
  class UffizziCore::Api::Cli::V1::Accounts::ProjectsController (line 5) | class UffizziCore::Api::Cli::V1::Accounts::ProjectsController < UffizziC...
    method index (line 8) | def index
    method create (line 24) | def create
    method project_params (line 34) | def project_params

FILE: core/app/controllers/uffizzi_core/api/cli/v1/accounts_controller.rb
  class UffizziCore::Api::Cli::V1::AccountsController (line 5) | class UffizziCore::Api::Cli::V1::AccountsController < UffizziCore::Api::...
    method index (line 16) | def index
    method show (line 28) | def show
    method policy_context (line 34) | def policy_context
    method resource_account (line 40) | def resource_account

FILE: core/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb
  class UffizziCore::Api::Cli::V1::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::ApplicationController < UffizziCore::Ap...
    method resource_project (line 6) | def resource_project
    method resource_account (line 10) | def resource_account

FILE: core/app/controllers/uffizzi_core/api/cli/v1/ci/application_controller.rb
  class UffizziCore::Api::Cli::V1::Ci::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Ci::ApplicationController < UffizziCore...

FILE: core/app/controllers/uffizzi_core/api/cli/v1/ci/sessions_controller.rb
  class UffizziCore::Api::Cli::V1::Ci::SessionsController (line 5) | class UffizziCore::Api::Cli::V1::Ci::SessionsController < UffizziCore::A...
    method create (line 15) | def create
    method user_params (line 33) | def user_params

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Projects::ApplicationController < Uffiz...
    method resource_project (line 4) | def resource_project
    method resource_account (line 8) | def resource_account
    method policy_context (line 12) | def policy_context

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/application_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Clusters::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Projects::Clusters::ApplicationControll...
    method resource_cluster (line 4) | def resource_cluster
    method active_project_clusters (line 14) | def active_project_clusters
    method request_by_admin? (line 18) | def request_by_admin?
    method valid_request_from_ci_workflow? (line 22) | def valid_request_from_ci_workflow?
    method policy_context (line 26) | def policy_context

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/ingresses_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesController (line 3) | class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesController <
    method index (line 7) | def index

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::ClustersController (line 3) | class UffizziCore::Api::Cli::V1::Projects::ClustersController < UffizziC...
    method index (line 11) | def index
    method create (line 18) | def create
    method scale_down (line 34) | def scale_down
    method scale_up (line 49) | def scale_up
    method show (line 60) | def show
    method sync (line 64) | def sync
    method destroy (line 72) | def destroy
    method resource_cluster (line 80) | def resource_cluster
    method request_by_admin? (line 89) | def request_by_admin?
    method valid_request_from_ci_workflow? (line 93) | def valid_request_from_ci_workflow?
    method cluster_params (line 97) | def cluster_params
    method render_scale_error (line 101) | def render_scale_error(message)
    method find_kubernetes_distribution (line 105) | def find_kubernetes_distribution(version)
    method render_distribution_version_error (line 111) | def render_distribution_version_error(version)

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::ComposeFilesController (line 4) | class UffizziCore::Api::Cli::V1::Projects::ComposeFilesController < Uffi...
    method show (line 16) | def show
    method create (line 33) | def create
    method destroy (line 55) | def destroy
    method compose_file (line 63) | def compose_file
    method compose_file_params (line 70) | def compose_file_params
    method dependencies_params (line 74) | def dependencies_params
    method create_or_update_compose_file (line 78) | def create_or_update_compose_file(params)
    method render_errors (line 88) | def render_errors(errors)

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsController (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsCon...
    method index (line 17) | def index

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationContr...
    method resource_deployment (line 4) | def resource_deployment

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::ApplicationController (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::Appl...
    method resource_container (line 5) | def resource_container

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::LogsController (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::Logs...
    method index (line 16) | def index
    method logs_params (line 24) | def logs_params

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersController (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersContro...
    method index (line 19) | def index
    method k8s_container_description (line 25) | def k8s_container_description

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsController (line 4) | class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsController <
    method index (line 22) | def index

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsController (line 5) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < Uffiz...
    method index (line 21) | def index
    method show (line 37) | def show
    method create (line 54) | def create
    method update (line 87) | def update
    method deploy_containers (line 115) | def deploy_containers
    method destroy (line 135) | def destroy
    method deployment (line 144) | def deployment
    method find_or_create_compose_file (line 148) | def find_or_create_compose_file
    method check_credentials (line 165) | def check_credentials(compose_file)
    method deployments (line 175) | def deployments
    method deployment_params (line 179) | def deployment_params
    method compose_file_params (line 183) | def compose_file_params
    method dependencies_params (line 187) | def dependencies_params
    method metadata_params (line 191) | def metadata_params
    method creation_source_params (line 195) | def creation_source_params
    method render_invalid_file (line 199) | def render_invalid_file
    method render_deployment_exists_error (line 203) | def render_deployment_exists_error

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb
  class UffizziCore::Api::Cli::V1::Projects::SecretsController (line 4) | class UffizziCore::Api::Cli::V1::Projects::SecretsController < UffizziCo...
    method index (line 13) | def index
    method bulk_create (line 25) | def bulk_create
    method destroy (line 45) | def destroy
    method secrets_params (line 58) | def secrets_params

FILE: core/app/controllers/uffizzi_core/api/cli/v1/projects_controller.rb
  class UffizziCore::Api::Cli::V1::ProjectsController (line 5) | class UffizziCore::Api::Cli::V1::ProjectsController < UffizziCore::Api::...
    method index (line 17) | def index
    method show (line 30) | def show
    method destroy (line 42) | def destroy
    method project_params (line 50) | def project_params
    method policy_context (line 54) | def policy_context

FILE: core/app/controllers/uffizzi_core/api/cli/v1/sessions_controller.rb
  class UffizziCore::Api::Cli::V1::SessionsController (line 5) | class UffizziCore::Api::Cli::V1::SessionsController < UffizziCore::Api::...
    method create (line 15) | def create
    method destroy (line 32) | def destroy
    method session_params (line 40) | def session_params

FILE: core/app/controllers/uffizzi_core/application_controller.rb
  class UffizziCore::ApplicationController (line 3) | class UffizziCore::ApplicationController < ActionController::Base
    method render_not_authorized (line 30) | def render_not_authorized
    method policy_context (line 34) | def policy_context
    method responder (line 38) | def self.responder
    method render_not_found (line 42) | def render_not_found(exception)
    method render_server_error (line 47) | def render_server_error(error)
    method render_errors (line 51) | def render_errors(errors)
    method q_param (line 57) | def q_param
    method page (line 61) | def page
    method per_page (line 65) | def per_page

FILE: core/app/errors/uffizzi_core/cluster_scale_error.rb
  class UffizziCore::ClusterScaleError (line 3) | class UffizziCore::ClusterScaleError < StandardError
    method initialize (line 4) | def initialize(action)

FILE: core/app/errors/uffizzi_core/compose_file/build_error.rb
  class UffizziCore::ComposeFile::BuildError (line 3) | class UffizziCore::ComposeFile::BuildError < UffizziCore::ComposeFileError
    method initialize (line 4) | def initialize(message, extra_errors = {})

FILE: core/app/errors/uffizzi_core/compose_file/credential_error.rb
  class UffizziCore::ComposeFile::CredentialError (line 3) | class UffizziCore::ComposeFile::CredentialError < StandardError

FILE: core/app/errors/uffizzi_core/compose_file/parse_error.rb
  class UffizziCore::ComposeFile::ParseError (line 3) | class UffizziCore::ComposeFile::ParseError < StandardError

FILE: core/app/errors/uffizzi_core/compose_file/secrets_error.rb
  class UffizziCore::ComposeFile::SecretsError (line 3) | class UffizziCore::ComposeFile::SecretsError < UffizziCore::ComposeFileE...
    method initialize (line 4) | def initialize(message, extra_errors = {})

FILE: core/app/errors/uffizzi_core/compose_file_error.rb
  class UffizziCore::ComposeFileError (line 3) | class UffizziCore::ComposeFileError < StandardError
    method initialize (line 6) | def initialize(message, error_key = nil, extra_errors = {})

FILE: core/app/errors/uffizzi_core/container_registry_error.rb
  class UffizziCore::ContainerRegistryError (line 3) | class UffizziCore::ContainerRegistryError < StandardError
    method initialize (line 6) | def initialize(response)
    method prepare_errors (line 16) | def prepare_errors(body, status)

FILE: core/app/errors/uffizzi_core/deployment/image_pull_error.rb
  class UffizziCore::Deployment::ImagePullError (line 3) | class UffizziCore::Deployment::ImagePullError < StandardError
    method initialize (line 6) | def initialize(deployment_id)

FILE: core/app/errors/uffizzi_core/deployment_not_found_error.rb
  class UffizziCore::DeploymentNotFoundError (line 3) | class UffizziCore::DeploymentNotFoundError < StandardError
    method initialize (line 6) | def initialize(deployment_id)

FILE: core/app/errors/uffizzi_core/registry_not_supported_error.rb
  class UffizziCore::RegistryNotSupportedError (line 3) | class UffizziCore::RegistryNotSupportedError < StandardError

FILE: core/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb
  class UffizziCore::Api::Cli::V1::Account::Credential::CheckCredentialForm (line 3) | class UffizziCore::Api::Cli::V1::Account::Credential::CheckCredentialForm
    method credential_exists? (line 13) | def credential_exists?

FILE: core/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb
  class UffizziCore::Api::Cli::V1::Account::Credential::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::Account::Credential::CreateForm < Uffiz...
    method check_registry_url (line 15) | def check_registry_url
    method check_credential_correctness (line 19) | def check_credential_correctness
    method credential_exists? (line 23) | def credential_exists?

FILE: core/app/forms/uffizzi_core/api/cli/v1/account/credential/update_form.rb
  class UffizziCore::Api::Cli::V1::Account::Credential::UpdateForm (line 3) | class UffizziCore::Api::Cli::V1::Account::Credential::UpdateForm < Uffiz...
    method check_registry_url (line 14) | def check_registry_url
    method check_credential_correctness (line 18) | def check_credential_correctness

FILE: core/app/forms/uffizzi_core/api/cli/v1/cluster/create_form.rb
  class UffizziCore::Api::Cli::V1::Cluster::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::Cluster::CreateForm < UffizziCore::Cluster
    method check_manifest (line 12) | def check_manifest

FILE: core/app/forms/uffizzi_core/api/cli/v1/cluster/sync_form.rb
  class UffizziCore::Api::Cli::V1::Cluster::SyncForm (line 3) | class UffizziCore::Api::Cli::V1::Cluster::SyncForm < UffizziCore::Cluster
    method sync_status (line 8) | def sync_status
    method actual_status? (line 22) | def actual_status?(asleep_in_cluster)

FILE: core/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb
  class UffizziCore::Api::Cli::V1::ComposeFile::CheckCredentialsForm (line 3) | class UffizziCore::Api::Cli::V1::ComposeFile::CheckCredentialsForm
    method check_containers_credentials (line 15) | def check_containers_credentials

FILE: core/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb
  class UffizziCore::Api::Cli::V1::ComposeFile::CliForm (line 3) | class UffizziCore::Api::Cli::V1::ComposeFile::CliForm
    method check_compose_parsed_data (line 18) | def check_compose_parsed_data

FILE: core/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb
  class UffizziCore::Api::Cli::V1::ComposeFile::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::ComposeFile::CreateForm < UffizziCore::...

FILE: core/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb
  class UffizziCore::Api::Cli::V1::ComposeFile::TemplateForm (line 3) | class UffizziCore::Api::Cli::V1::ComposeFile::TemplateForm
    method assign_template_attributes! (line 18) | def assign_template_attributes!
    method check_template_attributes (line 33) | def check_template_attributes

FILE: core/app/forms/uffizzi_core/api/cli/v1/compose_file/update_form.rb
  class UffizziCore::Api::Cli::V1::ComposeFile::UpdateForm (line 3) | class UffizziCore::Api::Cli::V1::ComposeFile::UpdateForm < UffizziCore::...

FILE: core/app/forms/uffizzi_core/api/cli/v1/config_file/create_form.rb
  class UffizziCore::Api::Cli::V1::ConfigFile::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::ConfigFile::CreateForm < UffizziCore::C...

FILE: core/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb
  class UffizziCore::Api::Cli::V1::Deployment::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::D...
    method assign_dependences! (line 62) | def assign_dependences!(project, user)
    method check_all_containers_have_unique_ports (line 78) | def check_all_containers_have_unique_ports
    method check_exists_ingress_container (line 84) | def check_exists_ingress_container
    method check_secrets_exist_in_database (line 90) | def check_secrets_exist_in_database
    method check_max_memory_limit (line 103) | def check_max_memory_limit

FILE: core/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb
  class UffizziCore::Api::Cli::V1::Deployment::UpdateForm (line 3) | class UffizziCore::Api::Cli::V1::Deployment::UpdateForm < UffizziCore::D...
    method assign_dependences! (line 60) | def assign_dependences!(project, user)
    method check_all_containers_have_unique_ports (line 76) | def check_all_containers_have_unique_ports
    method check_exists_ingress_container (line 82) | def check_exists_ingress_container
    method check_max_memory_limit (line 88) | def check_max_memory_limit

FILE: core/app/forms/uffizzi_core/api/cli/v1/project/create_form.rb
  class UffizziCore::Api::Cli::V1::Project::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::Project::CreateForm < UffizziCore::Project

FILE: core/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb
  class UffizziCore::Api::Cli::V1::Project::UpdateForm (line 3) | class UffizziCore::Api::Cli::V1::Project::UpdateForm < UffizziCore::Project

FILE: core/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb
  class UffizziCore::Api::Cli::V1::Secret::BulkAssignForm (line 3) | class UffizziCore::Api::Cli::V1::Secret::BulkAssignForm
    method assign_secrets (line 11) | def assign_secrets(new_secrets)
    method check_duplicates (line 22) | def check_duplicates
    method check_length (line 33) | def check_length

FILE: core/app/forms/uffizzi_core/api/cli/v1/session_create_form.rb
  class UffizziCore::Api::Cli::V1::SessionCreateForm (line 3) | class UffizziCore::Api::Cli::V1::SessionCreateForm
    method user (line 12) | def user
    method check_authenticate (line 16) | def check_authenticate
    method wrong_email_or_password? (line 24) | def wrong_email_or_password?

FILE: core/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb
  class UffizziCore::Api::Cli::V1::Template::CreateForm (line 3) | class UffizziCore::Api::Cli::V1::Template::CreateForm < UffizziCore::Tem...
    method check_max_memory_limit (line 8) | def check_max_memory_limit

FILE: core/app/forms/uffizzi_core/application_form.rb
  type UffizziCore::ApplicationForm (line 3) | module UffizziCore::ApplicationForm

FILE: core/app/forms/uffizzi_core/application_form_without_active_record.rb
  type UffizziCore::ApplicationFormWithoutActiveRecord (line 3) | module UffizziCore::ApplicationFormWithoutActiveRecord
    function persisted? (line 14) | def persisted?

FILE: core/app/forms/uffizzi_core/mass_assignment_control_concern.rb
  type UffizziCore::MassAssignmentControlConcern (line 3) | module UffizziCore::MassAssignmentControlConcern
    function permit (line 7) | def permit(*args)
    function _args (line 11) | def _args
    function assign_attributes (line 16) | def assign_attributes(attrs = ActionController::Parameters.new)

FILE: core/app/helpers/uffizzi_core/application_helper.rb
  type UffizziCore (line 3) | module UffizziCore
    type ApplicationHelper (line 4) | module ApplicationHelper

FILE: core/app/jobs/uffizzi_core/account/create_credential_job.rb
  class UffizziCore::Account::CreateCredentialJob (line 3) | class UffizziCore::Account::CreateCredentialJob < UffizziCore::Applicati...
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/account/update_credential_job.rb
  class UffizziCore::Account::UpdateCredentialJob (line 3) | class UffizziCore::Account::UpdateCredentialJob < UffizziCore::Applicati...
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/activity_item/docker/update_digest_job.rb
  class UffizziCore::ActivityItem::Docker::UpdateDigestJob (line 3) | class UffizziCore::ActivityItem::Docker::UpdateDigestJob < UffizziCore::...
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/application_job.rb
  type UffizziCore (line 3) | module UffizziCore
    class ApplicationJob (line 4) | class ApplicationJob

FILE: core/app/jobs/uffizzi_core/cluster/delete_job.rb
  class UffizziCore::Cluster::DeleteJob (line 3) | class UffizziCore::Cluster::DeleteJob < UffizziCore::ApplicationJob
    method perform (line 8) | def perform(id)

FILE: core/app/jobs/uffizzi_core/cluster/deploy_job.rb
  class UffizziCore::Cluster::DeployJob (line 3) | class UffizziCore::Cluster::DeployJob < UffizziCore::ApplicationJob
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/cluster/manage_deploying_job.rb
  class UffizziCore::Cluster::ManageDeployingJob (line 3) | class UffizziCore::Cluster::ManageDeployingJob < UffizziCore::Applicatio...
    method perform (line 6) | def perform(id, try = 1)

FILE: core/app/jobs/uffizzi_core/cluster/manage_scaling_down_job.rb
  class UffizziCore::Cluster::ManageScalingDownJob (line 3) | class UffizziCore::Cluster::ManageScalingDownJob < UffizziCore::Applicat...
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/cluster/manage_scaling_up_job.rb
  class UffizziCore::Cluster::ManageScalingUpJob (line 3) | class UffizziCore::Cluster::ManageScalingUpJob < UffizziCore::Applicatio...
    method perform (line 6) | def perform(id, try = 1)

FILE: core/app/jobs/uffizzi_core/config_file/apply_job.rb
  class UffizziCore::ConfigFile::ApplyJob (line 3) | class UffizziCore::ConfigFile::ApplyJob < UffizziCore::ApplicationJob
    method perform (line 21) | def perform(deployment_id, config_file_id)

FILE: core/app/jobs/uffizzi_core/deployment/create_credential_job.rb
  class UffizziCore::Deployment::CreateCredentialJob (line 3) | class UffizziCore::Deployment::CreateCredentialJob < UffizziCore::Applic...
    method perform (line 21) | def perform(deployment_id, credential_id)

FILE: core/app/jobs/uffizzi_core/deployment/create_credentials_job.rb
  class UffizziCore::Deployment::CreateCredentialsJob (line 3) | class UffizziCore::Deployment::CreateCredentialsJob < UffizziCore::Appli...
    method perform (line 6) | def perform(deployment_id)

FILE: core/app/jobs/uffizzi_core/deployment/create_job.rb
  class UffizziCore::Deployment::CreateJob (line 3) | class UffizziCore::Deployment::CreateJob < UffizziCore::ApplicationJob
    method perform (line 6) | def perform(id)

FILE: core/app/jobs/uffizzi_core/deployment/delete_credential_job.rb
  class UffizziCore::Deployment::DeleteCredentialJob (line 3) | class UffizziCore::Deployment::DeleteCredentialJob < UffizziCore::Applic...
    method perform (line 6) | def perform(deployment_id, credential_id)

FILE: core/app/jobs/uffizzi_core/deployment/delete_job.rb
  class UffizziCore::Deployment::DeleteJob (line 3) | class UffizziCore::Deployment::DeleteJob < UffizziCore::ApplicationJob
    method perform (line 8) | def perform(id)

FILE: core/app/jobs/uffizzi_core/deployment/deploy_containers_job.rb
  class UffizziCore::Deployment::DeployContainersJob (line 3) | class UffizziCore::Deployment::DeployContainersJob < UffizziCore::Applic...
    method perform (line 21) | def perform(id, repeated = false)

FILE: core/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb
  class UffizziCore::Deployment::ManageDeployActivityItemJob (line 3) | class UffizziCore::Deployment::ManageDeployActivityItemJob < UffizziCore...
    method perform (line 34) | def perform(activity_item_id)

FILE: core/app/jobs/uffizzi_core/deployment/update_credential_job.rb
  class UffizziCore::Deployment::UpdateCredentialJob (line 3) | class UffizziCore::Deployment::UpdateCredentialJob < UffizziCore::Applic...
    method perform (line 21) | def perform(deployment_id, credential_id)

FILE: core/app/lib/uffizzi_core/concerns/models/account.rb
  type UffizziCore::Concerns::Models::Account (line 3) | module UffizziCore::Concerns::Models::Account
    function update_payment_issue_date (line 46) | def update_payment_issue_date
    function active_projects (line 50) | def active_projects
    function disable_projects (line 54) | def disable_projects
    function user (line 59) | def user

FILE: core/app/lib/uffizzi_core/concerns/models/activity_item.rb
  type UffizziCore::Concerns::Models::ActivityItem (line 3) | module UffizziCore::Concerns::Models::ActivityItem
    function docker? (line 17) | def docker?
    function image (line 21) | def image
    function full_image (line 25) | def full_image

FILE: core/app/lib/uffizzi_core/concerns/models/cluster.rb
  type UffizziCore::Concerns::Models::Cluster (line 3) | module UffizziCore::Concerns::Models::Cluster
    function after_disable (line 88) | def after_disable
    function namespace (line 92) | def namespace

FILE: core/app/lib/uffizzi_core/concerns/models/comment.rb
  type UffizziCore::Concerns::Models::Comment (line 3) | module UffizziCore::Concerns::Models::Comment

FILE: core/app/lib/uffizzi_core/concerns/models/compose_file.rb
  type UffizziCore::Concerns::Models::ComposeFile (line 3) | module UffizziCore::Concerns::Models::ComposeFile
    function local_source? (line 54) | def local_source?
    function source_kind (line 58) | def source_kind
    function main_compose_file_uniqueness (line 64) | def main_compose_file_uniqueness

FILE: core/app/lib/uffizzi_core/concerns/models/config_file.rb
  type UffizziCore::Concerns::Models::ConfigFile (line 3) | module UffizziCore::Concerns::Models::ConfigFile

FILE: core/app/lib/uffizzi_core/concerns/models/container.rb
  type UffizziCore::Concerns::Models::Container (line 3) | module UffizziCore::Concerns::Models::Container
    function image_name (line 70) | def image_name
    function should_check_port (line 76) | def should_check_port
    function set_defaults (line 80) | def set_defaults
    function update_target_port_value (line 84) | def update_target_port_value
    function check_target_port (line 88) | def check_target_port

FILE: core/app/lib/uffizzi_core/concerns/models/container_config_file.rb
  type UffizziCore::Concerns::Models::ContainerConfigFile (line 3) | module UffizziCore::Concerns::Models::ContainerConfigFile

FILE: core/app/lib/uffizzi_core/concerns/models/container_host_volume_file.rb
  type UffizziCore::Concerns::Models::ContainerHostVolumeFile (line 3) | module UffizziCore::Concerns::Models::ContainerHostVolumeFile

FILE: core/app/lib/uffizzi_core/concerns/models/coupon.rb
  type UffizziCore::Concerns::Models::Coupon (line 3) | module UffizziCore::Concerns::Models::Coupon

FILE: core/app/lib/uffizzi_core/concerns/models/credential.rb
  type UffizziCore::Concerns::Models::Credential (line 3) | module UffizziCore::Concerns::Models::Credential
    function correct? (line 53) | def correct?
    function remove_token (line 69) | def remove_token

FILE: core/app/lib/uffizzi_core/concerns/models/deployment.rb
  type UffizziCore::Concerns::Models::Deployment (line 3) | module UffizziCore::Concerns::Models::Deployment
    function active_containers (line 38) | def active_containers
    function after_activate (line 60) | def after_activate
    function after_disable (line 64) | def after_disable
    function clean (line 69) | def clean
    function preview_url (line 74) | def preview_url
    function namespace (line 79) | def namespace

FILE: core/app/lib/uffizzi_core/concerns/models/deployment_event.rb
  type UffizziCore::Concerns::Models::DeploymentEvent (line 3) | module UffizziCore::Concerns::Models::DeploymentEvent

FILE: core/app/lib/uffizzi_core/concerns/models/event.rb
  type UffizziCore::Concerns::Models::Event (line 3) | module UffizziCore::Concerns::Models::Event

FILE: core/app/lib/uffizzi_core/concerns/models/host_volume_file.rb
  type UffizziCore::Concerns::Models::HostVolumeFile (line 3) | module UffizziCore::Concerns::Models::HostVolumeFile

FILE: core/app/lib/uffizzi_core/concerns/models/kubernetes_distribution.rb
  type UffizziCore::Concerns::Models::KubernetesDistribution (line 3) | module UffizziCore::Concerns::Models::KubernetesDistribution
    function default (line 11) | def self.default

FILE: core/app/lib/uffizzi_core/concerns/models/membership.rb
  type UffizziCore::Concerns::Models::Membership (line 3) | module UffizziCore::Concerns::Models::Membership

FILE: core/app/lib/uffizzi_core/concerns/models/payment.rb
  type UffizziCore::Concerns::Models::Payment (line 3) | module UffizziCore::Concerns::Models::Payment

FILE: core/app/lib/uffizzi_core/concerns/models/price.rb
  type UffizziCore::Concerns::Models::Price (line 3) | module UffizziCore::Concerns::Models::Price

FILE: core/app/lib/uffizzi_core/concerns/models/product.rb
  type UffizziCore::Concerns::Models::Product (line 3) | module UffizziCore::Concerns::Models::Product

FILE: core/app/lib/uffizzi_core/concerns/models/project.rb
  type UffizziCore::Concerns::Models::Project (line 3) | module UffizziCore::Concerns::Models::Project
    function after_disable (line 45) | def after_disable
    function active_deployments (line 50) | def active_deployments
    function active_clusters (line 54) | def active_clusters
    function disable_deployments (line 58) | def disable_deployments
    function disable_clusters (line 65) | def disable_clusters
    function compose_file (line 69) | def compose_file

FILE: core/app/lib/uffizzi_core/concerns/models/rating.rb
  type UffizziCore::Concerns::Models::Rating (line 3) | module UffizziCore::Concerns::Models::Rating

FILE: core/app/lib/uffizzi_core/concerns/models/repo.rb
  type UffizziCore::Concerns::Models::Repo (line 3) | module UffizziCore::Concerns::Models::Repo
    function docker_hub? (line 20) | def docker_hub?
    function azure? (line 24) | def azure?
    function google? (line 28) | def google?

FILE: core/app/lib/uffizzi_core/concerns/models/role.rb
  type UffizziCore::Concerns::Models::Role (line 3) | module UffizziCore::Concerns::Models::Role

FILE: core/app/lib/uffizzi_core/concerns/models/secret.rb
  type UffizziCore::Concerns::Models::Secret (line 3) | module UffizziCore::Concerns::Models::Secret

FILE: core/app/lib/uffizzi_core/concerns/models/template.rb
  type UffizziCore::Concerns::Models::Template (line 3) | module UffizziCore::Concerns::Models::Template

FILE: core/app/lib/uffizzi_core/concerns/models/user.rb
  type UffizziCore::Concerns::Models::User (line 3) | module UffizziCore::Concerns::Models::User
    function default_account (line 29) | def default_account
    function personal_account (line 33) | def personal_account
    function full_name (line 37) | def full_name
    function admin_access_to_project? (line 55) | def admin_access_to_project?(project)

FILE: core/app/lib/uffizzi_core/concerns/models/user_project.rb
  type UffizziCore::Concerns::Models::UserProject (line 3) | module UffizziCore::Concerns::Models::UserProject

FILE: core/app/lib/uffizzi_core/rbac/user_access_service.rb
  type UffizziCore::Rbac::UserAccessService (line 3) | module UffizziCore::Rbac::UserAccessService
    function admin_access_to_account? (line 5) | def admin_access_to_account?(_user, _account)
    function any_access_to_account? (line 9) | def any_access_to_account?(_user, _account)
    function admin_or_developer_access_to_account? (line 13) | def admin_or_developer_access_to_account?(_user, _account)
    function admin_or_developer_access_to_project? (line 17) | def admin_or_developer_access_to_project?(_user, _project)
    function any_access_to_project? (line 21) | def any_access_to_project?(_user, _project)
    function admin_access_to_project? (line 25) | def admin_access_to_project?(_user, _project)

FILE: core/app/mailers/uffizzi_core/application_mailer.rb
  type UffizziCore (line 3) | module UffizziCore
    class ApplicationMailer (line 4) | class ApplicationMailer < ActionMailer::Base

FILE: core/app/models/concerns/uffizzi_core/hashid_concern.rb
  type UffizziCore::HashidConcern (line 3) | module UffizziCore::HashidConcern
    function hashid_service (line 7) | def hashid_service
    function find_by_hashid (line 11) | def find_by_hashid(hashid)
    function find_by_hashid! (line 16) | def find_by_hashid!(hashid)
    function hashid (line 22) | def hashid

FILE: core/app/models/concerns/uffizzi_core/state_machine_concern.rb
  type UffizziCore::StateMachineConcern (line 3) | module UffizziCore::StateMachineConcern
    function aasm (line 7) | def aasm(attribute, *args)

FILE: core/app/models/uffizzi_core/account.rb
  class UffizziCore::Account (line 3) | class UffizziCore::Account < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/activity_item.rb
  class UffizziCore::ActivityItem (line 21) | class UffizziCore::ActivityItem < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/activity_item/docker.rb
  class UffizziCore::ActivityItem::Docker (line 3) | class UffizziCore::ActivityItem::Docker < UffizziCore::ActivityItem

FILE: core/app/models/uffizzi_core/activity_item/github.rb
  class UffizziCore::ActivityItem::Github (line 3) | class UffizziCore::ActivityItem::Github < UffizziCore::ActivityItem

FILE: core/app/models/uffizzi_core/activity_item/memory_limit.rb
  class UffizziCore::ActivityItem::MemoryLimit (line 3) | class UffizziCore::ActivityItem::MemoryLimit < UffizziCore::ActivityItem

FILE: core/app/models/uffizzi_core/application_record.rb
  type UffizziCore (line 3) | module UffizziCore
    class ApplicationRecord (line 4) | class ApplicationRecord < ActiveRecord::Base

FILE: core/app/models/uffizzi_core/cluster.rb
  class UffizziCore::Cluster (line 3) | class UffizziCore::Cluster < ApplicationRecord

FILE: core/app/models/uffizzi_core/comment.rb
  class UffizziCore::Comment (line 3) | class UffizziCore::Comment < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/compose_file.rb
  class UffizziCore::ComposeFile (line 12) | class UffizziCore::ComposeFile < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/config_file.rb
  class UffizziCore::ConfigFile (line 10) | class UffizziCore::ConfigFile < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/container.rb
  class UffizziCore::Container (line 14) | class UffizziCore::Container < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/container_config_file.rb
  class UffizziCore::ContainerConfigFile (line 3) | class UffizziCore::ContainerConfigFile < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/container_host_volume_file.rb
  class UffizziCore::ContainerHostVolumeFile (line 3) | class UffizziCore::ContainerHostVolumeFile < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/continuous_preview.rb
  class UffizziCore::ContinuousPreview (line 3) | class UffizziCore::ContinuousPreview < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/coupon.rb
  class UffizziCore::Coupon (line 3) | class UffizziCore::Coupon < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/credential.rb
  class UffizziCore::Credential (line 3) | class UffizziCore::Credential < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/credential/amazon.rb
  class UffizziCore::Credential::Amazon (line 3) | class UffizziCore::Credential::Amazon < UffizziCore::Credential

FILE: core/app/models/uffizzi_core/credential/azure.rb
  class UffizziCore::Credential::Azure (line 3) | class UffizziCore::Credential::Azure < UffizziCore::Credential

FILE: core/app/models/uffizzi_core/credential/docker_hub.rb
  class UffizziCore::Credential::DockerHub (line 3) | class UffizziCore::Credential::DockerHub < UffizziCore::Credential

FILE: core/app/models/uffizzi_core/credential/docker_registry.rb
  class UffizziCore::Credential::DockerRegistry (line 3) | class UffizziCore::Credential::DockerRegistry < UffizziCore::Credential

FILE: core/app/models/uffizzi_core/credential/github_container_registry.rb
  class UffizziCore::Credential::GithubContainerRegistry (line 3) | class UffizziCore::Credential::GithubContainerRegistry < UffizziCore::Cr...

FILE: core/app/models/uffizzi_core/credential/google.rb
  class UffizziCore::Credential::Google (line 3) | class UffizziCore::Credential::Google < UffizziCore::Credential

FILE: core/app/models/uffizzi_core/database.rb
  class UffizziCore::Database (line 3) | class UffizziCore::Database < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/database_offering.rb
  class UffizziCore::DatabaseOffering (line 3) | class UffizziCore::DatabaseOffering < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/deployment.rb
  class UffizziCore::Deployment (line 22) | class UffizziCore::Deployment < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/deployment_event.rb
  class UffizziCore::DeploymentEvent (line 3) | class UffizziCore::DeploymentEvent < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/event.rb
  class UffizziCore::Event (line 3) | class UffizziCore::Event < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/host_volume_file.rb
  class UffizziCore::HostVolumeFile (line 3) | class UffizziCore::HostVolumeFile < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/kubernetes_distribution.rb
  class UffizziCore::KubernetesDistribution (line 3) | class UffizziCore::KubernetesDistribution < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/membership.rb
  class UffizziCore::Membership (line 3) | class UffizziCore::Membership < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/payment.rb
  class UffizziCore::Payment (line 3) | class UffizziCore::Payment < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/price.rb
  class UffizziCore::Price (line 3) | class UffizziCore::Price < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/product.rb
  class UffizziCore::Product (line 3) | class UffizziCore::Product < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/project.rb
  class UffizziCore::Project (line 13) | class UffizziCore::Project < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/rating.rb
  class UffizziCore::Rating (line 3) | class UffizziCore::Rating < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/repo.rb
  class UffizziCore::Repo (line 3) | class UffizziCore::Repo < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/repo/amazon.rb
  class UffizziCore::Repo::Amazon (line 3) | class UffizziCore::Repo::Amazon < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/repo/azure.rb
  class UffizziCore::Repo::Azure (line 3) | class UffizziCore::Repo::Azure < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/repo/docker_hub.rb
  class UffizziCore::Repo::DockerHub (line 3) | class UffizziCore::Repo::DockerHub < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/repo/docker_registry.rb
  class UffizziCore::Repo::DockerRegistry (line 3) | class UffizziCore::Repo::DockerRegistry < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/repo/github_container_registry.rb
  class UffizziCore::Repo::GithubContainerRegistry (line 3) | class UffizziCore::Repo::GithubContainerRegistry < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/repo/google.rb
  class UffizziCore::Repo::Google (line 3) | class UffizziCore::Repo::Google < UffizziCore::Repo

FILE: core/app/models/uffizzi_core/role.rb
  class UffizziCore::Role (line 3) | class UffizziCore::Role < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/secret.rb
  class UffizziCore::Secret (line 3) | class UffizziCore::Secret < ApplicationRecord

FILE: core/app/models/uffizzi_core/template.rb
  class UffizziCore::Template (line 3) | class UffizziCore::Template < UffizziCore::ApplicationRecord

FILE: core/app/models/uffizzi_core/user.rb
  class UffizziCore::User (line 3) | class UffizziCore::User < ActiveRecord::Base

FILE: core/app/models/uffizzi_core/user_project.rb
  class UffizziCore::UserProject (line 3) | class UffizziCore::UserProject < UffizziCore::ApplicationRecord

FILE: core/app/policies/uffizzi_core/api/cli/v1/accounts/clusters_policy.rb
  class UffizziCore::Api::Cli::V1::Accounts::ClustersPolicy (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ClustersPolicy < UffizziCore:...
    method index? (line 4) | def index?

FILE: core/app/policies/uffizzi_core/api/cli/v1/accounts/credentials_policy.rb
  class UffizziCore::Api::Cli::V1::Accounts::CredentialsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Accounts::CredentialsPolicy < UffizziCo...
    method index? (line 4) | def index?
    method create? (line 8) | def create?
    method update? (line 12) | def update?
    method check_credential? (line 16) | def check_credential?
    method destroy? (line 20) | def destroy?

FILE: core/app/policies/uffizzi_core/api/cli/v1/accounts/projects_policy.rb
  class UffizziCore::Api::Cli::V1::Accounts::ProjectsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ProjectsPolicy < UffizziCore:...
    method index? (line 4) | def index?
    method create? (line 8) | def create?

FILE: core/app/policies/uffizzi_core/api/cli/v1/accounts_policy.rb
  class UffizziCore::Api::Cli::V1::AccountsPolicy (line 3) | class UffizziCore::Api::Cli::V1::AccountsPolicy < UffizziCore::Applicati...
    method index? (line 4) | def index?
    method show? (line 8) | def show?
    method update? (line 12) | def update?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/clusters/ingresses_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesPolicy < U...
    method index? (line 4) | def index?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/clusters_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::ClustersPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::ClustersPolicy < UffizziCore:...
    method index? (line 4) | def index?
    method show? (line 8) | def show?
    method create? (line 12) | def create?
    method scale_down? (line 16) | def scale_down?
    method scale_up? (line 20) | def scale_up?
    method sync? (line 24) | def sync?
    method destroy? (line 28) | def destroy?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/compose_files_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::ComposeFilesPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::ComposeFilesPolicy < UffizziC...
    method show? (line 4) | def show?
    method create? (line 8) | def create?
    method destroy? (line 12) | def destroy?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/deployments/activity_items_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsPol...
    method index? (line 4) | def index?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/deployments/containers_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersPolicy...
    method index? (line 4) | def index?
    method k8s_container_description? (line 8) | def k8s_container_description?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/deployments/events_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsPolicy < U...
    method index? (line 4) | def index?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsPolicy < UffizziCo...
    method index? (line 4) | def index?
    method show? (line 8) | def show?
    method create? (line 12) | def create?
    method update? (line 16) | def update?
    method destroy? (line 20) | def destroy?
    method deploy_containers? (line 24) | def deploy_containers?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects/secrets_policy.rb
  class UffizziCore::Api::Cli::V1::Projects::SecretsPolicy (line 3) | class UffizziCore::Api::Cli::V1::Projects::SecretsPolicy < UffizziCore::...
    method index? (line 4) | def index?
    method bulk_create? (line 8) | def bulk_create?
    method destroy? (line 12) | def destroy?

FILE: core/app/policies/uffizzi_core/api/cli/v1/projects_policy.rb
  class UffizziCore::Api::Cli::V1::ProjectsPolicy (line 3) | class UffizziCore::Api::Cli::V1::ProjectsPolicy < UffizziCore::Applicati...
    method index? (line 4) | def index?
    method show? (line 8) | def show?
    method destroy? (line 12) | def destroy?

FILE: core/app/policies/uffizzi_core/application_policy.rb
  class UffizziCore::ApplicationPolicy (line 3) | class UffizziCore::ApplicationPolicy
    method initialize (line 6) | def initialize(context, record)

FILE: core/app/repositories/uffizzi_core/account_repo.rb
  type UffizziCore::AccountRepo (line 3) | module UffizziCore::AccountRepo

FILE: core/app/repositories/uffizzi_core/activity_item_repo.rb
  type UffizziCore::ActivityItemRepo (line 3) | module UffizziCore::ActivityItemRepo

FILE: core/app/repositories/uffizzi_core/basic_order_repo.rb
  type UffizziCore::BasicOrderRepo (line 3) | module UffizziCore::BasicOrderRepo

FILE: core/app/repositories/uffizzi_core/cluster_repo.rb
  type UffizziCore::ClusterRepo (line 3) | module UffizziCore::ClusterRepo

FILE: core/app/repositories/uffizzi_core/comment_repo.rb
  type UffizziCore::CommentRepo (line 3) | module UffizziCore::CommentRepo

FILE: core/app/repositories/uffizzi_core/compose_file_repo.rb
  type UffizziCore::ComposeFileRepo (line 3) | module UffizziCore::ComposeFileRepo

FILE: core/app/repositories/uffizzi_core/config_file_repo.rb
  type UffizziCore::ConfigFileRepo (line 3) | module UffizziCore::ConfigFileRepo

FILE: core/app/repositories/uffizzi_core/container_repo.rb
  type UffizziCore::ContainerRepo (line 3) | module UffizziCore::ContainerRepo

FILE: core/app/repositories/uffizzi_core/credential_repo.rb
  type UffizziCore::CredentialRepo (line 3) | module UffizziCore::CredentialRepo

FILE: core/app/repositories/uffizzi_core/deployment_repo.rb
  type UffizziCore::DeploymentRepo (line 3) | module UffizziCore::DeploymentRepo

FILE: core/app/repositories/uffizzi_core/event_repo.rb
  type UffizziCore::EventRepo (line 3) | module UffizziCore::EventRepo

FILE: core/app/repositories/uffizzi_core/host_volume_file_repo.rb
  type UffizziCore::HostVolumeFileRepo (line 3) | module UffizziCore::HostVolumeFileRepo

FILE: core/app/repositories/uffizzi_core/membership_repo.rb
  type UffizziCore::MembershipRepo (line 3) | module UffizziCore::MembershipRepo

FILE: core/app/repositories/uffizzi_core/price_repo.rb
  type UffizziCore::PriceRepo (line 3) | module UffizziCore::PriceRepo
    function container_memory_for (line 7) | def container_memory_for(env)

FILE: core/app/repositories/uffizzi_core/product_repo.rb
  type UffizziCore::ProductRepo (line 3) | module UffizziCore::ProductRepo
    function container_memory (line 7) | def container_memory

FILE: core/app/repositories/uffizzi_core/project_repo.rb
  type UffizziCore::ProjectRepo (line 3) | module UffizziCore::ProjectRepo

FILE: core/app/repositories/uffizzi_core/repo_repo.rb
  type UffizziCore::RepoRepo (line 3) | module UffizziCore::RepoRepo

FILE: core/app/repositories/uffizzi_core/template_repo.rb
  type UffizziCore::TemplateRepo (line 3) | module UffizziCore::TemplateRepo

FILE: core/app/repositories/uffizzi_core/usage_repo.rb
  type UffizziCore::UsageRepo (line 3) | module UffizziCore::UsageRepo

FILE: core/app/repositories/uffizzi_core/user_repo.rb
  type UffizziCore::UserRepo (line 3) | module UffizziCore::UserRepo

FILE: core/app/responders/uffizzi_core/json_responder.rb
  class UffizziCore::JsonResponder (line 3) | class UffizziCore::JsonResponder < ActionController::Responder
    method api_behavior (line 4) | def api_behavior(*args, &block)

FILE: core/app/serializers/uffizzi_core/api/cli/v1/account_serializer.rb
  class UffizziCore::Api::Cli::V1::AccountSerializer (line 3) | class UffizziCore::Api::Cli::V1::AccountSerializer < UffizziCore::BaseSe...
    method api_url (line 13) | def api_url
    method vclusters_controller_url (line 17) | def vclusters_controller_url

FILE: core/app/serializers/uffizzi_core/api/cli/v1/accounts/cluster_serializer.rb
  class UffizziCore::Api::Cli::V1::Accounts::ClusterSerializer (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ClusterSerializer < UffizziCo...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/accounts/cluster_serializer/project_serializer.rb
  class UffizziCore::Api::Cli::V1::Accounts::ClusterSerializer::ProjectSerializer (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ClusterSerializer::ProjectSer...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/accounts/credential_serializer.rb
  class UffizziCore::Api::Cli::V1::Accounts::CredentialSerializer (line 3) | class UffizziCore::Api::Cli::V1::Accounts::CredentialSerializer < Uffizz...
    method password (line 6) | def password

FILE: core/app/serializers/uffizzi_core/api/cli/v1/accounts/project_serializer.rb
  class UffizziCore::Api::Cli::V1::Accounts::ProjectSerializer (line 3) | class UffizziCore::Api::Cli::V1::Accounts::ProjectSerializer < UffizziCo...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/project_serializer.rb
  class UffizziCore::Api::Cli::V1::ProjectSerializer (line 3) | class UffizziCore::Api::Cli::V1::ProjectSerializer < UffizziCore::BaseSe...
    method default_compose (line 15) | def default_compose
    method deployments (line 19) | def deployments
    method secrets (line 30) | def secrets

FILE: core/app/serializers/uffizzi_core/api/cli/v1/project_serializer/account_serializer.rb
  class UffizziCore::Api::Cli::V1::ProjectSerializer::AccountSerializer (line 3) | class UffizziCore::Api::Cli::V1::ProjectSerializer::AccountSerializer < ...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/project_serializer/compose_file_serializer.rb
  class UffizziCore::Api::Cli::V1::ProjectSerializer::ComposeFileSerializer (line 3) | class UffizziCore::Api::Cli::V1::ProjectSerializer::ComposeFileSerialize...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/project_serializer/deployment_serializer.rb
  class UffizziCore::Api::Cli::V1::ProjectSerializer::DeploymentSerializer (line 3) | class UffizziCore::Api::Cli::V1::ProjectSerializer::DeploymentSerializer...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/cluster_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::ClusterSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::ClusterSerializer < UffizziCo...
    method k8s_version (line 8) | def k8s_version

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/compose_file_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::ComposeFileSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::ComposeFileSerializer < Uffiz...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer < Uffizz...
    method containers (line 18) | def containers

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer::ContainerSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer::Contain...
    method secret_variables (line 27) | def secret_variables

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/user_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer::UserSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer::UserSer...
    method kind (line 8) | def kind

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/activity_item_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemSeri...
    method type (line 9) | def type
    method commit (line 17) | def commit
    method state (line 21) | def state

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSeriali...
    method name (line 10) | def name
    method secret_variables (line 15) | def secret_variables

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSerializer::ContainerConfigFileSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSeriali...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer/config_file_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSerializer::ContainerConfigFileSerializer::ConfigFileSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSeriali...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer < Uffiz...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer/user_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer::UserSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer::UserSe...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::SecretSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::SecretSerializer < UffizziCor...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/projects/short_cluster_serializer.rb
  class UffizziCore::Api::Cli::V1::Projects::ShortClusterSerializer (line 3) | class UffizziCore::Api::Cli::V1::Projects::ShortClusterSerializer < Uffi...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/short_project_serializer.rb
  class UffizziCore::Api::Cli::V1::ShortProjectSerializer (line 3) | class UffizziCore::Api::Cli::V1::ShortProjectSerializer < UffizziCore::B...

FILE: core/app/serializers/uffizzi_core/api/cli/v1/user_serializer.rb
  class UffizziCore::Api::Cli::V1::UserSerializer (line 3) | class UffizziCore::Api::Cli::V1::UserSerializer < UffizziCore::BaseSeria...
    method default_account (line 8) | def default_account

FILE: core/app/serializers/uffizzi_core/api/cli/v1/user_serializer/account_serializer.rb
  class UffizziCore::Api::Cli::V1::UserSerializer::AccountSerializer (line 3) | class UffizziCore::Api::Cli::V1::UserSerializer::AccountSerializer < Uff...

FILE: core/app/serializers/uffizzi_core/base_serializer.rb
  class UffizziCore::BaseSerializer (line 3) | class UffizziCore::BaseSerializer < ActiveModel::Serializer
    method anonymize (line 4) | def anonymize(field)

FILE: core/app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb
  class UffizziCore::Controller::ApplyConfigFile::ConfigFileSerializer (line 3) | class UffizziCore::Controller::ApplyConfigFile::ConfigFileSerializer < U...

FILE: core/app/serializers/uffizzi_core/controller/create_cluster/cluster_serializer.rb
  class UffizziCore::Controller::CreateCluster::ClusterSerializer (line 3) | class UffizziCore::Controller::CreateCluster::ClusterSerializer < Uffizz...
    method base_ingress_host (line 9) | def base_ingress_host
    method image (line 15) | def image
    method distro (line 19) | def distro
    method account_id (line 23) | def account_id
    method kubernetes_distribution (line 29) | def kubernetes_distribution

FILE: core/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb
  class UffizziCore::Controller::CreateCredential::CredentialSerializer (line 3) | class UffizziCore::Controller::CreateCredential::CredentialSerializer < ...
    method username (line 6) | def username
    method password (line 12) | def password

FILE: core/app/serializers/uffizzi_core/controller/create_deployment/deployment_serializer.rb
  class UffizziCore::Controller::CreateDeployment::DeploymentSerializer (line 3) | class UffizziCore::Controller::CreateDeployment::DeploymentSerializer < ...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/compose_file_serializer.rb
  class UffizziCore::Controller::DeployContainers::ComposeFileSerializer (line 3) | class UffizziCore::Controller::DeployContainers::ComposeFileSerializer <...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb
  class UffizziCore::Controller::DeployContainers::ContainerSerializer (line 3) | class UffizziCore::Controller::DeployContainers::ContainerSerializer < U...
    method entrypoint (line 26) | def entrypoint
    method command (line 30) | def command
    method healthcheck (line 34) | def healthcheck

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb
  class UffizziCore::Controller::DeployContainers::ContainerSerializer::ContainerConfigFileSerializer (line 3) | class UffizziCore::Controller::DeployContainers::ContainerSerializer::Co...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb
  class UffizziCore::Controller::DeployContainers::ContainerSerializer::ContainerConfigFileSerializer::ConfigFileSerializer (line 4) | class UffizziCore::Controller::DeployContainers::ContainerSerializer::Co...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_host_volume_file_serializer.rb
  class UffizziCore::Controller::DeployContainers::ContainerSerializer::ContainerHostVolumeFileSerializer (line 3) | class UffizziCore::Controller::DeployContainers::ContainerSerializer::Co...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/credential_serializer.rb
  class UffizziCore::Controller::DeployContainers::CredentialSerializer (line 3) | class UffizziCore::Controller::DeployContainers::CredentialSerializer < ...

FILE: core/app/serializers/uffizzi_core/controller/deploy_containers/host_volume_file_serializer.rb
  class UffizziCore::Controller::DeployContainers::HostVolumeFileSerializer (line 3) | class UffizziCore::Controller::DeployContainers::HostVolumeFileSerialize...
    method payload (line 6) | def payload

FILE: core/app/serializers/uffizzi_core/controller/update_cluster/cluster_serializer.rb
  class UffizziCore::Controller::UpdateCluster::ClusterSerializer (line 3) | class UffizziCore::Controller::UpdateCluster::ClusterSerializer < Uffizz...
    method base_ingress_host (line 9) | def base_ingress_host

FILE: core/app/services/uffizzi_core/account_service.rb
  class UffizziCore::AccountService (line 3) | class UffizziCore::AccountService
    method create_credential (line 5) | def create_credential(credential)
    method update_credential (line 11) | def update_credential(credential)
    method delete_credential (line 17) | def delete_credential(credential)

FILE: core/app/services/uffizzi_core/activity_item_service.rb
  class UffizziCore::ActivityItemService (line 3) | class UffizziCore::ActivityItemService
    method create_docker_item! (line 9) | def create_docker_item!(repo, container)
    method fail_deployment! (line 22) | def fail_deployment!(activity_item)
    method update_docker_digest! (line 31) | def update_docker_digest!(activity_item)
    method manage_deploy_activity_item (line 43) | def manage_deploy_activity_item(activity_item)
    method handle_failed_status (line 70) | def handle_failed_status(activity_item, deployment)
    method create_item! (line 75) | def create_item!(activity_item_attributes)
    method completed? (line 82) | def completed?(activity_item)
    method failed? (line 89) | def failed?(status)
    method deployed? (line 93) | def deployed?(status)

FILE: core/app/services/uffizzi_core/ci_service.rb
  class UffizziCore::CiService (line 3) | class UffizziCore::CiService
    method valid_request_from_ci_workflow? (line 5) | def valid_request_from_ci_workflow?(_params)

FILE: core/app/services/uffizzi_core/cluster_service.rb
  class UffizziCore::ClusterService (line 3) | class UffizziCore::ClusterService
    method start_deploy (line 5) | def start_deploy(cluster)
    method deploy_cluster (line 9) | def deploy_cluster(cluster)
    method scale_up! (line 27) | def scale_up!(cluster)
    method manage_scale_up (line 33) | def manage_scale_up(cluster, try)
    method scale_down! (line 40) | def scale_down!(cluster)
    method manage_scale_down (line 47) | def manage_scale_down(cluster)
    method manage_deploying (line 53) | def manage_deploying(cluster, try)
    method filter_user_ingress_host (line 71) | def filter_user_ingress_host(cluster, ingress_hosts)
    method awake? (line 77) | def awake?(cluster)
    method ready? (line 83) | def ready?(cluster)

FILE: core/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb
  class UffizziCore::ComposeFile::Builders::ContainerBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::ContainerBuilderService
    method initialize (line 6) | def initialize(credentials, project, repositories = [])
    method build_attributes (line 13) | def build_attributes(container_data, ingress_data, continuous_preview_...
    method container_registry (line 62) | def container_registry(container_data)
    method repo_attributes (line 66) | def repo_attributes(container_data, continuous_preview_global_data)
    method build_repo_attributes (line 73) | def build_repo_attributes(container_data)
    method set_continuous_preview_attributes_to_repo (line 89) | def set_continuous_preview_attributes_to_repo(repo_attributes, global_...
    method select_continuous_preview_attribute (line 109) | def select_continuous_preview_attribute(global_attribute, local_attrib...
    method tag (line 116) | def tag(image_data, repo_attributes)
    method port (line 120) | def port(container_name, ingress)
    method image (line 126) | def image(container_data, image_data, build_data, credentials)
    method image_name (line 134) | def image_name(container_data)
    method full_image_name (line 139) | def full_image_name(image_data, build_data, repo_attributes)
    method ingress_container? (line 145) | def ingress_container?(container_name, ingress)
    method entrypoint (line 149) | def entrypoint(container_data)
    method command (line 154) | def command(container_data)
    method command_args (line 159) | def command_args(command_data)
    method memory_limit (line 165) | def memory_limit(deploy_data)
    method memory_request (line 188) | def memory_request(memory)
    method continuously_deploy (line 192) | def continuously_deploy(deploy_data)
    method variables (line 198) | def variables(variables_data, dependencies)
    method secret_variables (line 202) | def secret_variables(secrets)
    method container_config_files_attributes (line 206) | def container_config_files_attributes(config_files_data, dependencies)
    method container_host_volume_files_attributes (line 210) | def container_host_volume_files_attributes(volumes_data, host_volumes_...
    method variables_builder (line 219) | def variables_builder

FILE: core/app/services/uffizzi_core/compose_file/builders/container_config_files_builder_service.rb
  class UffizziCore::ComposeFile::Builders::ContainerConfigFilesBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::ContainerConfigFilesBuilderSer...
    method build_attributes (line 5) | def build_attributes(config_files_data, dependencies, project)

FILE: core/app/services/uffizzi_core/compose_file/builders/container_host_volume_files_builder_service.rb
  class UffizziCore::ComposeFile::Builders::ContainerHostVolumeFilesBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::ContainerHostVolumeFilesBuilde...
    method build_attributes (line 5) | def build_attributes(container_host_volumes_data, host_volumes_depende...

FILE: core/app/services/uffizzi_core/compose_file/builders/docker_repo_builder_service.rb
  class UffizziCore::ComposeFile::Builders::DockerRepoBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::DockerRepoBuilderService
    method initialize (line 6) | def initialize(type)
    method build_attributes (line 10) | def build_attributes(image_data)

FILE: core/app/services/uffizzi_core/compose_file/builders/template_builder_service.rb
  class UffizziCore::ComposeFile::Builders::TemplateBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::TemplateBuilderService
    method initialize (line 6) | def initialize(credentials, project, repositories = [])
    method build_attributes (line 12) | def build_attributes(compose_data, compose_dependencies, source)
    method build_containers_attributes (line 34) | def build_containers_attributes(containers_data, ingress_data, continu...

FILE: core/app/services/uffizzi_core/compose_file/builders/variables_builder_service.rb
  class UffizziCore::ComposeFile::Builders::VariablesBuilderService (line 3) | class UffizziCore::ComposeFile::Builders::VariablesBuilderService
    method initialize (line 8) | def initialize(project)
    method build_attributes (line 12) | def build_attributes(variables_data, dependencies)
    method build_secret_attributes (line 19) | def build_secret_attributes(secrets)
    method variables_from_dependencies (line 33) | def variables_from_dependencies(dependencies)
    method parse_variables_from_dependency (line 43) | def parse_variables_from_dependency(dependency)
    method build_variable (line 52) | def build_variable(name, value)

FILE: core/app/services/uffizzi_core/compose_file/config_files_service.rb
  class UffizziCore::ComposeFile::ConfigFilesService (line 3) | class UffizziCore::ComposeFile::ConfigFilesService
    method initialize (line 4) | def initialize(compose_file_form)
    method create_config_files (line 13) | def create_config_files(compose_dependencies)
    method create_config_file (line 26) | def create_config_file(config_dependency)
    method build_config_file_form (line 43) | def build_config_file_form(config_file)

FILE: core/app/services/uffizzi_core/compose_file/config_option_service.rb
  class UffizziCore::ComposeFile::ConfigOptionService (line 3) | class UffizziCore::ComposeFile::ConfigOptionService
    method valid_option_format? (line 5) | def valid_option_format?(option)
    method config_options (line 13) | def config_options(compose_data)
    method prepare_file_path_value (line 24) | def prepare_file_path_value(file_path)
    method ingress_option (line 30) | def ingress_option(compose_data)
    method continuous_preview_option (line 34) | def continuous_preview_option(compose_data)

FILE: core/app/services/uffizzi_core/compose_file/container_service.rb
  class UffizziCore::ComposeFile::ContainerService (line 3) | class UffizziCore::ComposeFile::ContainerService
    method has_secret? (line 5) | def has_secret?(container, secret)
    method update_secret (line 9) | def update_secret(container, secret)

FILE: core/app/services/uffizzi_core/compose_file/dependencies_service.rb
  class UffizziCore::ComposeFile::DependenciesService (line 3) | class UffizziCore::ComposeFile::DependenciesService
    method build_dependencies (line 11) | def build_dependencies(compose_data, compose_path, dependencies_params)
    method build_env_files_dependencies (line 26) | def build_env_files_dependencies(container, compose_path, dependencies...
    method build_configs_dependencies (line 38) | def build_configs_dependencies(container, compose_path, dependencies_p...
    method build_volumes_dependencies (line 50) | def build_volumes_dependencies(container, compose_path, raw_dependencies)
    method base_file_params (line 72) | def base_file_params(dependency, container)
    method build_source_path (line 80) | def build_source_path(compose_path, dependency_path)
    method host_volume_binary_content (line 85) | def host_volume_binary_content(dependency)

FILE: core/app/services/uffizzi_core/compose_file/errors_service.rb
  class UffizziCore::ComposeFile::ErrorsService (line 3) | class UffizziCore::ComposeFile::ErrorsService
    method has_error? (line 9) | def has_error?(compose_file, error_code)
    method has_errors? (line 15) | def has_errors?(compose_file)
    method update_compose_errors! (line 19) | def update_compose_errors!(compose_file, errors, invalid_content)
    method reset_compose_errors! (line 29) | def reset_compose_errors!(compose_file)
    method reset_error! (line 38) | def reset_error!(compose_file, error_code)
    method raise_build_error! (line 49) | def raise_build_error!(type, extra_errors = {})

FILE: core/app/services/uffizzi_core/compose_file/github_dependencies_service.rb
  class UffizziCore::ComposeFile::GithubDependenciesService (line 3) | class UffizziCore::ComposeFile::GithubDependenciesService
    method filename (line 9) | def filename(dependency)
    method content (line 15) | def content(dependency)
    method env_file_dependencies_for_container (line 19) | def env_file_dependencies_for_container(dependencies, container_name)
    method configs_dependencies_for_container (line 23) | def configs_dependencies_for_container(dependencies, container_name)
    method host_volumes_dependencies_for_container (line 27) | def host_volumes_dependencies_for_container(dependencies, container_name)
    method configs_dependencies (line 31) | def configs_dependencies(dependencies)
    method select_dependencies_by_type (line 35) | def select_dependencies_by_type(dependencies, type)
    method build_source_path (line 39) | def build_source_path(compose_path, dependency_path, repository_id, br...

FILE: core/app/services/uffizzi_core/compose_file/host_volume_files_service.rb
  class UffizziCore::ComposeFile::HostVolumeFilesService (line 3) | class UffizziCore::ComposeFile::HostVolumeFilesService
    method bulk_create (line 5) | def bulk_create(compose_file_form, compose_dependencies)
    method create (line 18) | def create(compose_file_form, volume_dependency)

FILE: core/app/services/uffizzi_core/compose_file/parsers/configs_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::ConfigsParserService (line 3) | class UffizziCore::ComposeFile::Parsers::ConfigsParserService
    method parse (line 5) | def parse(configs_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/continuous_preview_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::ContinuousPreviewParserService (line 3) | class UffizziCore::ComposeFile::Parsers::ContinuousPreviewParserService
    method parse (line 5) | def parse(continuous_preview_data)
    method trigger_value (line 20) | def trigger_value(continuous_preview_data, field)
    method delete_preview_after_value (line 28) | def delete_preview_after_value(value)

FILE: core/app/services/uffizzi_core/compose_file/parsers/ingress_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::IngressParserService (line 3) | class UffizziCore::ComposeFile::Parsers::IngressParserService
    method parse (line 5) | def parse(ingress_data, services_data)
    method container_name (line 20) | def container_name(ingress_data, services_data)
    method port (line 34) | def port(ingress_data)
    method build_additional_attributes (line 52) | def build_additional_attributes(*)

FILE: core/app/services/uffizzi_core/compose_file/parsers/named_volumes_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::NamedVolumesParserService (line 3) | class UffizziCore::ComposeFile::Parsers::NamedVolumesParserService
    method parse (line 7) | def parse(volumes_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/secrets_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::SecretsParserService (line 3) | class UffizziCore::ComposeFile::Parsers::SecretsParserService
    method parse (line 5) | def parse(secrets_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/command_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::CommandParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::CommandParserService
    method parse (line 5) | def parse(command_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/configs_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::ConfigsParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::ConfigsParserService
    method parse (line 5) | def parse(configs, global_configs_data)
    method process_short_syntax (line 24) | def process_short_syntax(config_name, global_configs_data)
    method process_long_syntax (line 33) | def process_long_syntax(config_data, global_configs_data)
    method find_global_config! (line 43) | def find_global_config!(config_name, global_configs_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/deploy_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::DeployParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::DeployParserService
    method parse (line 5) | def parse(deploy_data)
    method prepare_deploy_auto (line 19) | def prepare_deploy_auto(deploy_data)
    method prepare_memory (line 26) | def prepare_memory(deploy_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/entrypoint_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::EntrypointParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::EntrypointParserService
    method parse (line 5) | def parse(entrypoint_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/env_file_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::EnvFileParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::EnvFileParserService
    method parse (line 5) | def parse(env_file)
    method prepare_file_path (line 22) | def prepare_file_path(env_file_path)
    method check_duplicates (line 28) | def check_duplicates(env_files)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/environment_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::EnvironmentParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::EnvironmentParserService
    method parse (line 7) | def parse(environment)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/healthcheck_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::HealthcheckParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::HealthcheckParserService
    method parse (line 8) | def parse(healthcheck_data)
    method parse_command (line 31) | def parse_command(healthcheck_data)
    method parse_retries (line 52) | def parse_retries(value)
    method parse_time (line 63) | def parse_time(key, value)
    method parse_disable_option (line 88) | def parse_disable_option(value, command)
    method required_options_any? (line 96) | def required_options_any?(healthcheck_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/image_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::ImageParserService (line 5) | class UffizziCore::ComposeFile::Parsers::Services::ImageParserService
    method parse (line 8) | def parse(value)
    method raise_parse_error (line 31) | def raise_parse_error(message)
    method get_namespace_and_name (line 35) | def get_namespace_and_name(image_path)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/secrets_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::SecretsParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::SecretsParserService
    method parse (line 5) | def parse(secrets, global_secrets_data)
    method process_short_syntax (line 21) | def process_short_syntax(secret_name, global_secrets_data)
    method find_global_secret! (line 27) | def find_global_secret!(secret_name, global_secrets_data)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services/volumes_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService (line 3) | class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
    method parse (line 11) | def parse(volumes, additional_data)
    method process_short_syntax (line 34) | def process_short_syntax(volume_data, additional_data)
    method process_long_syntax (line 46) | def process_long_syntax(volume_data, additional_data)
    method build_volume_attributes (line 57) | def build_volume_attributes(source_path, target_path, read_only, param...
    method build_volume_type (line 76) | def build_volume_type(source_path, target_path)
    method path? (line 84) | def path?(path)
    method validate_named_volume (line 88) | def validate_named_volume(source_path, target_path, named_volumes_name...
    method validate_anonymous_volume (line 100) | def validate_anonymous_volume(path)
    method path_has_only_root? (line 106) | def path_has_only_root?(path)

FILE: core/app/services/uffizzi_core/compose_file/parsers/services_parser_service.rb
  class UffizziCore::ComposeFile::Parsers::ServicesParserService (line 3) | class UffizziCore::ComposeFile::Parsers::ServicesParserService
    method parse (line 7) | def parse(services, global_configs_data, global_secrets_data, compose_...
    method prepare_service_data (line 29) | def prepare_service_data(service_name, service_data, global_configs_data,
    method check_and_parse_build_option (line 70) | def check_and_parse_build_option(value, compose_payload)
    method parse_volumes (line 78) | def parse_volumes(volumes, additional_data)
    method valid_service_name? (line 87) | def valid_service_name?(name)

FILE: core/app/services/uffizzi_core/compose_file/parsers/variables_parser_service.rb
  type UffizziCore::ComposeFile::Parsers::VariablesParserService (line 3) | module UffizziCore::ComposeFile::Parsers::VariablesParserService
    function parse_variable_from_string (line 4) | def parse_variable_from_string(str)
    function parse_variable_from_array (line 10) | def parse_variable_from_array(arr)
    function build_variable (line 17) | def build_variable(name, value)

FILE: core/app/services/uffizzi_core/compose_file/template_service.rb
  class UffizziCore::ComposeFile::TemplateService (line 3) | class UffizziCore::ComposeFile::TemplateService
    method initialize (line 4) | def initialize(cli_form, project, user)
    method create_template (line 12) | def create_template(compose_file_form)
    method build_compose_file_template_form (line 26) | def build_compose_file_template_form(compose_file_form)
    method build_template_form (line 41) | def build_template_form(compose_file_form, compose_file_template_form)

FILE: core/app/services/uffizzi_core/compose_file_service.rb
  class UffizziCore::ComposeFileService (line 3) | class UffizziCore::ComposeFileService
    method create (line 7) | def create(params, kind)
    method update (line 13) | def update(compose_file, params)
    method parse (line 19) | def parse(compose_content, compose_payload = {})
    method parse_ingress (line 45) | def parse_ingress(ingress_option, compose_data)
    method build_template_attributes (line 56) | def build_template_attributes(compose_data, source, credentials, proje...
    method has_secret? (line 62) | def has_secret?(compose_file, secret)
    method update_secret! (line 68) | def update_secret!(compose_file, secret)
    method secrets_valid? (line 97) | def secrets_valid?(compose_file, secrets)
    method create_temporary_compose (line 105) | def create_temporary_compose(resource_project, current_user, compose_f...
    method process_compose_file (line 114) | def process_compose_file(compose_file_form, params)
    method create_compose_form (line 128) | def create_compose_form(params, kind)
    method create_update_compose_form (line 141) | def create_update_compose_form(compose_file, params)
    method build_compose_dependecies (line 151) | def build_compose_dependecies(compose_data, compose_path, dependencies)
    method prepare_compose_file_dependencies (line 157) | def prepare_compose_file_dependencies(compose_dependencies)
    method persist! (line 161) | def persist!(compose_file_form, cli_form)
    method load_compose_data (line 186) | def load_compose_data(compose_content)
    method check_config_options_format (line 198) | def check_config_options_format(compose_data)

FILE: core/app/services/uffizzi_core/container_registry/amazon_service.rb
  class UffizziCore::ContainerRegistry::AmazonService (line 3) | class UffizziCore::ContainerRegistry::AmazonService
    method digest (line 5) | def digest(credential, image, tag)
    method get_region_from_registry_url (line 12) | def get_region_from_registry_url(url)
    method image_available? (line 19) | def image_available?(credential, _image_data)
    method credential_correct? (line 23) | def credential_correct?(credential)
    method access_token (line 27) | def access_token(credential)
    method client (line 39) | def client(credential)

FILE: core/app/services/uffizzi_core/container_registry/azure_service.rb
  class UffizziCore::ContainerRegistry::AzureService (line 3) | class UffizziCore::ContainerRegistry::AzureService
    method image_available? (line 5) | def image_available?(credential, _image_data)
    method credential_correct? (line 9) | def credential_correct?(credential)
    method digest (line 13) | def digest(*); end
    method client (line 17) | def client(c)

FILE: core/app/services/uffizzi_core/container_registry/docker_hub_service.rb
  class UffizziCore::ContainerRegistry::DockerHubService (line 3) | class UffizziCore::ContainerRegistry::DockerHubService
    method accounts (line 5) | def accounts(credential)
    method image_available? (line 14) | def image_available?(credential, image_data)
    method user_client (line 22) | def user_client(credential)
    method digest (line 35) | def digest(credential, image, tag)
    method credential_correct? (line 45) | def credential_correct?(credential)
    method client (line 51) | def client(credential)

FILE: core/app/services/uffizzi_core/container_registry/docker_registry_service.rb
  class UffizziCore::ContainerRegistry::DockerRegistryService (line 3) | class UffizziCore::ContainerRegistry::DockerRegistryService
    method image_available? (line 5) | def image_available?(credential, image_data)
    method credential_correct? (line 13) | def credential_correct?(credential)
    method digest (line 17) | def digest(*); end
    method client (line 21) | def client(credential)
    method build_client_params (line 31) | def build_client_params(credential, image_data)

FILE: core/app/services/uffizzi_core/container_registry/github_container_registry_service.rb
  class UffizziCore::ContainerRegistry::GithubContainerRegistryService (line 3) | class UffizziCore::ContainerRegistry::GithubContainerRegistryService
    method image_available? (line 5) | def image_available?(credential, _image_data)
    method credential_correct? (line 9) | def credential_correct?(credential)
    method digest (line 13) | def digest(*); end
    method client (line 17) | def client(c)

FILE: core/app/services/uffizzi_core/container_registry/google_service.rb
  class UffizziCore::ContainerRegistry::GoogleService (line 3) | class UffizziCore::ContainerRegistry::GoogleService
    method digest (line 5) | def digest(credential, image, tag)
    method image_available? (line 11) | def image_available?(credential, _image_data)
    method credential_correct? (line 15) | def credential_correct?(credential)
    method client (line 21) | def client(c)

FILE: core/app/services/uffizzi_core/container_registry_service.rb
  class UffizziCore::ContainerRegistryService (line 3) | class UffizziCore::ContainerRegistryService
    method init_by_subclass (line 7) | def init_by_subclass(credential_type)
    method init_by_container (line 12) | def init_by_container(container, credentials)
    method init_by_credentials (line 23) | def init_by_credentials(container, credentials)
    method docker_registry? (line 29) | def docker_registry?(container)
    method sources (line 40) | def sources
    method additional_sources (line 44) | def additional_sources
    method initialize (line 49) | def initialize(type, container_data = {})
    method digest (line 56) | def digest(credential, image, tag)
    method service (line 60) | def service
    method repo_type (line 64) | def repo_type
    method credential_correct? (line 68) | def credential_correct?(credential)
    method image_data (line 74) | def image_data
    method image_name (line 78) | def image_name(credentials)
    method credential (line 90) | def credential(credentials_scope)
    method image_available? (line 94) | def image_available?(credentials_scope)

FILE: core/app/services/uffizzi_core/container_service.rb
  class UffizziCore::ContainerService (line 3) | class UffizziCore::ContainerService
    method pod_name (line 5) | def pod_name(container)
    method target_port_value (line 12) | def target_port_value(container)
    method defines_env? (line 16) | def defines_env?(container, name)
    method continuously_deploy_enabled? (line 22) | def continuously_deploy_enabled?(container)
    method last_state (line 26) | def last_state(container)
    method ingress_container? (line 42) | def ingress_container?(container)
    method container_status (line 48) | def container_status(container, pods)
    method pods_by_container (line 55) | def pods_by_container(container)

FILE: core/app/services/uffizzi_core/controller_service.rb
  class UffizziCore::ControllerService (line 3) | class UffizziCore::ControllerService
    class InvalidPublicPort (line 4) | class InvalidPublicPort < StandardError
      method initialize (line 5) | def initialize(containers)
    method apply_config_file (line 15) | def apply_config_file(deployment, config_file)
    method apply_credential (line 23) | def apply_credential(deployment, credential)
    method delete_credential (line 34) | def delete_credential(deployment, credential)
    method deploy_containers (line 38) | def deploy_containers(deployment, containers)
    method namespace_exists? (line 74) | def namespace_exists?(deployable)
    method fetch_deployment_events (line 78) | def fetch_deployment_events(deployment)
    method fetch_pods (line 82) | def fetch_pods(deployment)
    method fetch_namespace (line 87) | def fetch_namespace(deployable)
    method create_namespace (line 91) | def create_namespace(deployable)
    method delete_namespace (line 96) | def delete_namespace(deployable)
    method create_cluster (line 100) | def create_cluster(cluster)
    method show_cluster (line 105) | def show_cluster(cluster)
    method delete_cluster (line 109) | def delete_cluster(cluster)
    method patch_cluster (line 113) | def patch_cluster(cluster, sleep:)
    method ingress_hosts (line 120) | def ingress_hosts(cluster)
    method check_any_container_has_public_port (line 132) | def check_any_container_has_public_port(containers)
    method request_events (line 141) | def request_events(deployment)
    method controller_client (line 145) | def controller_client(deployable)

FILE: core/app/services/uffizzi_core/controller_settings_service.rb
  class UffizziCore::ControllerSettingsService (line 3) | class UffizziCore::ControllerSettingsService
    method vcluster_settings_by_vcluster (line 5) | def vcluster_settings_by_vcluster(_cluster)
    method vcluster_settings_by_account (line 9) | def vcluster_settings_by_account(_account)
    method deployment_settings_by_deployment (line 13) | def deployment_settings_by_deployment(_deployment)

FILE: core/app/services/uffizzi_core/deployment/domain_service.rb
  class UffizziCore::Deployment::DomainService (line 3) | class UffizziCore::Deployment::DomainService
    method build_subdomain (line 7) | def build_subdomain(deployment)
    method update_subdomain! (line 14) | def update_subdomain!(deployment)
    method build_docker_continuous_preview_subdomain (line 21) | def build_docker_continuous_preview_subdomain(deployment)
    method build_default_subdomain (line 33) | def build_default_subdomain(deployment)
    method name (line 41) | def name(deployment)
    method format_subdomain (line 45) | def format_subdomain(full_subdomain_name)
    method format_url_safe (line 58) | def format_url_safe(name)

FILE: core/app/services/uffizzi_core/deployment/memory_service.rb
  class UffizziCore::Deployment::MemoryService (line 3) | class UffizziCore::Deployment::MemoryService
    method valid_memory_limit? (line 5) | def valid_memory_limit?(_deployment)
    method memory_limit_error_message (line 9) | def memory_limit_error_message(_deployment); end

FILE: core/app/services/uffizzi_core/deployment_service.rb
  class UffizziCore::DeploymentService (line 3) | class UffizziCore::DeploymentService
    method create_from_compose (line 20) | def create_from_compose(compose_file, project, user, params)
    method update_from_compose (line 33) | def update_from_compose(compose_file, project, user, deployment, metad...
    method deploy_containers (line 52) | def deploy_containers(deployment, repeated = false)
    method disable! (line 80) | def disable!(deployment)
    method fail! (line 88) | def fail!(deployment)
    method all_containers_have_unique_ports? (line 99) | def all_containers_have_unique_ports?(containers)
    method ingress_container? (line 104) | def ingress_container?(containers)
    method find_unused_port (line 108) | def find_unused_port(deployment)
    method setup_ingress_container (line 122) | def setup_ingress_container(deployment, ingress_container, port)
    method pull_request_payload_present? (line 143) | def pull_request_payload_present?(deployment)
    method failed? (line 147) | def failed?(deployment)
    method run_deployment_creation_tasks (line 155) | def run_deployment_creation_tasks(deployment)
    method deployment_process_status (line 161) | def deployment_process_status(deployment)
    method create_activity_items (line 174) | def create_activity_items(deployment)
    method create_default_activity_item_event (line 188) | def create_default_activity_item_event(activity_item)
    method update_controller_container_names (line 192) | def update_controller_container_names(deployment)
    method generate_controller_container_name (line 201) | def generate_controller_container_name(container)
    method add_default_deployment_variables! (line 205) | def add_default_deployment_variables!(containers, deployment)
    method params_for_update_deployment (line 224) | def params_for_update_deployment(deployment_form, compose_file)

FILE: core/app/services/uffizzi_core/logs_service.rb
  class UffizziCore::LogsService (line 3) | class UffizziCore::LogsService
    method fetch_container_logs (line 8) | def fetch_container_logs(container, query = {})
    method request_logs (line 20) | def request_logs(container, query)
    method format_logs (line 31) | def format_logs(logs)
    method controller_client (line 39) | def controller_client

FILE: core/app/services/uffizzi_core/manage_activity_items_service.rb
  class UffizziCore::ManageActivityItemsService (line 3) | class UffizziCore::ManageActivityItemsService
    method initialize (line 6) | def initialize(deployment)
    method container_status_item (line 13) | def container_status_item(container)
    method container_status_items (line 17) | def container_status_items
    method build_network_connectivities (line 23) | def build_network_connectivities
    method build_container_network_connectivity_items (line 29) | def build_container_network_connectivity_items(container)
    method build_containers_replicas (line 40) | def build_containers_replicas
    method build_container_status_items (line 53) | def build_container_status_items(network_connectivities, containers_re...
    method replicas_contains_status? (line 65) | def replicas_contains_status?(replicas, status)
    method build_container_status (line 69) | def build_container_status(container, network_connectivity, container_...
    method container_status (line 84) | def container_status(error, deployed)
    method item_name (line 91) | def item_name(pod, container)
    method get_status (line 96) | def get_status(pod, container)
    method pod_container (line 117) | def pod_container(pod, container)
    method container_network_connectivities (line 123) | def container_network_connectivities(container)
    method deployment_network_connectivity (line 130) | def deployment_network_connectivity

FILE: core/app/services/uffizzi_core/project_service.rb
  class UffizziCore::ProjectService (line 3) | class UffizziCore::ProjectService
    method update_compose_secrets (line 5) | def update_compose_secrets(project)
    method update_compose_secret_errors (line 24) | def update_compose_secret_errors(project, secret)
    method add_users_to_project! (line 39) | def add_users_to_project!(project, account)

FILE: core/app/services/uffizzi_core/repo_service.rb
  class UffizziCore::RepoService (line 3) | class UffizziCore::RepoService
    method needs_target_port? (line 5) | def needs_target_port?(repo)
    method credential (line 11) | def credential(repo)
    method image_name (line 17) | def image_name(repo)
    method image (line 22) | def image(repo)

FILE: core/app/services/uffizzi_core/response_service.rb
  type UffizziCore::ResponseService (line 3) | module UffizziCore::ResponseService
    function meta (line 4) | def meta(collection)

FILE: core/app/services/uffizzi_core/template/memory_service.rb
  class UffizziCore::Template::MemoryService (line 3) | class UffizziCore::Template::MemoryService
    method valid_memory_limit? (line 5) | def valid_memory_limit?(_template)
    method memory_limit_error_message (line 9) | def memory_limit_error_message(_template); end

FILE: core/app/services/uffizzi_core/token_service.rb
  type UffizziCore::TokenService (line 3) | module UffizziCore::TokenService
    function encode (line 5) | def encode(payload)
    function decode (line 9) | def decode(token)
    function generate (line 15) | def generate

FILE: core/app/services/uffizzi_core/user_access_service.rb
  class UffizziCore::UserAccessService (line 3) | class UffizziCore::UserAccessService
    method initialize (line 11) | def initialize(user_access_module)

FILE: core/app/services/uffizzi_core/user_generator_service.rb
  class UffizziCore::UserGeneratorService (line 3) | class UffizziCore::UserGeneratorService
    method safe_generate (line 9) | def safe_generate(email, password, project_name)
    method generate (line 15) | def generate(email, password, project_name)
    method build_user_attributes (line 32) | def build_user_attributes(email, password)
    method build_project_attributes (line 54) | def build_project_attributes(project_name)
    method build_account_attributes (line 71) | def build_account_attributes(user)
    method prepare_project_slug (line 80) | def prepare_project_slug(project_name)

FILE: core/app/utils/uffizzi_core/converters.rb
  type UffizziCore::Converters (line 3) | module UffizziCore::Converters
    function deep_lower_camelize_keys (line 7) | def deep_lower_camelize_keys(object)
    function deep_underscore_keys (line 20) | def deep_underscore_keys(object)

FILE: core/app/validators/uffizzi_core/email_validator.rb
  class UffizziCore::EmailValidator (line 3) | class UffizziCore::EmailValidator < ActiveModel::EachValidator
    method validate_each (line 6) | def validate_each(record, attribute, value)

FILE: core/app/validators/uffizzi_core/environment_variable_list_validator.rb
  class UffizziCore::EnvironmentVariableListValidator (line 3) | class UffizziCore::EnvironmentVariableListValidator < ActiveModel::EachV...
    method validate_each (line 4) | def validate_each(record, attribute, variables)
    method valid_variables? (line 8) | def valid_variables?(variables)

FILE: core/app/validators/uffizzi_core/image_command_args_validator.rb
  class UffizziCore::ImageCommandArgsValidator (line 3) | class UffizziCore::ImageCommandArgsValidator < ActiveModel::EachValidator
    method validate_each (line 4) | def validate_each(record, attribute, command_args)
    method valid_command_args? (line 8) | def valid_command_args?(raw_command_args)

FILE: core/db/migrate/20220218121438_create_uffizzi_core_tables.rb
  class CreateUffizziCoreTables (line 3) | class CreateUffizziCoreTables < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220309110201_remove_secrets_from_projects.rb
  class RemoveSecretsFromProjects (line 3) | class RemoveSecretsFromProjects < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220310110150_create_project_secrets.rb
  class CreateProjectSecrets (line 3) | class CreateProjectSecrets < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220325113342_add_name_to_uffizzi_containers.rb
  class AddNameToUffizziContainers (line 3) | class AddNameToUffizziContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220329123323_rename_project_secrets_to_secrets.rb
  class RenameProjectSecretsToSecrets (line 3) | class RenameProjectSecretsToSecrets < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220329124542_add_resource_to_secrets.rb
  class AddResourceToSecrets (line 3) | class AddResourceToSecrets < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220329143241_remove_project_ref_from_secrets.rb
  class RemoveProjectRefFromSecrets (line 3) | class RemoveProjectRefFromSecrets < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220419074956_add_health_check_to_containers.rb
  class AddHealthCheckToContainers (line 3) | class AddHealthCheckToContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220422151523_add_volumes_to_uffizzi_core_containers.rb
  class AddVolumesToUffizziCoreContainers (line 3) | class AddVolumesToUffizziCoreContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220525113412_rename_name_to_uffizzi_containers.rb
  class RenameNameToUffizziContainers (line 3) | class RenameNameToUffizziContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220704135629_add_disabled_at_to_deployments.rb
  class AddDisabledAtToDeployments (line 3) | class AddDisabledAtToDeployments < ActiveRecord::Migration[6.1]
    method up (line 4) | def up
    method down (line 11) | def down

FILE: core/db/migrate/20220805164628_add_metadata_to_deployment.rb
  class AddMetadataToDeployment (line 3) | class AddMetadataToDeployment < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220901110752_create_host_volume_files.rb
  class CreateHostVolumeFiles (line 3) | class CreateHostVolumeFiles < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220901165313_create_container_host_volume_files.rb
  class CreateContainerHostVolumeFiles (line 3) | class CreateContainerHostVolumeFiles < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20220927113647_add_additional_subdomains_to_containers.rb
  class AddAdditionalSubdomainsToContainers (line 3) | class AddAdditionalSubdomainsToContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230111000000_add_state_to_memberships.rb
  class AddStateToMemberships (line 3) | class AddStateToMemberships < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230306142513_add_last_deploy_at_to_deployments.rb
  class AddLastDeployAtToDeployments (line 3) | class AddLastDeployAtToDeployments < ActiveRecord::Migration[6.1]
    method up (line 4) | def up
    method down (line 10) | def down

FILE: core/db/migrate/20230406154451_add_full_image_name_to_container.rb
  class AddFullImageNameToContainer (line 3) | class AddFullImageNameToContainer < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230531135739_create_deployment_events.rb
  class CreateDeploymentEvents (line 3) | class CreateDeploymentEvents < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230613101901_create_clusters.rb
  class CreateClusters (line 3) | class CreateClusters < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230711101901_add_host_to_clusters.rb
  class AddHostToClusters (line 3) | class AddHostToClusters < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230810140316_add_source_to_uffizzi_core_clusters.rb
  class AddSourceToUffizziCoreClusters (line 3) | class AddSourceToUffizziCoreClusters < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20230824150022_update_name_constraint_to_projects.rb
  class UpdateNameConstraintToProjects (line 3) | class UpdateNameConstraintToProjects < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20231009162719_create_uffizzi_core_kubernetes_distributions.rb
  class CreateUffizziCoreKubernetesDistributions (line 3) | class CreateUffizziCoreKubernetesDistributions < ActiveRecord::Migration...
    method change (line 4) | def change

FILE: core/db/migrate/20231009182412_add_kubernetes_distribution_id_to_uffizzi_core_clusters.rb
  class AddKubernetesDistributionIdToUffizziCoreClusters (line 3) | class AddKubernetesDistributionIdToUffizziCoreClusters < ActiveRecord::M...
    method change (line 4) | def change

FILE: core/db/migrate/20240301200235_add_node_selector_to_cluster.rb
  class AddNodeSelectorToCluster (line 3) | class AddNodeSelectorToCluster < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/db/migrate/20240314170113_delete_node_selector_from_cluster.rb
  class DeleteNodeSelectorFromCluster (line 3) | class DeleteNodeSelectorFromCluster < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: core/lib/uffizzi_core.rb
  type UffizziCore (line 30) | module UffizziCore

FILE: core/lib/uffizzi_core/engine.rb
  type UffizziCore (line 5) | module UffizziCore
    class Engine (line 6) | class Engine < ::Rails::Engine

FILE: core/lib/uffizzi_core/version.rb
  type UffizziCore (line 3) | module UffizziCore

FILE: core/test/controllers/uffizzi_core/api/cli/v1/accounts/clusters_controller_test.rb
  class UffizziCore::Api::Cli::V1::Accounts::ClustersControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Accounts::ClustersControllerTest < Acti...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/accounts/credentials_controller_test.rb
  class UffizziCore::Api::Cli::V1::Accounts::CredentialsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Accounts::CredentialsControllerTest < A...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/accounts/projects_controller_test.rb
  class UffizziCore::Api::Cli::V1::Accounts::ProjectsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Accounts::ProjectsControllerTest < Acti...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/accounts_controller_test.rb
  class UffizziCore::Api::Cli::V1::AccountsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::AccountsControllerTest < ActionControll...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/clusters/ingresses_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesController...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/clusters_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::ClustersControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::ClustersControllerTest < Acti...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::ComposeFilesControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::ComposeFilesControllerTest < ...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsCon...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::LogsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::Logs...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersContro...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsController...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller/create_test.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest < A...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller/deploy_containers_test.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest < A...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller/destroy_test.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest < A...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller/update_test.rb
  class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerTest < A...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller_test.rb
  class UffizziCore::Api::Cli::V1::Projects::SecretsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::Projects::SecretsControllerTest < Actio...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/projects_controller_test.rb
  class UffizziCore::Api::Cli::V1::ProjectsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::ProjectsControllerTest < ActionControll...

FILE: core/test/controllers/uffizzi_core/api/cli/v1/sessions_controller_test.rb
  class UffizziCore::Api::Cli::V1::SessionsControllerTest (line 5) | class UffizziCore::Api::Cli::V1::SessionsControllerTest < ActionControll...

FILE: core/test/dummy/app/channels/application_cable/channel.rb
  type ApplicationCable (line 3) | module ApplicationCable
    class Channel (line 4) | class Channel < ActionCable::Channel::Base

FILE: core/test/dummy/app/channels/application_cable/connection.rb
  type ApplicationCable (line 3) | module ApplicationCable
    class Connection (line 4) | class Connection < ActionCable::Connection::Base

FILE: core/test/dummy/app/controllers/application_controller.rb
  class ApplicationController (line 3) | class ApplicationController < ActionController::Base

FILE: core/test/dummy/app/helpers/application_helper.rb
  type ApplicationHelper (line 3) | module ApplicationHelper

FILE: core/test/dummy/app/jobs/application_job.rb
  class ApplicationJob (line 3) | class ApplicationJob < ActiveJob::Base

FILE: core/test/dummy/app/mailers/application_mailer.rb
  class ApplicationMailer (line 3) | class ApplicationMailer < ActionMailer::Base

FILE: core/test/dummy/app/models/application_record.rb
  class ApplicationRecord (line 3) | class ApplicationRecord < ActiveRecord::Base

FILE: core/test/dummy/config/application.rb
  type Dummy (line 14) | module Dummy
    class Application (line 15) | class Application < Rails::Application

FILE: core/test/dummy/config/initializers/octokit.rb
  type Octokit (line 3) | module Octokit
    class Client (line 4) | class Client
      type Contents (line 5) | module Contents
        function contents? (line 6) | def contents?(repo, options = {})

FILE: core/test/services/activity_item_service_test.rb
  class UffizziCore::ActivityItemServiceTest (line 5) | class UffizziCore::ActivityItemServiceTest < ActiveSupport::TestCase

FILE: core/test/services/compose_file_service_test.rb
  class UffizziCore::ComposeFileServiceTest (line 5) | class UffizziCore::ComposeFileServiceTest < ActiveSupport::TestCase

FILE: core/test/services/deployment_service_test.rb
  class UffizziCore::DeploymentServiceTest (line 5) | class UffizziCore::DeploymentServiceTest < ActiveSupport::TestCase

FILE: core/test/services/google_service_test.rb
  class UffizziCore::GoogleServiceTest (line 5) | class UffizziCore::GoogleServiceTest < ActiveSupport::TestCase

FILE: core/test/services/image_parser_service_test.rb
  class UffizziCore::ImageParserServiceTest (line 5) | class UffizziCore::ImageParserServiceTest < ActiveSupport::TestCase

FILE: core/test/services/manage_activity_items_service_test.rb
  class UffizziCore::ManageActivityItemsServiceTest (line 5) | class UffizziCore::ManageActivityItemsServiceTest < ActiveSupport::TestCase

FILE: core/test/services/user_generator_service_test.rb
  class UffizziCore::UserGeneratorServiceTest (line 5) | class UffizziCore::UserGeneratorServiceTest < ActiveSupport::TestCase

FILE: core/test/support/azure_registry_stub_support.rb
  type UffizziCore::AzureRegistryStubSupport (line 3) | module UffizziCore::AzureRegistryStubSupport
    function stub_azure_registry_oauth2_token (line 4) | def stub_azure_registry_oauth2_token(registry_url, response, code = 200)
    function stub_azure_registry_manifests (line 11) | def stub_azure_registry_manifests(registry_url, image, tag, headers, b...

FILE: core/test/support/controller_stub_support.rb
  type UffizziCore::ControllerStubSupport (line 3) | module UffizziCore::ControllerStubSupport
    function stub_controller_apply_credential (line 4) | def stub_controller_apply_credential
    function stub_put_controller_deployment_request (line 10) | def stub_put_controller_deployment_request(deployment)
    function stub_controller_get_namespace_request (line 16) | def stub_controller_get_namespace_request(deployable, data = nil)
    function stub_controller_get_namespace_request_any (line 22) | def stub_controller_get_namespace_request_any(data = nil)
    function stub_delete_namespace_request (line 28) | def stub_delete_namespace_request(deployable)
    function stub_controller_containers_request (line 34) | def stub_controller_containers_request(deployment, data = nil)
    function stub_controller_nodes_request (line 40) | def stub_controller_nodes_request
    function stub_deploy_containers_request (line 46) | def stub_deploy_containers_request(deployment)
    function stub_apply_config_file_request (line 52) | def stub_apply_config_file_request(deployment, config_file)
    function stub_apply_config_file_request_with_expected (line 58) | def stub_apply_config_file_request_with_expected(deployment, config_fi...
    function stub_controller_get_deployment_events (line 73) | def stub_controller_get_deployment_events(deployment, body)
    function stub_container_log_request (line 79) | def stub_container_log_request(deployment_id, pod_name, limit, previou...
    function stub_deploy_containers_request_with_expected (line 85) | def stub_deploy_containers_request_with_expected(deployment, expected_...
    function stub_create_namespace_request (line 100) | def stub_create_namespace_request
    function stub_get_cluster_request (line 107) | def stub_get_cluster_request(data = {}, _status = 200)
    function stub_create_cluster_request (line 113) | def stub_create_cluster_request(data = {}, status = 200)
    function stub_scale_cluster_request (line 119) | def stub_scale_cluster_request(status = 200)
    function stub_create_cluster_request_with_expected (line 124) | def stub_create_cluster_request_with_expected(returned_data = {}, expe...
    function stub_get_ingresses (line 138) | def stub_get_ingresses(data = {}, status = 200)
    function equal_hashes? (line 146) | def equal_hashes?(expected, actual)

FILE: core/test/support/docker_hub_stub_support.rb
  type UffizziCore::DockerHubStubSupport (line 3) | module UffizziCore::DockerHubStubSupport
    function stub_dockerhub_login (line 7) | def stub_dockerhub_login
    function stub_dockerhub_login_fail (line 14) | def stub_dockerhub_login_fail(data)
    function stub_dockerhub_auth_for_digest (line 20) | def stub_dockerhub_auth_for_digest(repository)
    function stub_dockerhub_get_digest (line 26) | def stub_dockerhub_get_digest(image, tag, data)
    function stub_dockerhub_api_tokens (line 31) | def stub_dockerhub_api_tokens(data)
    function stub_dockerhub_repository (line 37) | def stub_dockerhub_repository(namespace, repo_name)
    function stub_dockerhub_private_repository (line 43) | def stub_dockerhub_private_repository(namespace, repo_name)
    function stub_dockerhub_repository_any (line 49) | def stub_dockerhub_repository_any

FILE: core/test/support/docker_registry_stub_support.rb
  type UffizziCore::DockerRegistryStubSupport (line 3) | module UffizziCore::DockerRegistryStubSupport
    function stub_docker_registry_manifests (line 4) | def stub_docker_registry_manifests(registry_url, image, tag, headers: ...

FILE: core/test/support/fixture_support.rb
  type UffizziCore::FixtureSupport (line 3) | module UffizziCore::FixtureSupport
    function file_fixture (line 4) | def file_fixture(file_path)
    function json_fixture (line 9) | def json_fixture(file_path, symbolize_names: true)

FILE: core/test/support/github_container_registry_support.rb
  type UffizziCore::GithubContainerRegistryStubSupport (line 3) | module UffizziCore::GithubContainerRegistryStubSupport
    function stub_github_container_registry_access_token (line 4) | def stub_github_container_registry_access_token(registry_url, response)

FILE: core/test/support/google_registry_stub_support.rb
  type UffizziCore::GoogleRegistryStubSupport (line 3) | module UffizziCore::GoogleRegistryStubSupport
    function stub_google_registry_token (line 6) | def stub_google_registry_token(response, code = 200)
    function stub_google_registry_manifests (line 13) | def stub_google_registry_manifests(image, tag, headers, body)

FILE: core/test/support/stub_support.rb
  type UffizziCore::StubSupport (line 3) | module UffizziCore::StubSupport
    function stub_controller (line 4) | def stub_controller

FILE: core/test/test_helper.rb
  class ActiveSupport::TestCase (line 42) | class ActiveSupport::TestCase

FILE: core/test/uffizzi_core_test.rb
  class UffizziCoreTest (line 5) | class UffizziCoreTest < ActiveSupport::TestCase

FILE: db/migrate/20220219114713_create_uffizzi_core_tables.uffizzi_core.rb
  class CreateUffizziCoreTables (line 5) | class CreateUffizziCoreTables < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220317112742_remove_secrets_from_projects.uffizzi_core.rb
  class RemoveSecretsFromProjects (line 5) | class RemoveSecretsFromProjects < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220317112743_create_project_secrets.uffizzi_core.rb
  class CreateProjectSecrets (line 5) | class CreateProjectSecrets < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220325113623_add_name_to_uffizzi_containers.uffizzi_core.rb
  class AddNameToUffizziContainers (line 4) | class AddNameToUffizziContainers < ActiveRecord::Migration[6.1]
    method change (line 5) | def change

FILE: db/migrate/20220412133606_rename_project_secrets_to_secrets.uffizzi_core.rb
  class RenameProjectSecretsToSecrets (line 5) | class RenameProjectSecretsToSecrets < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220412133607_add_resource_to_secrets.uffizzi_core.rb
  class AddResourceToSecrets (line 5) | class AddResourceToSecrets < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220412133608_remove_project_ref_from_secrets.uffizzi_core.rb
  class RemoveProjectRefFromSecrets (line 5) | class RemoveProjectRefFromSecrets < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220420103952_add_health_check_to_containers.uffizzi_core.rb
  class AddHealthCheckToContainers (line 5) | class AddHealthCheckToContainers < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220527135654_rename_name_to_uffizzi_containers.uffizzi_core.rb
  class RenameNameToUffizziContainers (line 5) | class RenameNameToUffizziContainers < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220617184754_add_volumes_to_uffizzi_core_containers.uffizzi_core.rb
  class AddVolumesToUffizziCoreContainers (line 5) | class AddVolumesToUffizziCoreContainers < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220708093405_add_disabled_at_to_deployments.uffizzi_core.rb
  class AddDisabledAtToDeployments (line 5) | class AddDisabledAtToDeployments < ActiveRecord::Migration[6.1]
    method up (line 6) | def up
    method down (line 13) | def down

FILE: db/migrate/20220817140346_add_metadata_to_deployment.uffizzi_core.rb
  class AddMetadataToDeployment (line 5) | class AddMetadataToDeployment < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20220901110752_create_host_volume_files.rb
  class CreateHostVolumeFiles (line 3) | class CreateHostVolumeFiles < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20220901165313_create_container_host_volume_files.rb
  class CreateContainerHostVolumeFiles (line 3) | class CreateContainerHostVolumeFiles < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20220927113647_add_additional_subdomains_to_containers.rb
  class AddAdditionalSubdomainsToContainers (line 3) | class AddAdditionalSubdomainsToContainers < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20230111000000_add_state_to_memberships.rb
  class AddStateToMemberships (line 3) | class AddStateToMemberships < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20230306142805_add_last_deploy_at_to_deployments.uffizzi_core.rb
  class AddLastDeployAtToDeployments (line 4) | class AddLastDeployAtToDeployments < ActiveRecord::Migration[6.1]
    method up (line 5) | def up
    method down (line 11) | def down

FILE: db/migrate/20230406154547_add_full_image_name_to_container.uffizzi_core.rb
  class AddFullImageNameToContainer (line 4) | class AddFullImageNameToContainer < ActiveRecord::Migration[6.1]
    method change (line 5) | def change

FILE: db/migrate/20230531135739_create_deployment_events.rb
  class CreateDeploymentEvents (line 3) | class CreateDeploymentEvents < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20230613110517_create_clusters.uffizzi_core.rb
  class CreateClusters (line 4) | class CreateClusters < ActiveRecord::Migration[6.1]
    method change (line 5) | def change

FILE: db/migrate/20230711101901_add_host_to_clusters.rb
  class AddHostToClusters (line 3) | class AddHostToClusters < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20230824150022_update_name_constraint_to_projects.rb
  class UpdateNameConstraintToProjects (line 3) | class UpdateNameConstraintToProjects < ActiveRecord::Migration[6.1]
    method change (line 4) | def change

FILE: db/migrate/20231009103942_add_source_to_uffizzi_core_clusters.uffizzi_core.rb
  class AddSourceToUffizziCoreClusters (line 5) | class AddSourceToUffizziCoreClusters < ActiveRecord::Migration[6.1]
    method change (line 6) | def change

FILE: db/migrate/20231009163516_create_uffizzi_core_kubernetes_distributions.uffizzi_core.rb
  class CreateUffizziCoreKubernetesDistributions (line 4) | class CreateUffizziCoreKubernetesDistributions < ActiveRecord::Migration...
    method change (line 5) | def change

FILE: db/migrate/20231009201239_add_kubernetes_distribution_id_to_uffizzi_core_clusters.uffizzi_core.rb
  class AddKubernetesDistributionIdToUffizziCoreClusters (line 4) | class AddKubernetesDistributionIdToUffizziCoreClusters < ActiveRecord::M...
    method change (line 5) | def change

FILE: db/migrate/20240301200916_add_node_selector_to_cluster.uffizzi_core.rb
  class AddNodeSelectorToCluster (line 4) | class AddNodeSelectorToCluster < ActiveRecord::Migration[6.1]
    method change (line 5) | def change

FILE: db/migrate/20240314170425_delete_node_selector_from_cluster.uffizzi_core.rb
  class DeleteNodeSelectorFromCluster (line 4) | class DeleteNodeSelectorFromCluster < ActiveRecord::Migration[6.1]
    method change (line 5) | def change

FILE: test/application_system_test_case.rb
  class ApplicationSystemTestCase (line 5) | class ApplicationSystemTestCase < ActionDispatch::SystemTestCase

FILE: test/channels/application_cable/connection_test.rb
  class ApplicationCable::ConnectionTest (line 5) | class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase

FILE: test/test_helper.rb
  class ActiveSupport::TestCase (line 7) | class ActiveSupport::TestCase
Condensed preview — 713 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (975K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 671,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: Bug report\nlabels: bug\nassignees: ''\n\n---\n\n**Descr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 921,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: community-new\nassignees: ''\n\n---\n\n**"
  },
  {
    "path": ".github/workflows/helm-release.yml",
    "chars": 527,
    "preview": "name: Release Helm Charts\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 2965,
    "preview": "name: Test, Lint, Build, and Publish Image\non:\n  push:\n    branches:\n      - qa\n      - develop\n      - main\n  pull_requ"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 970,
    "preview": "name: Uffizzi Core Release\non:\n  push:\n    tags:\n      - core_v*\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps:\n"
  },
  {
    "path": ".gitignore",
    "chars": 842,
    "preview": "# See https://help.github.com/articles/ignoring-files for more about ignoring files.\n#\n# If you find yourself ignoring t"
  },
  {
    "path": ".rubocop.yml",
    "chars": 21387,
    "preview": "require:\n - rubocop-minitest\n\nAllCops:\n  NewCops: disable\n  SuggestExtensions: false\n  Exclude:\n    - core/test/dummy/**"
  },
  {
    "path": ".ruby-version",
    "chars": 11,
    "preview": "ruby-2.5.3\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 4189,
    "preview": "# Code of Conduct\nThis Code of Conduct is based on the [Mission Protocol Code of Conduct v1.1](https://missionprotocol.o"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2954,
    "preview": "# Contributing to `uffizzi_app`\n\nThanks for your interest! We are actively working to release `uffizzi_app` and define h"
  },
  {
    "path": "Dockerfile",
    "chars": 839,
    "preview": "FROM ruby:2.7.5-slim\n\nARG RAILS_ROOT=/app\nRUN mkdir -p $RAILS_ROOT\nWORKDIR $RAILS_ROOT\n\nRUN apt-get update \\\n  && apt-ge"
  },
  {
    "path": "Gemfile",
    "chars": 645,
    "preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\ngit_source(:github) { |repo| \"https://github.com/#{repo}.gi"
  },
  {
    "path": "INSTALL.md",
    "chars": 3967,
    "preview": "# Installation overview\n\nSee the [Helm chart guide](https://github.com/UffizziCloud/uffizzi_app/blob/main/charts/uffizzi"
  },
  {
    "path": "LICENSE",
    "chars": 11341,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 1294,
    "preview": ".PHONY: release release_patch release_minor release_major test\n\nNEXT_PATCH=$(shell docker compose run --rm core bash -c "
  },
  {
    "path": "README.md",
    "chars": 12728,
    "preview": "<div align=\"center\" style=\"border-bottom: none\">\n  <h1>\n    <div>\n        <a href=\"https://www.uffizzi.com\">\n           "
  },
  {
    "path": "Rakefile",
    "chars": 258,
    "preview": "# frozen_string_literal: true\n\n# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/task"
  },
  {
    "path": "app/assets/config/manifest.js",
    "chars": 63,
    "preview": "//= link_tree ../images\n//= link_directory ../stylesheets .css\n"
  },
  {
    "path": "app/assets/fonts/mtiFontTrackingCode.js",
    "chars": 775,
    "preview": "eval(function (p, a, c, k, e, d) { e = function (c) { return c.toString(36) }; if (!''.replace(/^/, String)) { while (c-"
  },
  {
    "path": "app/assets/images/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/assets/stylesheets/application.css",
    "chars": 709,
    "preview": "/*\n * This is a manifest file that'll be compiled into application.css, which will include all the files\n * listed below"
  },
  {
    "path": "app/channels/application_cable/channel.rb",
    "chars": 110,
    "preview": "# frozen_string_literal: true\n\nmodule ApplicationCable\n  class Channel < ActionCable::Channel::Base\n  end\nend\n"
  },
  {
    "path": "app/channels/application_cable/connection.rb",
    "chars": 116,
    "preview": "# frozen_string_literal: true\n\nmodule ApplicationCable\n  class Connection < ActionCable::Connection::Base\n  end\nend\n"
  },
  {
    "path": "app/controllers/application_controller.rb",
    "chars": 88,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationController < ActionController::Base\nend\n"
  },
  {
    "path": "app/controllers/concerns/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/helpers/application_helper.rb",
    "chars": 60,
    "preview": "# frozen_string_literal: true\n\nmodule ApplicationHelper\nend\n"
  },
  {
    "path": "app/javascript/channels/consumer.js",
    "chars": 266,
    "preview": "// Action Cable provides the framework to deal with WebSockets in Rails.\n// You can generate new channels where WebSocke"
  },
  {
    "path": "app/javascript/channels/index.js",
    "chars": 212,
    "preview": "// Load all the channels within this directory and all subdirectories.\n// Channel files must be named *_channel.js.\n\ncon"
  },
  {
    "path": "app/javascript/packs/application.js",
    "chars": 746,
    "preview": "// This file is automatically compiled by Webpack, along with any other files\n// present in this directory. You're encou"
  },
  {
    "path": "app/jobs/application_job.rb",
    "chars": 300,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationJob < ActiveJob::Base\n  # Automatically retry jobs that encountered a de"
  },
  {
    "path": "app/mailers/application_mailer.rb",
    "chars": 133,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationMailer < ActionMailer::Base\n  default from: 'from@example.com'\n  layout "
  },
  {
    "path": "app/models/application_record.rb",
    "chars": 109,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationRecord < ActiveRecord::Base\n  self.abstract_class = true\nend\n"
  },
  {
    "path": "app/models/concerns/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/views/layouts/application.html.erb",
    "chars": 343,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Uffizzi App</title>\n    <%= csrf_meta_tags %>\n    <%= csp_meta_tag %>\n\n    <%"
  },
  {
    "path": "app/views/layouts/mailer.html.erb",
    "chars": 229,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <style>\n  "
  },
  {
    "path": "app/views/layouts/mailer.text.erb",
    "chars": 13,
    "preview": "<%= yield %>\n"
  },
  {
    "path": "bin/rails",
    "chars": 172,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nAPP_PATH = File.expand_path('../config/application', __dir__)\nrequire"
  },
  {
    "path": "bin/rake",
    "chars": 121,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire_relative '../config/boot'\nrequire 'rake'\nRake.application.run"
  },
  {
    "path": "bin/setup",
    "chars": 1100,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire 'fileutils'\n\n# path to your application root.\nAPP_ROOT = File"
  },
  {
    "path": "bin/yarn",
    "chars": 298,
    "preview": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nAPP_ROOT = File.expand_path('..', __dir__)\nDir.chdir(APP_ROOT) do\n  e"
  },
  {
    "path": "charts/uffizzi-app/Chart.yaml",
    "chars": 1415,
    "preview": "apiVersion: v2\nname: uffizzi-app\nversion: 1.3.0\nkubeVersion: \">= 1.21.0-0\" # https://issuetracker.google.com/issues/7750"
  },
  {
    "path": "charts/uffizzi-app/README.md",
    "chars": 5338,
    "preview": "# Helm chart guide\n\nThis chart installs Uffizzi.\n\n## Requirements\n\nThis chart requires a Kubernetes Cluster. While it wi"
  },
  {
    "path": "charts/uffizzi-app/templates/configmap-common.yaml",
    "chars": 831,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: uffizzi-web-common-envs\ndata:\n  DATABASE_POOL: \"16\"\n  DATABASE_PORT: {{"
  },
  {
    "path": "charts/uffizzi-app/templates/configmap-sidekiq.yaml",
    "chars": 109,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: uffizzi-web-sidekiq-envs\n\ndata:\n  SIDEKIQ_CONCURRENCY: \"10\"\n"
  },
  {
    "path": "charts/uffizzi-app/templates/configmap-web.yaml",
    "chars": 244,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: uffizzi-web-service-envs\n\ndata:\n  ALLOWED_HOSTS: {{ .Values.allowed_hos"
  },
  {
    "path": "charts/uffizzi-app/templates/secret-web.yaml",
    "chars": 1354,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: uffizzi-web-secret-envs\ntype: Opaque\ndata:\n    DATABASE_USER: {{ .Values.g"
  },
  {
    "path": "charts/uffizzi-app/templates/sidekiq-deployment.yaml",
    "chars": 966,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ .Release.Name }}-sidekiq\n  labels:\n    app: uffizzi-sidekiq\n\ns"
  },
  {
    "path": "charts/uffizzi-app/templates/web-deployment.yaml",
    "chars": 1334,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ .Release.Name }}-web\n  labels:\n    app: uffizzi-web\n\nspec:\n  r"
  },
  {
    "path": "charts/uffizzi-app/templates/web-ingress.yaml",
    "chars": 608,
    "preview": "apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ .Release.Name }}-web-ingress\n  annotations:\n    cert"
  },
  {
    "path": "charts/uffizzi-app/templates/web-service.yaml",
    "chars": 243,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ .Release.Name }}-web-service\n\nspec:\n  type: NodePort\n\n  selector:\n    "
  },
  {
    "path": "charts/uffizzi-app/values.yaml",
    "chars": 1637,
    "preview": "global:\n  postgresql:\n    auth:\n      postgresPassword: ChangeMeNow\n      username: uffizzi-user\n      password: ChangeM"
  },
  {
    "path": "ci/github-actions/README.md",
    "chars": 663,
    "preview": "# Use Uffizzi with GitHub Actions\n\nYou can configure Uffizzi to create, update, and delete on-demand test environments w"
  },
  {
    "path": "ci/gitlab/README.md",
    "chars": 364,
    "preview": "# Use Uffizzi with GitLab CI\n\nYou can configure Uffizzi to create, update, and delete on-demand Preview Environments wit"
  },
  {
    "path": "config/application.rb",
    "chars": 758,
    "preview": "# frozen_string_literal: true\n\nrequire_relative 'boot'\n\nrequire 'rails/all'\n\n# Require the gems listed in Gemfile, inclu"
  },
  {
    "path": "config/boot.rb",
    "chars": 238,
    "preview": "# frozen_string_literal: true\n\nENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)\n\nrequire 'bundler/setup"
  },
  {
    "path": "config/cable.yml",
    "chars": 192,
    "preview": "development:\n  adapter: async\n\ntest:\n  adapter: test\n\nproduction:\n  adapter: redis\n  url: <%= ENV.fetch(\"REDIS_URL\") { \""
  },
  {
    "path": "config/credentials.yml.enc",
    "chars": 464,
    "preview": "/panGyOWYw7RDiAdnBU58UQcCf5LmUrtROWE1pQpIAlZ1BUUsCat6oE8MVO5TDTc4q0XOGjndQ28i+ffjpHCob1TPHlTwGmAWcaKawSOQeLPOgHHvtzumHfS"
  },
  {
    "path": "config/database.yml",
    "chars": 492,
    "preview": "default: &default\n  adapter: postgresql\n  encoding: unicode\n  host: <%= ENV.fetch(\"DATABASE_HOST\") {\"127.0.0.1\"} %>\n  po"
  },
  {
    "path": "config/environment.rb",
    "chars": 159,
    "preview": "# frozen_string_literal: true\n\n# Load the Rails application.\nrequire_relative 'application'\n\n# Initialize the Rails appl"
  },
  {
    "path": "config/environments/development.rb",
    "chars": 2335,
    "preview": "# frozen_string_literal: true\n\nRails.application.configure do\n  # Settings specified here will take precedence over thos"
  },
  {
    "path": "config/environments/production.rb",
    "chars": 5042,
    "preview": "# frozen_string_literal: true\n\nRails.application.configure do\n  # Settings specified here will take precedence over thos"
  },
  {
    "path": "config/environments/test.rb",
    "chars": 1989,
    "preview": "# frozen_string_literal: true\n\n# The test environment is used exclusively to run your application's\n# test suite. You ne"
  },
  {
    "path": "config/initializers/application_controller_renderer.rb",
    "chars": 246,
    "preview": "# frozen_string_literal: true\n# Be sure to restart your server when you modify this file.\n\n# ActiveSupport::Reloader.to_"
  },
  {
    "path": "config/initializers/assets.rb",
    "chars": 661,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Version of your assets, ch"
  },
  {
    "path": "config/initializers/backtrace_silencers.rb",
    "chars": 434,
    "preview": "# frozen_string_literal: true\n# Be sure to restart your server when you modify this file.\n\n# You can add backtrace silen"
  },
  {
    "path": "config/initializers/content_security_policy.rb",
    "chars": 1442,
    "preview": "# frozen_string_literal: true\n# Be sure to restart your server when you modify this file.\n\n# Define an application-wide "
  },
  {
    "path": "config/initializers/cookies_serializer.rb",
    "chars": 275,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Specify a serializer for t"
  },
  {
    "path": "config/initializers/filter_parameter_logging.rb",
    "chars": 225,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Configure sensitive parame"
  },
  {
    "path": "config/initializers/health_check.rb",
    "chars": 341,
    "preview": "# frozen_string_literal: true\n\nHealthCheck.setup do |config|\n  config.uri = ENV['HEALTH_CHECK_URI'] || 'health_check'\n  "
  },
  {
    "path": "config/initializers/inflections.rb",
    "chars": 677,
    "preview": "# frozen_string_literal: true\n# Be sure to restart your server when you modify this file.\n\n# Add new inflection rules us"
  },
  {
    "path": "config/initializers/mime_types.rb",
    "chars": 186,
    "preview": "# frozen_string_literal: true\n# Be sure to restart your server when you modify this file.\n\n# Add new mime types for use "
  },
  {
    "path": "config/initializers/sidekiq.rb",
    "chars": 1183,
    "preview": "# frozen_string_literal: true\n\nrequire 'sidekiq/web'\nrequire 'sidekiq-unique-jobs'\n\nSidekiq.configure_client do |config|"
  },
  {
    "path": "config/initializers/wrap_parameters.rb",
    "chars": 516,
    "preview": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# This file contains setting"
  },
  {
    "path": "config/locales/en.yml",
    "chars": 826,
    "preview": "# Files in the config/locales directory are used for internationalization\n# and are automatically loaded by Rails. If yo"
  },
  {
    "path": "config/puma.rb",
    "chars": 503,
    "preview": "# frozen_string_literal: true\n\nthreads_count = ENV.fetch('RAILS_THREADS_COUNT', 5)\nthreads threads_count, threads_count\n"
  },
  {
    "path": "config/routes.rb",
    "chars": 125,
    "preview": "# frozen_string_literal: true\n\nRails.application.routes.draw do\n  mount UffizziCore::Engine => '/'\n  health_check_routes"
  },
  {
    "path": "config/secrets.yml",
    "chars": 152,
    "preview": "default: &default\n  secret_key_base: <%=Settings.rails.secret_key_base%>\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *defa"
  },
  {
    "path": "config/settings.yml",
    "chars": 2816,
    "preview": "rails:\n  secret_key_base: <%= ENV['RAILS_SECRET_KEY_BASE'] %>\napp:\n  ttl_reset_password_token: 900\n  host: <%= ENV['APP_"
  },
  {
    "path": "config/sidekiq.yml",
    "chars": 466,
    "preview": "---\n:concurrency: <%= ENV[\"SIDEKIQ_CONCURRENCY\"].nil? ? 5 : ENV[\"SIDEKIQ_CONCURRENCY\"].to_i %>\n:verbose: true\n:queues:\n "
  },
  {
    "path": "config/storage.yml",
    "chars": 134,
    "preview": "test:\n  service: Disk\n  root: <%= Rails.root.join(\"tmp/storage\") %>\n\nlocal:\n  service: Disk\n  root: <%= Rails.root.join("
  },
  {
    "path": "config.ru",
    "chars": 161,
    "preview": "# frozen_string_literal: true\n\n# This file is used by Rack-based servers to start the application.\n\nrequire_relative 'co"
  },
  {
    "path": "core/.gitignore",
    "chars": 167,
    "preview": "/.bundle/\n/doc/\n/log/*.log\n/pkg/\n/tmp/\n/test/dummy/db/*.sqlite3\n/test/dummy/db/*.sqlite3-*\n/test/dummy/log/*.log\n/test/d"
  },
  {
    "path": "core/CHANGELOG.md",
    "chars": 43,
    "preview": "## [0.1.0] - 2022-04-05\n\n- Initial release\n"
  },
  {
    "path": "core/Dockerfile",
    "chars": 487,
    "preview": "FROM ruby:3.0.2-alpine3.14\n\nRUN apk update && apk upgrade && apk add bash curl-dev ruby-dev build-base git gcompat \\\n   "
  },
  {
    "path": "core/Gemfile",
    "chars": 145,
    "preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\ngit_source(:github) { |repo| \"https://github.com/#{repo}.gi"
  },
  {
    "path": "core/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "core/Makefile",
    "chars": 228,
    "preview": "release_gem:\n\tmkdir -p ${HOME}/.gem\n\ttouch ${HOME}/.gem/credentials\n\tchmod 0600 ${HOME}/.gem/credentials\n\tprintf -- \"---"
  },
  {
    "path": "core/README.md",
    "chars": 1974,
    "preview": "# Uffizzi Core\n\n**Uffizzi CLI API, Models, Services and core libraries**\n\n## Uffizzi Overview\n\nUffizzi is the Full-stack"
  },
  {
    "path": "core/Rakefile",
    "chars": 640,
    "preview": "# frozen_string_literal: true\n\nrequire 'bundler/setup'\n\nAPP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)\n"
  },
  {
    "path": "core/app/assets/config/uffizzi_core_manifest.js",
    "chars": 52,
    "preview": "//= link_directory ../stylesheets/uffizzi_core .css\n"
  },
  {
    "path": "core/app/assets/images/uffizzi_core/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "core/app/assets/stylesheets/uffizzi_core/application.css",
    "chars": 736,
    "preview": "/*\n * This is a manifest file that'll be compiled into application.css, which will include all the files\n * listed below"
  },
  {
    "path": "core/app/clients/uffizzi_core/amazon_registry_client.rb",
    "chars": 544,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::AmazonRegistryClient\n  attr_accessor :client, :token, :registry_url\n\n "
  },
  {
    "path": "core/app/clients/uffizzi_core/azure_registry_client/request_result.rb",
    "chars": 128,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::AzureRegistryClient::RequestResult < Hashie::Mash\n  disable_warnings :"
  },
  {
    "path": "core/app/clients/uffizzi_core/azure_registry_client.rb",
    "chars": 1188,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::AzureRegistryClient\n  attr_accessor :connection, :token, :registry_url"
  },
  {
    "path": "core/app/clients/uffizzi_core/container_registry_request_decorator.rb",
    "chars": 374,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::ContainerRegistryRequestDecorator\n  [:get, :post, :head].each do |met"
  },
  {
    "path": "core/app/clients/uffizzi_core/controller_client/request_result.rb",
    "chars": 125,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ControllerClient::RequestResult < Hashie::Mash\n  disable_warnings :key"
  },
  {
    "path": "core/app/clients/uffizzi_core/controller_client.rb",
    "chars": 3827,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ControllerClient\n  class ConnectionError < StandardError; end\n\n  attr_"
  },
  {
    "path": "core/app/clients/uffizzi_core/docker_hub_client/not_authorized_error.rb",
    "chars": 119,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DockerHubClient\n  class NotAuthorizedError < StandardError\n  end\nend\n"
  },
  {
    "path": "core/app/clients/uffizzi_core/docker_hub_client/request_result.rb",
    "chars": 139,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DockerHubClient\n  class RequestResult < Hashie::Mash\n    disable_warni"
  },
  {
    "path": "core/app/clients/uffizzi_core/docker_hub_client.rb",
    "chars": 3594,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DockerHubClient\n  attr_accessor :connection, :jwt, :credential\n\n  BASE"
  },
  {
    "path": "core/app/clients/uffizzi_core/docker_registry_client/request_result.rb",
    "chars": 129,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DockerRegistryClient::RequestResult < Hashie::Mash\n  disable_warnings "
  },
  {
    "path": "core/app/clients/uffizzi_core/docker_registry_client.rb",
    "chars": 1537,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DockerRegistryClient\n  ACCEPTED_TYPES = [\n    'application/vnd.oci.ima"
  },
  {
    "path": "core/app/clients/uffizzi_core/github_container_registry_client/request_result.rb",
    "chars": 153,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::GithubContainerRegistryClient\n  class RequestResult < Hashie::Mash\n   "
  },
  {
    "path": "core/app/clients/uffizzi_core/github_container_registry_client.rb",
    "chars": 1496,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::GithubContainerRegistryClient\n  attr_accessor :token, :registry_url\n\n "
  },
  {
    "path": "core/app/clients/uffizzi_core/google_registry_client/request_result.rb",
    "chars": 129,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::GoogleRegistryClient::RequestResult < Hashie::Mash\n  disable_warnings "
  },
  {
    "path": "core/app/clients/uffizzi_core/google_registry_client.rb",
    "chars": 1178,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::GoogleRegistryClient\n  attr_accessor :connection, :token, :registry_ur"
  },
  {
    "path": "core/app/contexts/uffizzi_core/account_context.rb",
    "chars": 302,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::AccountContext\n  attr_reader :user, :user_access_module, :account, :pa"
  },
  {
    "path": "core/app/contexts/uffizzi_core/base_context.rb",
    "chars": 257,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::BaseContext\n  attr_reader :user, :user_access_module, :params\n\n  def i"
  },
  {
    "path": "core/app/contexts/uffizzi_core/project/cluster_context.rb",
    "chars": 353,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Project::ClusterContext\n  attr_reader :user, :user_access_module, :pro"
  },
  {
    "path": "core/app/contexts/uffizzi_core/project_context.rb",
    "chars": 344,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ProjectContext\n  attr_reader :user, :user_access_module, :project, :ac"
  },
  {
    "path": "core/app/contexts/uffizzi_core/webhooks_context.rb",
    "chars": 149,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::WebhooksContext\n  attr_reader :request\n\n  def initialize(request)\n    "
  },
  {
    "path": "core/app/controller_modules/uffizzi_core/api/cli/v1/accounts_controller_module.rb",
    "chars": 112,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Api::Cli::V1::AccountsControllerModule\n  def update; end\nend\n"
  },
  {
    "path": "core/app/controller_modules/uffizzi_core/api/cli/v1/projects/clusters_controller_module.rb",
    "chars": 230,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Api::Cli::V1::Projects::ClustersControllerModule\n  private\n\n  def upd"
  },
  {
    "path": "core/app/controller_modules/uffizzi_core/api/cli/v1/projects/deployments_controller_module.rb",
    "chars": 233,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Api::Cli::V1::Projects::DeploymentsControllerModule\n  private\n\n  def "
  },
  {
    "path": "core/app/controller_modules/uffizzi_core/api/cli/v1/projects_controller_module.rb",
    "chars": 157,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Api::Cli::V1::ProjectsControllerModule\n  private\n\n  def update_show_t"
  },
  {
    "path": "core/app/controllers/concerns/uffizzi_core/auth_management.rb",
    "chars": 872,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::AuthManagement\n  def sign_in(user)\n    session[:user_id] = user.id\n  "
  },
  {
    "path": "core/app/controllers/concerns/uffizzi_core/authorization_concern.rb",
    "chars": 823,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::AuthorizationConcern\n  extend ActiveSupport::Concern\n\n  included do\n "
  },
  {
    "path": "core/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb",
    "chars": 1937,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::DependencyInjectionConcern\n  extend ActiveSupport::Concern\n\n  class_m"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/accounts/application_controller.rb",
    "chars": 378,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Accounts::ApplicationController < UffizziCore::Api::Cli:"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/accounts/clusters_controller.rb",
    "chars": 1258,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Accounts::ClustersController < UffizziCore::Api::Cli::V1"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/accounts/credentials_controller.rb",
    "chars": 4506,
    "preview": "# frozen_string_literal: true\n\n# @resource Account/Credential\nclass UffizziCore::Api::Cli::V1::Accounts::CredentialsCont"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/accounts/projects_controller.rb",
    "chars": 1148,
    "preview": "# frozen_string_literal: true\n\n# @resource Project\n\nclass UffizziCore::Api::Cli::V1::Accounts::ProjectsController < Uffi"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/accounts_controller.rb",
    "chars": 1241,
    "preview": "# frozen_string_literal: true\n\n# @resource Project\n\nclass UffizziCore::Api::Cli::V1::AccountsController < UffizziCore::A"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb",
    "chars": 355,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ApplicationController < UffizziCore::ApplicationControll"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/ci/application_controller.rb",
    "chars": 184,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Ci::ApplicationController < UffizziCore::Api::Cli::V1::A"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/ci/sessions_controller.rb",
    "chars": 1144,
    "preview": "# frozen_string_literal: true\n\n# @resource Uffizzi\n\nclass UffizziCore::Api::Cli::V1::Ci::SessionsController < UffizziCor"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb",
    "chars": 489,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::ApplicationController < UffizziCore::Api::Cli:"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/application_controller.rb",
    "chars": 922,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::Clusters::ApplicationController < UffizziCore:"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters/ingresses_controller.rb",
    "chars": 521,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::Clusters::IngressesController <\n  UffizziCore:"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/clusters_controller.rb",
    "chars": 3954,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::ClustersController < UffizziCore::Api::Cli::V1"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb",
    "chars": 2826,
    "preview": "# frozen_string_literal: true\n\n# @resource ComposeFile\nclass UffizziCore::Api::Cli::V1::Projects::ComposeFilesController"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb",
    "chars": 1442,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsController <\n  Uffiz"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb",
    "chars": 300,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::Deployments::ApplicationController < UffizziCo"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb",
    "chars": 346,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Projects::Deployments::Containers::ApplicationController"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb",
    "chars": 1010,
    "preview": "# frozen_string_literal: true\n\n# @resource Project/Deployment/Container/Log\n\nclass UffizziCore::Api::Cli::V1::Projects::"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb",
    "chars": 1127,
    "preview": "# frozen_string_literal: true\n\n# @resource Container\n\nclass UffizziCore::Api::Cli::V1::Projects::Deployments::Containers"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb",
    "chars": 984,
    "preview": "# frozen_string_literal: true\n\n# @resource Event\nclass UffizziCore::Api::Cli::V1::Projects::Deployments::EventsControlle"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb",
    "chars": 6969,
    "preview": "# frozen_string_literal: true\n\n# @resource Deployment\n\nclass UffizziCore::Api::Cli::V1::Projects::DeploymentsController "
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb",
    "chars": 2125,
    "preview": "# frozen_string_literal: true\n\n# @resource Project/Secrets\nclass UffizziCore::Api::Cli::V1::Projects::SecretsController "
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/projects_controller.rb",
    "chars": 1541,
    "preview": "# frozen_string_literal: true\n\n# @resource Project\n\nclass UffizziCore::Api::Cli::V1::ProjectsController < UffizziCore::A"
  },
  {
    "path": "core/app/controllers/uffizzi_core/api/cli/v1/sessions_controller.rb",
    "chars": 1055,
    "preview": "# frozen_string_literal: true\n\n# @resource Uffizzi\n\nclass UffizziCore::Api::Cli::V1::SessionsController < UffizziCore::A"
  },
  {
    "path": "core/app/controllers/uffizzi_core/application_controller.rb",
    "chars": 1779,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ApplicationController < ActionController::Base\n  include Pundit::Autho"
  },
  {
    "path": "core/app/errors/uffizzi_core/cluster_scale_error.rb",
    "chars": 202,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ClusterScaleError < StandardError\n  def initialize(action)\n    message"
  },
  {
    "path": "core/app/errors/uffizzi_core/compose_file/build_error.rb",
    "chars": 288,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ComposeFile::BuildError < UffizziCore::ComposeFileError\n  def initiali"
  },
  {
    "path": "core/app/errors/uffizzi_core/compose_file/credential_error.rb",
    "chars": 99,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ComposeFile::CredentialError < StandardError\nend\n"
  },
  {
    "path": "core/app/errors/uffizzi_core/compose_file/parse_error.rb",
    "chars": 94,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ComposeFile::ParseError < StandardError\nend\n"
  },
  {
    "path": "core/app/errors/uffizzi_core/compose_file/secrets_error.rb",
    "chars": 283,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ComposeFile::SecretsError < UffizziCore::ComposeFileError\n  def initia"
  },
  {
    "path": "core/app/errors/uffizzi_core/compose_file_error.rb",
    "chars": 576,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ComposeFileError < StandardError\n  attr_reader :errors\n\n  def initiali"
  },
  {
    "path": "core/app/errors/uffizzi_core/container_registry_error.rb",
    "chars": 682,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ContainerRegistryError < StandardError\n  attr_reader :errors, :error_k"
  },
  {
    "path": "core/app/errors/uffizzi_core/deployment/image_pull_error.rb",
    "chars": 210,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::ImagePullError < StandardError\n  attr_reader :deployment_i"
  },
  {
    "path": "core/app/errors/uffizzi_core/deployment_not_found_error.rb",
    "chars": 207,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::DeploymentNotFoundError < StandardError\n  attr_reader :deployment_id\n\n"
  },
  {
    "path": "core/app/errors/uffizzi_core/registry_not_supported_error.rb",
    "chars": 96,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::RegistryNotSupportedError < StandardError\nend\n"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb",
    "chars": 357,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Account::Credential::CheckCredentialForm\n  include Uffiz"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb",
    "chars": 844,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Account::Credential::CreateForm < UffizziCore::Credentia"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/account/credential/update_form.rb",
    "chars": 645,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Account::Credential::UpdateForm < UffizziCore::Credentia"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/cluster/create_form.rb",
    "chars": 439,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Cluster::CreateForm < UffizziCore::Cluster\n  include Uff"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/cluster/sync_form.rb",
    "chars": 664,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Cluster::SyncForm < UffizziCore::Cluster\n  include Uffiz"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb",
    "chars": 1228,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ComposeFile::CheckCredentialsForm\n  include UffizziCore:"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb",
    "chars": 892,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ComposeFile::CliForm\n  include UffizziCore::ApplicationF"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb",
    "chars": 301,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ComposeFile::CreateForm < UffizziCore::ComposeFile\n  inc"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb",
    "chars": 1283,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ComposeFile::TemplateForm\n  include UffizziCore::Applica"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/compose_file/update_form.rb",
    "chars": 231,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ComposeFile::UpdateForm < UffizziCore::ComposeFile\n  inc"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/config_file/create_form.rb",
    "chars": 303,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::ConfigFile::CreateForm < UffizziCore::ConfigFile\n  inclu"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb",
    "chars": 3490,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::Deployment\n  inclu"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb",
    "chars": 2902,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Deployment::UpdateForm < UffizziCore::Deployment\n  inclu"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/project/create_form.rb",
    "chars": 187,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Project::CreateForm < UffizziCore::Project\n  include Uff"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb",
    "chars": 307,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Project::UpdateForm < UffizziCore::Project\n  include Uff"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb",
    "chars": 1162,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Secret::BulkAssignForm\n  include UffizziCore::Applicatio"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/session_create_form.rb",
    "chars": 620,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::SessionCreateForm\n  include UffizziCore::ApplicationForm"
  },
  {
    "path": "core/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb",
    "chars": 403,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Api::Cli::V1::Template::CreateForm < UffizziCore::Template\n  include U"
  },
  {
    "path": "core/app/forms/uffizzi_core/application_form.rb",
    "chars": 231,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::ApplicationForm\n  extend ActiveSupport::Concern\n\n  include UffizziCor"
  },
  {
    "path": "core/app/forms/uffizzi_core/application_form_without_active_record.rb",
    "chars": 364,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::ApplicationFormWithoutActiveRecord\n  extend ActiveSupport::Concern\n\n "
  },
  {
    "path": "core/app/forms/uffizzi_core/mass_assignment_control_concern.rb",
    "chars": 430,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::MassAssignmentControlConcern\n  extend ActiveSupport::Concern\n\n  class"
  },
  {
    "path": "core/app/helpers/uffizzi_core/application_helper.rb",
    "chars": 87,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore\n  module ApplicationHelper\n  end\nend\n"
  },
  {
    "path": "core/app/jobs/uffizzi_core/account/create_credential_job.rb",
    "chars": 295,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Account::CreateCredentialJob < UffizziCore::ApplicationJob\n  sidekiq_o"
  },
  {
    "path": "core/app/jobs/uffizzi_core/account/update_credential_job.rb",
    "chars": 295,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Account::UpdateCredentialJob < UffizziCore::ApplicationJob\n  sidekiq_o"
  },
  {
    "path": "core/app/jobs/uffizzi_core/activity_item/docker/update_digest_job.rb",
    "chars": 325,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ActivityItem::Docker::UpdateDigestJob < UffizziCore::ApplicationJob\n  "
  },
  {
    "path": "core/app/jobs/uffizzi_core/application_job.rb",
    "chars": 111,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore\n  class ApplicationJob\n    include Sidekiq::Worker\n  end\nend\n"
  },
  {
    "path": "core/app/jobs/uffizzi_core/cluster/delete_job.rb",
    "chars": 440,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Cluster::DeleteJob < UffizziCore::ApplicationJob\n  sidekiq_options que"
  },
  {
    "path": "core/app/jobs/uffizzi_core/cluster/deploy_job.rb",
    "chars": 305,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Cluster::DeployJob < UffizziCore::ApplicationJob\n  sidekiq_options que"
  },
  {
    "path": "core/app/jobs/uffizzi_core/cluster/manage_deploying_job.rb",
    "chars": 330,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Cluster::ManageDeployingJob < UffizziCore::ApplicationJob\n  sidekiq_op"
  },
  {
    "path": "core/app/jobs/uffizzi_core/cluster/manage_scaling_down_job.rb",
    "chars": 319,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Cluster::ManageScalingDownJob < UffizziCore::ApplicationJob\n  sidekiq_"
  },
  {
    "path": "core/app/jobs/uffizzi_core/cluster/manage_scaling_up_job.rb",
    "chars": 329,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Cluster::ManageScalingUpJob < UffizziCore::ApplicationJob\n  sidekiq_op"
  },
  {
    "path": "core/app/jobs/uffizzi_core/config_file/apply_job.rb",
    "chars": 1458,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::ConfigFile::ApplyJob < UffizziCore::ApplicationJob\n  sidekiq_options q"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/create_credential_job.rb",
    "chars": 1469,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::CreateCredentialJob < UffizziCore::ApplicationJob\n  sideki"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/create_credentials_job.rb",
    "chars": 569,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::CreateCredentialsJob < UffizziCore::ApplicationJob\n  sidek"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/create_job.rb",
    "chars": 449,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::CreateJob < UffizziCore::ApplicationJob\n  sidekiq_options "
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/delete_credential_job.rb",
    "chars": 536,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::DeleteCredentialJob < UffizziCore::ApplicationJob\n  sideki"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/delete_job.rb",
    "chars": 466,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::DeleteJob < UffizziCore::ApplicationJob\n  sidekiq_options "
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/deploy_containers_job.rb",
    "chars": 1303,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::DeployContainersJob < UffizziCore::ApplicationJob\n  sideki"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb",
    "chars": 1743,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::ManageDeployActivityItemJob < UffizziCore::ApplicationJob\n"
  },
  {
    "path": "core/app/jobs/uffizzi_core/deployment/update_credential_job.rb",
    "chars": 1470,
    "preview": "# frozen_string_literal: true\n\nclass UffizziCore::Deployment::UpdateCredentialJob < UffizziCore::ApplicationJob\n  sideki"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/account.rb",
    "chars": 1828,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::Account\n  extend ActiveSupport::Concern\n\n  # ruboco"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/activity_item.rb",
    "chars": 603,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::ActivityItem\n  extend ActiveSupport::Concern\n\n  inc"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/cluster.rb",
    "chars": 2663,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::Cluster\n  extend ActiveSupport::Concern\n  include U"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/comment.rb",
    "chars": 551,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::Comment\n  extend ActiveSupport::Concern\n\n  included"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/compose_file.rb",
    "chars": 1745,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::ComposeFile\n  extend ActiveSupport::Concern\n\n  LOCA"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/config_file.rb",
    "chars": 683,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::ConfigFile\n  extend ActiveSupport::Concern\n\n  inclu"
  },
  {
    "path": "core/app/lib/uffizzi_core/concerns/models/container.rb",
    "chars": 2905,
    "preview": "# frozen_string_literal: true\n\nmodule UffizziCore::Concerns::Models::Container\n  extend ActiveSupport::Concern\n  REQUEST"
  }
]

// ... and 513 more files (download for full content)

About this extraction

This page contains the full source code of the UffizziCloud/uffizzi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 713 files (857.5 KB), approximately 241.6k tokens, and a symbol index with 1238 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!