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.
<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>
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>

## 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
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
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.