paasta-tools 1.21.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- k8s_itests/__init__.py +0 -0
- k8s_itests/test_autoscaling.py +23 -0
- k8s_itests/utils.py +38 -0
- paasta_tools/__init__.py +20 -0
- paasta_tools/adhoc_tools.py +142 -0
- paasta_tools/api/__init__.py +13 -0
- paasta_tools/api/api.py +330 -0
- paasta_tools/api/api_docs/swagger.json +2323 -0
- paasta_tools/api/client.py +106 -0
- paasta_tools/api/settings.py +33 -0
- paasta_tools/api/tweens/__init__.py +6 -0
- paasta_tools/api/tweens/auth.py +125 -0
- paasta_tools/api/tweens/profiling.py +108 -0
- paasta_tools/api/tweens/request_logger.py +124 -0
- paasta_tools/api/views/__init__.py +13 -0
- paasta_tools/api/views/autoscaler.py +100 -0
- paasta_tools/api/views/exception.py +45 -0
- paasta_tools/api/views/flink.py +73 -0
- paasta_tools/api/views/instance.py +395 -0
- paasta_tools/api/views/pause_autoscaler.py +71 -0
- paasta_tools/api/views/remote_run.py +113 -0
- paasta_tools/api/views/resources.py +76 -0
- paasta_tools/api/views/service.py +35 -0
- paasta_tools/api/views/version.py +25 -0
- paasta_tools/apply_external_resources.py +79 -0
- paasta_tools/async_utils.py +109 -0
- paasta_tools/autoscaling/__init__.py +0 -0
- paasta_tools/autoscaling/autoscaling_service_lib.py +57 -0
- paasta_tools/autoscaling/forecasting.py +106 -0
- paasta_tools/autoscaling/max_all_k8s_services.py +41 -0
- paasta_tools/autoscaling/pause_service_autoscaler.py +77 -0
- paasta_tools/autoscaling/utils.py +52 -0
- paasta_tools/bounce_lib.py +184 -0
- paasta_tools/broadcast_log_to_services.py +62 -0
- paasta_tools/cassandracluster_tools.py +210 -0
- paasta_tools/check_autoscaler_max_instances.py +212 -0
- paasta_tools/check_cassandracluster_services_replication.py +35 -0
- paasta_tools/check_flink_services_health.py +203 -0
- paasta_tools/check_kubernetes_api.py +57 -0
- paasta_tools/check_kubernetes_services_replication.py +141 -0
- paasta_tools/check_oom_events.py +244 -0
- paasta_tools/check_services_replication_tools.py +324 -0
- paasta_tools/check_spark_jobs.py +234 -0
- paasta_tools/cleanup_kubernetes_cr.py +138 -0
- paasta_tools/cleanup_kubernetes_crd.py +145 -0
- paasta_tools/cleanup_kubernetes_jobs.py +344 -0
- paasta_tools/cleanup_tron_namespaces.py +96 -0
- paasta_tools/cli/__init__.py +13 -0
- paasta_tools/cli/authentication.py +85 -0
- paasta_tools/cli/cli.py +260 -0
- paasta_tools/cli/cmds/__init__.py +13 -0
- paasta_tools/cli/cmds/autoscale.py +143 -0
- paasta_tools/cli/cmds/check.py +334 -0
- paasta_tools/cli/cmds/cook_image.py +147 -0
- paasta_tools/cli/cmds/get_docker_image.py +76 -0
- paasta_tools/cli/cmds/get_image_version.py +172 -0
- paasta_tools/cli/cmds/get_latest_deployment.py +93 -0
- paasta_tools/cli/cmds/info.py +155 -0
- paasta_tools/cli/cmds/itest.py +117 -0
- paasta_tools/cli/cmds/list.py +66 -0
- paasta_tools/cli/cmds/list_clusters.py +42 -0
- paasta_tools/cli/cmds/list_deploy_queue.py +171 -0
- paasta_tools/cli/cmds/list_namespaces.py +84 -0
- paasta_tools/cli/cmds/local_run.py +1396 -0
- paasta_tools/cli/cmds/logs.py +1601 -0
- paasta_tools/cli/cmds/mark_for_deployment.py +1988 -0
- paasta_tools/cli/cmds/mesh_status.py +174 -0
- paasta_tools/cli/cmds/pause_service_autoscaler.py +107 -0
- paasta_tools/cli/cmds/push_to_registry.py +275 -0
- paasta_tools/cli/cmds/remote_run.py +252 -0
- paasta_tools/cli/cmds/rollback.py +347 -0
- paasta_tools/cli/cmds/secret.py +549 -0
- paasta_tools/cli/cmds/security_check.py +59 -0
- paasta_tools/cli/cmds/spark_run.py +1400 -0
- paasta_tools/cli/cmds/start_stop_restart.py +401 -0
- paasta_tools/cli/cmds/status.py +2302 -0
- paasta_tools/cli/cmds/validate.py +1012 -0
- paasta_tools/cli/cmds/wait_for_deployment.py +275 -0
- paasta_tools/cli/fsm/__init__.py +13 -0
- paasta_tools/cli/fsm/autosuggest.py +82 -0
- paasta_tools/cli/fsm/template/README.md +8 -0
- paasta_tools/cli/fsm/template/cookiecutter.json +7 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +91 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +20 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +8 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +6 -0
- paasta_tools/cli/fsm_cmd.py +121 -0
- paasta_tools/cli/paasta_tabcomplete.sh +23 -0
- paasta_tools/cli/schemas/adhoc_schema.json +199 -0
- paasta_tools/cli/schemas/autoscaling_schema.json +91 -0
- paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +37 -0
- paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +89 -0
- paasta_tools/cli/schemas/deploy_schema.json +173 -0
- paasta_tools/cli/schemas/eks_schema.json +970 -0
- paasta_tools/cli/schemas/kubernetes_schema.json +970 -0
- paasta_tools/cli/schemas/rollback_schema.json +160 -0
- paasta_tools/cli/schemas/service_schema.json +25 -0
- paasta_tools/cli/schemas/smartstack_schema.json +322 -0
- paasta_tools/cli/schemas/tron_schema.json +699 -0
- paasta_tools/cli/utils.py +1118 -0
- paasta_tools/clusterman.py +21 -0
- paasta_tools/config_utils.py +385 -0
- paasta_tools/contrib/__init__.py +0 -0
- paasta_tools/contrib/bounce_log_latency_parser.py +68 -0
- paasta_tools/contrib/check_manual_oapi_changes.sh +24 -0
- paasta_tools/contrib/check_orphans.py +306 -0
- paasta_tools/contrib/create_dynamodb_table.py +35 -0
- paasta_tools/contrib/create_paasta_playground.py +105 -0
- paasta_tools/contrib/emit_allocated_cpu_metrics.py +50 -0
- paasta_tools/contrib/get_running_task_allocation.py +346 -0
- paasta_tools/contrib/habitat_fixer.py +86 -0
- paasta_tools/contrib/ide_helper.py +316 -0
- paasta_tools/contrib/is_pod_healthy_in_proxy.py +139 -0
- paasta_tools/contrib/is_pod_healthy_in_smartstack.py +50 -0
- paasta_tools/contrib/kill_bad_containers.py +109 -0
- paasta_tools/contrib/mass-deploy-tag.sh +44 -0
- paasta_tools/contrib/mock_patch_checker.py +86 -0
- paasta_tools/contrib/paasta_update_soa_memcpu.py +520 -0
- paasta_tools/contrib/render_template.py +129 -0
- paasta_tools/contrib/rightsizer_soaconfigs_update.py +348 -0
- paasta_tools/contrib/service_shard_remove.py +157 -0
- paasta_tools/contrib/service_shard_update.py +373 -0
- paasta_tools/contrib/shared_ip_check.py +77 -0
- paasta_tools/contrib/timeouts_metrics_prom.py +64 -0
- paasta_tools/delete_kubernetes_deployments.py +89 -0
- paasta_tools/deployment_utils.py +44 -0
- paasta_tools/docker_wrapper.py +234 -0
- paasta_tools/docker_wrapper_imports.py +13 -0
- paasta_tools/drain_lib.py +351 -0
- paasta_tools/dump_locally_running_services.py +71 -0
- paasta_tools/eks_tools.py +119 -0
- paasta_tools/envoy_tools.py +373 -0
- paasta_tools/firewall.py +504 -0
- paasta_tools/firewall_logging.py +154 -0
- paasta_tools/firewall_update.py +172 -0
- paasta_tools/flink_tools.py +345 -0
- paasta_tools/flinkeks_tools.py +90 -0
- paasta_tools/frameworks/__init__.py +0 -0
- paasta_tools/frameworks/adhoc_scheduler.py +71 -0
- paasta_tools/frameworks/constraints.py +87 -0
- paasta_tools/frameworks/native_scheduler.py +652 -0
- paasta_tools/frameworks/native_service_config.py +301 -0
- paasta_tools/frameworks/task_store.py +245 -0
- paasta_tools/generate_all_deployments +9 -0
- paasta_tools/generate_authenticating_services.py +94 -0
- paasta_tools/generate_deployments_for_service.py +255 -0
- paasta_tools/generate_services_file.py +114 -0
- paasta_tools/generate_services_yaml.py +30 -0
- paasta_tools/hacheck.py +76 -0
- paasta_tools/instance/__init__.py +0 -0
- paasta_tools/instance/hpa_metrics_parser.py +122 -0
- paasta_tools/instance/kubernetes.py +1362 -0
- paasta_tools/iptables.py +240 -0
- paasta_tools/kafkacluster_tools.py +143 -0
- paasta_tools/kubernetes/__init__.py +0 -0
- paasta_tools/kubernetes/application/__init__.py +0 -0
- paasta_tools/kubernetes/application/controller_wrappers.py +476 -0
- paasta_tools/kubernetes/application/tools.py +90 -0
- paasta_tools/kubernetes/bin/__init__.py +0 -0
- paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +164 -0
- paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +135 -0
- paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +181 -0
- paasta_tools/kubernetes/bin/paasta_secrets_sync.py +758 -0
- paasta_tools/kubernetes/remote_run.py +558 -0
- paasta_tools/kubernetes_tools.py +4679 -0
- paasta_tools/list_kubernetes_service_instances.py +128 -0
- paasta_tools/list_tron_namespaces.py +60 -0
- paasta_tools/long_running_service_tools.py +678 -0
- paasta_tools/mac_address.py +44 -0
- paasta_tools/marathon_dashboard.py +0 -0
- paasta_tools/mesos/__init__.py +0 -0
- paasta_tools/mesos/cfg.py +46 -0
- paasta_tools/mesos/cluster.py +60 -0
- paasta_tools/mesos/exceptions.py +59 -0
- paasta_tools/mesos/framework.py +77 -0
- paasta_tools/mesos/log.py +48 -0
- paasta_tools/mesos/master.py +306 -0
- paasta_tools/mesos/mesos_file.py +169 -0
- paasta_tools/mesos/parallel.py +52 -0
- paasta_tools/mesos/slave.py +115 -0
- paasta_tools/mesos/task.py +94 -0
- paasta_tools/mesos/util.py +69 -0
- paasta_tools/mesos/zookeeper.py +37 -0
- paasta_tools/mesos_maintenance.py +848 -0
- paasta_tools/mesos_tools.py +1051 -0
- paasta_tools/metrics/__init__.py +0 -0
- paasta_tools/metrics/metastatus_lib.py +1110 -0
- paasta_tools/metrics/metrics_lib.py +217 -0
- paasta_tools/monitoring/__init__.py +13 -0
- paasta_tools/monitoring/check_k8s_api_performance.py +110 -0
- paasta_tools/monitoring_tools.py +652 -0
- paasta_tools/monkrelaycluster_tools.py +146 -0
- paasta_tools/nrtsearchservice_tools.py +143 -0
- paasta_tools/nrtsearchserviceeks_tools.py +68 -0
- paasta_tools/oom_logger.py +321 -0
- paasta_tools/paasta_deploy_tron_jobs +3 -0
- paasta_tools/paasta_execute_docker_command.py +123 -0
- paasta_tools/paasta_native_serviceinit.py +21 -0
- paasta_tools/paasta_service_config_loader.py +201 -0
- paasta_tools/paastaapi/__init__.py +29 -0
- paasta_tools/paastaapi/api/__init__.py +3 -0
- paasta_tools/paastaapi/api/autoscaler_api.py +302 -0
- paasta_tools/paastaapi/api/default_api.py +569 -0
- paasta_tools/paastaapi/api/remote_run_api.py +604 -0
- paasta_tools/paastaapi/api/resources_api.py +157 -0
- paasta_tools/paastaapi/api/service_api.py +1736 -0
- paasta_tools/paastaapi/api_client.py +818 -0
- paasta_tools/paastaapi/apis/__init__.py +22 -0
- paasta_tools/paastaapi/configuration.py +455 -0
- paasta_tools/paastaapi/exceptions.py +137 -0
- paasta_tools/paastaapi/model/__init__.py +5 -0
- paasta_tools/paastaapi/model/adhoc_launch_history.py +176 -0
- paasta_tools/paastaapi/model/autoscaler_count_msg.py +176 -0
- paasta_tools/paastaapi/model/deploy_queue.py +178 -0
- paasta_tools/paastaapi/model/deploy_queue_service_instance.py +194 -0
- paasta_tools/paastaapi/model/envoy_backend.py +185 -0
- paasta_tools/paastaapi/model/envoy_location.py +184 -0
- paasta_tools/paastaapi/model/envoy_status.py +181 -0
- paasta_tools/paastaapi/model/flink_cluster_overview.py +188 -0
- paasta_tools/paastaapi/model/flink_config.py +173 -0
- paasta_tools/paastaapi/model/flink_job.py +186 -0
- paasta_tools/paastaapi/model/flink_job_details.py +192 -0
- paasta_tools/paastaapi/model/flink_jobs.py +175 -0
- paasta_tools/paastaapi/model/float_and_error.py +173 -0
- paasta_tools/paastaapi/model/hpa_metric.py +176 -0
- paasta_tools/paastaapi/model/inline_object.py +170 -0
- paasta_tools/paastaapi/model/inline_response200.py +170 -0
- paasta_tools/paastaapi/model/inline_response2001.py +170 -0
- paasta_tools/paastaapi/model/instance_bounce_status.py +200 -0
- paasta_tools/paastaapi/model/instance_mesh_status.py +186 -0
- paasta_tools/paastaapi/model/instance_status.py +220 -0
- paasta_tools/paastaapi/model/instance_status_adhoc.py +187 -0
- paasta_tools/paastaapi/model/instance_status_cassandracluster.py +173 -0
- paasta_tools/paastaapi/model/instance_status_flink.py +173 -0
- paasta_tools/paastaapi/model/instance_status_kafkacluster.py +173 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes.py +263 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +187 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +197 -0
- paasta_tools/paastaapi/model/instance_status_tron.py +204 -0
- paasta_tools/paastaapi/model/instance_tasks.py +182 -0
- paasta_tools/paastaapi/model/integer_and_error.py +173 -0
- paasta_tools/paastaapi/model/kubernetes_container.py +178 -0
- paasta_tools/paastaapi/model/kubernetes_container_v2.py +219 -0
- paasta_tools/paastaapi/model/kubernetes_healthcheck.py +176 -0
- paasta_tools/paastaapi/model/kubernetes_pod.py +201 -0
- paasta_tools/paastaapi/model/kubernetes_pod_event.py +176 -0
- paasta_tools/paastaapi/model/kubernetes_pod_v2.py +213 -0
- paasta_tools/paastaapi/model/kubernetes_replica_set.py +185 -0
- paasta_tools/paastaapi/model/kubernetes_version.py +202 -0
- paasta_tools/paastaapi/model/remote_run_outcome.py +189 -0
- paasta_tools/paastaapi/model/remote_run_start.py +185 -0
- paasta_tools/paastaapi/model/remote_run_stop.py +176 -0
- paasta_tools/paastaapi/model/remote_run_token.py +173 -0
- paasta_tools/paastaapi/model/resource.py +187 -0
- paasta_tools/paastaapi/model/resource_item.py +187 -0
- paasta_tools/paastaapi/model/resource_value.py +176 -0
- paasta_tools/paastaapi/model/smartstack_backend.py +191 -0
- paasta_tools/paastaapi/model/smartstack_location.py +181 -0
- paasta_tools/paastaapi/model/smartstack_status.py +181 -0
- paasta_tools/paastaapi/model/task_tail_lines.py +176 -0
- paasta_tools/paastaapi/model_utils.py +1879 -0
- paasta_tools/paastaapi/models/__init__.py +62 -0
- paasta_tools/paastaapi/rest.py +287 -0
- paasta_tools/prune_completed_pods.py +220 -0
- paasta_tools/puppet_service_tools.py +59 -0
- paasta_tools/py.typed +1 -0
- paasta_tools/remote_git.py +127 -0
- paasta_tools/run-paasta-api-in-dev-mode.py +57 -0
- paasta_tools/run-paasta-api-playground.py +51 -0
- paasta_tools/secret_providers/__init__.py +66 -0
- paasta_tools/secret_providers/vault.py +214 -0
- paasta_tools/secret_tools.py +277 -0
- paasta_tools/setup_istio_mesh.py +353 -0
- paasta_tools/setup_kubernetes_cr.py +412 -0
- paasta_tools/setup_kubernetes_crd.py +138 -0
- paasta_tools/setup_kubernetes_internal_crd.py +154 -0
- paasta_tools/setup_kubernetes_job.py +353 -0
- paasta_tools/setup_prometheus_adapter_config.py +1028 -0
- paasta_tools/setup_tron_namespace.py +248 -0
- paasta_tools/slack.py +75 -0
- paasta_tools/smartstack_tools.py +676 -0
- paasta_tools/spark_tools.py +283 -0
- paasta_tools/synapse_srv_namespaces_fact.py +42 -0
- paasta_tools/tron/__init__.py +0 -0
- paasta_tools/tron/client.py +158 -0
- paasta_tools/tron/tron_command_context.py +194 -0
- paasta_tools/tron/tron_timeutils.py +101 -0
- paasta_tools/tron_tools.py +1448 -0
- paasta_tools/utils.py +4307 -0
- paasta_tools/yaml_tools.py +44 -0
- paasta_tools-1.21.3.data/scripts/apply_external_resources.py +79 -0
- paasta_tools-1.21.3.data/scripts/bounce_log_latency_parser.py +68 -0
- paasta_tools-1.21.3.data/scripts/check_autoscaler_max_instances.py +212 -0
- paasta_tools-1.21.3.data/scripts/check_cassandracluster_services_replication.py +35 -0
- paasta_tools-1.21.3.data/scripts/check_flink_services_health.py +203 -0
- paasta_tools-1.21.3.data/scripts/check_kubernetes_api.py +57 -0
- paasta_tools-1.21.3.data/scripts/check_kubernetes_services_replication.py +141 -0
- paasta_tools-1.21.3.data/scripts/check_manual_oapi_changes.sh +24 -0
- paasta_tools-1.21.3.data/scripts/check_oom_events.py +244 -0
- paasta_tools-1.21.3.data/scripts/check_orphans.py +306 -0
- paasta_tools-1.21.3.data/scripts/check_spark_jobs.py +234 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_cr.py +138 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_crd.py +145 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_jobs.py +344 -0
- paasta_tools-1.21.3.data/scripts/create_dynamodb_table.py +35 -0
- paasta_tools-1.21.3.data/scripts/create_paasta_playground.py +105 -0
- paasta_tools-1.21.3.data/scripts/delete_kubernetes_deployments.py +89 -0
- paasta_tools-1.21.3.data/scripts/emit_allocated_cpu_metrics.py +50 -0
- paasta_tools-1.21.3.data/scripts/generate_all_deployments +9 -0
- paasta_tools-1.21.3.data/scripts/generate_authenticating_services.py +94 -0
- paasta_tools-1.21.3.data/scripts/generate_deployments_for_service.py +255 -0
- paasta_tools-1.21.3.data/scripts/generate_services_file.py +114 -0
- paasta_tools-1.21.3.data/scripts/generate_services_yaml.py +30 -0
- paasta_tools-1.21.3.data/scripts/get_running_task_allocation.py +346 -0
- paasta_tools-1.21.3.data/scripts/habitat_fixer.py +86 -0
- paasta_tools-1.21.3.data/scripts/ide_helper.py +316 -0
- paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_proxy.py +139 -0
- paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_smartstack.py +50 -0
- paasta_tools-1.21.3.data/scripts/kill_bad_containers.py +109 -0
- paasta_tools-1.21.3.data/scripts/kubernetes_remove_evicted_pods.py +164 -0
- paasta_tools-1.21.3.data/scripts/mass-deploy-tag.sh +44 -0
- paasta_tools-1.21.3.data/scripts/mock_patch_checker.py +86 -0
- paasta_tools-1.21.3.data/scripts/paasta_cleanup_remote_run_resources.py +135 -0
- paasta_tools-1.21.3.data/scripts/paasta_cleanup_stale_nodes.py +181 -0
- paasta_tools-1.21.3.data/scripts/paasta_deploy_tron_jobs +3 -0
- paasta_tools-1.21.3.data/scripts/paasta_execute_docker_command.py +123 -0
- paasta_tools-1.21.3.data/scripts/paasta_secrets_sync.py +758 -0
- paasta_tools-1.21.3.data/scripts/paasta_tabcomplete.sh +23 -0
- paasta_tools-1.21.3.data/scripts/paasta_update_soa_memcpu.py +520 -0
- paasta_tools-1.21.3.data/scripts/render_template.py +129 -0
- paasta_tools-1.21.3.data/scripts/rightsizer_soaconfigs_update.py +348 -0
- paasta_tools-1.21.3.data/scripts/service_shard_remove.py +157 -0
- paasta_tools-1.21.3.data/scripts/service_shard_update.py +373 -0
- paasta_tools-1.21.3.data/scripts/setup_istio_mesh.py +353 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_cr.py +412 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_crd.py +138 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_internal_crd.py +154 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_job.py +353 -0
- paasta_tools-1.21.3.data/scripts/setup_prometheus_adapter_config.py +1028 -0
- paasta_tools-1.21.3.data/scripts/shared_ip_check.py +77 -0
- paasta_tools-1.21.3.data/scripts/synapse_srv_namespaces_fact.py +42 -0
- paasta_tools-1.21.3.data/scripts/timeouts_metrics_prom.py +64 -0
- paasta_tools-1.21.3.dist-info/LICENSE +201 -0
- paasta_tools-1.21.3.dist-info/METADATA +74 -0
- paasta_tools-1.21.3.dist-info/RECORD +348 -0
- paasta_tools-1.21.3.dist-info/WHEEL +5 -0
- paasta_tools-1.21.3.dist-info/entry_points.txt +20 -0
- paasta_tools-1.21.3.dist-info/top_level.txt +2 -0
paasta_tools/iptables.py
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"""iptables helper functions.
|
|
2
|
+
|
|
3
|
+
Unlike the `firewall` module, these functions know nothing about PaaSTA and
|
|
4
|
+
could effectively be a third-party library. They just make working with
|
|
5
|
+
iptables a little bit easier.
|
|
6
|
+
"""
|
|
7
|
+
import collections
|
|
8
|
+
import contextlib
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
import iptc
|
|
12
|
+
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
RULE_TARGET_SORT_ORDER = {
|
|
17
|
+
# all else defaults to '0'
|
|
18
|
+
"LOG": 1,
|
|
19
|
+
"REJECT": 2.0,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
_RuleBase = collections.namedtuple(
|
|
24
|
+
"_RuleBase", ("protocol", "src", "dst", "target", "matches", "target_parameters")
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Rule(_RuleBase):
|
|
29
|
+
"""Rule representation.
|
|
30
|
+
|
|
31
|
+
Working with iptc's rule classes directly doesn't work well, since rules
|
|
32
|
+
represent actual existing iptables rules, and changes are applied
|
|
33
|
+
immediately. They're also difficult to compare.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __new__(cls, *args, **kwargs):
|
|
37
|
+
result = _RuleBase.__new__(cls, *args, **kwargs)
|
|
38
|
+
result.validate()
|
|
39
|
+
return result
|
|
40
|
+
|
|
41
|
+
def _replace(self, **kwargs):
|
|
42
|
+
result = super()._replace(**kwargs)
|
|
43
|
+
result.validate()
|
|
44
|
+
return result
|
|
45
|
+
|
|
46
|
+
def validate(self):
|
|
47
|
+
if self.target == "REJECT":
|
|
48
|
+
assert any(
|
|
49
|
+
name == "reject-with" for name, _ in self.target_parameters
|
|
50
|
+
), "REJECT rules must specify reject-with"
|
|
51
|
+
assert tuple(sorted(self.matches)) == self.matches, "matches should be sorted"
|
|
52
|
+
for match_name, params in self.matches:
|
|
53
|
+
for param_name, param_value in params:
|
|
54
|
+
assert (
|
|
55
|
+
"_" not in param_name
|
|
56
|
+
), f"use dashes instead of underscores in {param_name}"
|
|
57
|
+
assert isinstance(
|
|
58
|
+
param_value, tuple
|
|
59
|
+
), f"value of {param_name} should be tuple"
|
|
60
|
+
assert (
|
|
61
|
+
tuple(sorted(self.target_parameters)) == self.target_parameters
|
|
62
|
+
), "target_parameters should be sorted"
|
|
63
|
+
for param_name, param_value in self.target_parameters:
|
|
64
|
+
assert (
|
|
65
|
+
"_" not in param_name
|
|
66
|
+
), f"use dashes instead of underscores in {param_name}"
|
|
67
|
+
assert isinstance(
|
|
68
|
+
param_value, tuple
|
|
69
|
+
), f"value of {param_name} should be tuple"
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def from_iptc(cls, rule):
|
|
73
|
+
fields = {
|
|
74
|
+
"protocol": rule.protocol,
|
|
75
|
+
"src": rule.src,
|
|
76
|
+
"dst": rule.dst,
|
|
77
|
+
"target": rule.target.name,
|
|
78
|
+
"matches": (),
|
|
79
|
+
"target_parameters": (),
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for param_name, param_value in sorted(rule.target.get_all_parameters().items()):
|
|
83
|
+
fields["target_parameters"] += ((param_name, tuple(param_value)),)
|
|
84
|
+
|
|
85
|
+
matches = []
|
|
86
|
+
for match in rule.matches:
|
|
87
|
+
matches.append(
|
|
88
|
+
(
|
|
89
|
+
match.name,
|
|
90
|
+
tuple(
|
|
91
|
+
(param, tuple(value))
|
|
92
|
+
for param, value in sorted(match.get_all_parameters().items())
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
# ensure that matches are sorted for consistency with matching
|
|
97
|
+
fields["matches"] = tuple(sorted(matches))
|
|
98
|
+
|
|
99
|
+
return cls(**fields)
|
|
100
|
+
|
|
101
|
+
def to_iptc(self):
|
|
102
|
+
rule = iptc.Rule()
|
|
103
|
+
rule.protocol = self.protocol
|
|
104
|
+
rule.src = self.src
|
|
105
|
+
rule.dst = self.dst
|
|
106
|
+
target = rule.create_target(self.target)
|
|
107
|
+
for param_name, param_value in self.target_parameters:
|
|
108
|
+
target.set_parameter(param_name, param_value)
|
|
109
|
+
for name, params in self.matches:
|
|
110
|
+
match = rule.create_match(name)
|
|
111
|
+
for param_name, param_value in params:
|
|
112
|
+
match.set_parameter(param_name, param_value)
|
|
113
|
+
return rule
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@contextlib.contextmanager
|
|
117
|
+
def iptables_txn(table):
|
|
118
|
+
"""Temporarily disable autocommit and commit at the end.
|
|
119
|
+
|
|
120
|
+
If an exception occurs, changes are rolled back.
|
|
121
|
+
|
|
122
|
+
By default, changes to iptables rules are applied immediately. In some
|
|
123
|
+
cases, we want to avoid that.
|
|
124
|
+
|
|
125
|
+
https://github.com/ldx/python-iptables#autocommit
|
|
126
|
+
"""
|
|
127
|
+
assert table.autocommit is True, table.autocommit
|
|
128
|
+
try:
|
|
129
|
+
table.autocommit = False
|
|
130
|
+
yield
|
|
131
|
+
table.commit()
|
|
132
|
+
finally:
|
|
133
|
+
table.refresh()
|
|
134
|
+
table.autocommit = True
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class ChainDoesNotExist(Exception):
|
|
138
|
+
pass
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def all_chains():
|
|
142
|
+
return {chain.name for chain in iptc.Table(iptc.Table.FILTER).chains}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def ensure_chain(chain, rules):
|
|
146
|
+
"""Idempotently ensure a chain exists and has an exact set of rules.
|
|
147
|
+
|
|
148
|
+
This function creates or updates an existing chain to match the rules
|
|
149
|
+
passed in.
|
|
150
|
+
|
|
151
|
+
This function will not reorder existing rules, but any new rules are always
|
|
152
|
+
inserted at the front of the chain.
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
current_rules = set(list_chain(chain))
|
|
156
|
+
except ChainDoesNotExist:
|
|
157
|
+
create_chain(chain)
|
|
158
|
+
current_rules = set()
|
|
159
|
+
|
|
160
|
+
for rule in rules:
|
|
161
|
+
if rule not in current_rules:
|
|
162
|
+
insert_rule(chain, rule)
|
|
163
|
+
|
|
164
|
+
extra_rules = current_rules - set(rules)
|
|
165
|
+
if extra_rules:
|
|
166
|
+
delete_rules(chain, extra_rules)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _rule_sort_key(rule_tuple):
|
|
170
|
+
old_index, rule = rule_tuple
|
|
171
|
+
target_name = rule.target
|
|
172
|
+
return (RULE_TARGET_SORT_ORDER.get(target_name, 0), old_index)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def reorder_chain(chain_name):
|
|
176
|
+
"""Ensure that any REJECT rules are last, and any LOG rules are second-to-last"""
|
|
177
|
+
|
|
178
|
+
table = iptc.Table(iptc.Table.FILTER)
|
|
179
|
+
with iptables_txn(table):
|
|
180
|
+
rules = list_chain(chain_name)
|
|
181
|
+
chain = iptc.Chain(table, chain_name)
|
|
182
|
+
|
|
183
|
+
# sort the rules by rule_key, which uses (RULE_TARGET_SORT_ORDER, idx)
|
|
184
|
+
sorted_rules_with_indices = sorted(enumerate(rules), key=_rule_sort_key)
|
|
185
|
+
|
|
186
|
+
for new_index, (old_index, rule) in enumerate(sorted_rules_with_indices):
|
|
187
|
+
if new_index == old_index:
|
|
188
|
+
continue
|
|
189
|
+
log.debug(f"reordering chain {chain_name} rule {rule} to #{new_index}")
|
|
190
|
+
chain.replace_rule(rule.to_iptc(), new_index)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def ensure_rule(chain, rule):
|
|
194
|
+
rules = list_chain(chain)
|
|
195
|
+
if rule not in rules:
|
|
196
|
+
insert_rule(chain, rule)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def insert_rule(chain_name, rule):
|
|
200
|
+
log.debug(f"adding rule to {chain_name}: {rule}")
|
|
201
|
+
chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), chain_name)
|
|
202
|
+
chain.insert_rule(rule.to_iptc())
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def delete_rules(chain_name, rules):
|
|
206
|
+
log.debug(f"deleting rules from {chain_name}: {rules}")
|
|
207
|
+
table = iptc.Table(iptc.Table.FILTER)
|
|
208
|
+
with iptables_txn(table):
|
|
209
|
+
chain = iptc.Chain(table, chain_name)
|
|
210
|
+
for potential_rule in chain.rules:
|
|
211
|
+
if Rule.from_iptc(potential_rule) in rules:
|
|
212
|
+
chain.delete_rule(potential_rule)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def create_chain(chain_name):
|
|
216
|
+
log.debug(f"creating chain: {chain_name}")
|
|
217
|
+
iptc.Table(iptc.Table.FILTER).create_chain(chain_name)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def delete_chain(chain_name):
|
|
221
|
+
log.debug(f"deleting chain: {chain_name}")
|
|
222
|
+
chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), chain_name)
|
|
223
|
+
chain.flush()
|
|
224
|
+
chain.delete()
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def list_chain(chain_name):
|
|
228
|
+
"""List rules in a chain.
|
|
229
|
+
|
|
230
|
+
Returns a list of iptables rules, or raises ChainDoesNotExist.
|
|
231
|
+
"""
|
|
232
|
+
table = iptc.Table(iptc.Table.FILTER)
|
|
233
|
+
chain = iptc.Chain(table, chain_name)
|
|
234
|
+
# TODO: is there any way to do this without listing all chains? (probably slow)
|
|
235
|
+
# If the chain doesn't exist, chain.rules will be an empty list, so we need
|
|
236
|
+
# to make sure the chain actually _does_ exist.
|
|
237
|
+
if chain in table.chains:
|
|
238
|
+
return tuple(Rule.from_iptc(rule) for rule in chain.rules)
|
|
239
|
+
else:
|
|
240
|
+
raise ChainDoesNotExist(chain_name)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Copyright 2015-2019 Yelp Inc.
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
from typing import List
|
|
14
|
+
from typing import Mapping
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
import service_configuration_lib
|
|
18
|
+
|
|
19
|
+
from paasta_tools.kubernetes_tools import sanitised_cr_name
|
|
20
|
+
from paasta_tools.long_running_service_tools import LongRunningServiceConfig
|
|
21
|
+
from paasta_tools.long_running_service_tools import LongRunningServiceConfigDict
|
|
22
|
+
from paasta_tools.utils import BranchDictV2
|
|
23
|
+
from paasta_tools.utils import deep_merge_dictionaries
|
|
24
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
25
|
+
from paasta_tools.utils import load_service_instance_config
|
|
26
|
+
from paasta_tools.utils import load_v2_deployments_json
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class KafkaClusterDeploymentConfigDict(LongRunningServiceConfigDict, total=False):
|
|
30
|
+
replicas: int
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class KafkaClusterDeploymentConfig(LongRunningServiceConfig):
|
|
34
|
+
config_dict: KafkaClusterDeploymentConfigDict
|
|
35
|
+
|
|
36
|
+
config_filename_prefix = "kafkacluster"
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
service: str,
|
|
41
|
+
cluster: str,
|
|
42
|
+
instance: str,
|
|
43
|
+
config_dict: KafkaClusterDeploymentConfigDict,
|
|
44
|
+
branch_dict: Optional[BranchDictV2],
|
|
45
|
+
soa_dir: str = DEFAULT_SOA_DIR,
|
|
46
|
+
) -> None:
|
|
47
|
+
|
|
48
|
+
super().__init__(
|
|
49
|
+
cluster=cluster,
|
|
50
|
+
instance=instance,
|
|
51
|
+
service=service,
|
|
52
|
+
soa_dir=soa_dir,
|
|
53
|
+
config_dict=config_dict,
|
|
54
|
+
branch_dict=branch_dict,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def get_instances(self, with_limit: bool = True) -> int:
|
|
58
|
+
return self.config_dict.get("replicas", 1)
|
|
59
|
+
|
|
60
|
+
def validate(
|
|
61
|
+
self,
|
|
62
|
+
params: List[str] = [
|
|
63
|
+
"cpus",
|
|
64
|
+
"security",
|
|
65
|
+
"dependencies_reference",
|
|
66
|
+
"deploy_group",
|
|
67
|
+
],
|
|
68
|
+
) -> List[str]:
|
|
69
|
+
# Use InstanceConfig to validate shared config keys like cpus and mem
|
|
70
|
+
# TODO: add mem back to this list once we fix PAASTA-15582 and
|
|
71
|
+
# move to using the same units as flink/marathon etc.
|
|
72
|
+
error_msgs = super().validate(params=params)
|
|
73
|
+
|
|
74
|
+
if error_msgs:
|
|
75
|
+
name = self.get_instance()
|
|
76
|
+
return [f"{name}: {msg}" for msg in error_msgs]
|
|
77
|
+
else:
|
|
78
|
+
return []
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def load_kafkacluster_instance_config(
|
|
82
|
+
service: str,
|
|
83
|
+
instance: str,
|
|
84
|
+
cluster: str,
|
|
85
|
+
load_deployments: bool = True,
|
|
86
|
+
soa_dir: str = DEFAULT_SOA_DIR,
|
|
87
|
+
) -> KafkaClusterDeploymentConfig:
|
|
88
|
+
"""Read a service instance's configuration for KafkaCluster.
|
|
89
|
+
|
|
90
|
+
If a branch isn't specified for a config, the 'branch' key defaults to
|
|
91
|
+
paasta-${cluster}.${instance}.
|
|
92
|
+
|
|
93
|
+
:param service: The service name
|
|
94
|
+
:param instance: The instance of the service to retrieve
|
|
95
|
+
:param cluster: The cluster to read the configuration for
|
|
96
|
+
:param load_deployments: A boolean indicating if the corresponding deployments.json for this service
|
|
97
|
+
should also be loaded
|
|
98
|
+
:param soa_dir: The SOA configuration directory to read from
|
|
99
|
+
:returns: A dictionary of whatever was in the config for the service instance"""
|
|
100
|
+
general_config = service_configuration_lib.read_service_configuration(
|
|
101
|
+
service, soa_dir=soa_dir
|
|
102
|
+
)
|
|
103
|
+
instance_config = load_service_instance_config(
|
|
104
|
+
service, instance, "kafkacluster", cluster, soa_dir=soa_dir
|
|
105
|
+
)
|
|
106
|
+
general_config = deep_merge_dictionaries(
|
|
107
|
+
overrides=instance_config, defaults=general_config
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
branch_dict: Optional[BranchDictV2] = None
|
|
111
|
+
if load_deployments:
|
|
112
|
+
deployments_json = load_v2_deployments_json(service, soa_dir=soa_dir)
|
|
113
|
+
temp_instance_config = KafkaClusterDeploymentConfig(
|
|
114
|
+
service=service,
|
|
115
|
+
cluster=cluster,
|
|
116
|
+
instance=instance,
|
|
117
|
+
config_dict=general_config,
|
|
118
|
+
branch_dict=None,
|
|
119
|
+
soa_dir=soa_dir,
|
|
120
|
+
)
|
|
121
|
+
branch = temp_instance_config.get_branch()
|
|
122
|
+
deploy_group = temp_instance_config.get_deploy_group()
|
|
123
|
+
branch_dict = deployments_json.get_branch_dict(service, branch, deploy_group)
|
|
124
|
+
|
|
125
|
+
return KafkaClusterDeploymentConfig(
|
|
126
|
+
service=service,
|
|
127
|
+
cluster=cluster,
|
|
128
|
+
instance=instance,
|
|
129
|
+
config_dict=general_config,
|
|
130
|
+
branch_dict=branch_dict,
|
|
131
|
+
soa_dir=soa_dir,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# TODO: read this from CRD in service configs
|
|
136
|
+
def cr_id(service: str, instance: str) -> Mapping[str, str]:
|
|
137
|
+
return dict(
|
|
138
|
+
group="yelp.com",
|
|
139
|
+
version="v1alpha1",
|
|
140
|
+
namespace="paasta-kafkaclusters",
|
|
141
|
+
plural="kafkaclusters",
|
|
142
|
+
name=sanitised_cr_name(service, instance),
|
|
143
|
+
)
|
|
File without changes
|
|
File without changes
|