├── .dockerignore ├── .gitattributes ├── .github ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── gitlab-mirror.yml ├── .gitignore ├── .gitlab-ci.yml ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── build-scale.sh ├── build-support.sh ├── dev-build-push.sh ├── dockerfiles ├── examples │ ├── ace │ │ ├── Dockerfile │ │ ├── ace.batchwiz │ │ ├── ace.wiz │ │ ├── centroid.py │ │ ├── job_type.yml │ │ ├── oli-vis.wmd │ │ └── runOpticks.sh │ ├── binary-parse │ │ ├── Dockerfile │ │ ├── job_type.yml │ │ └── parse_binary.sh │ ├── landsat-base │ │ ├── Dockerfile │ │ └── epel-release-7-5.noarch.rpm │ ├── landsat-ndwi │ │ ├── Dockerfile │ │ ├── job_type.yml │ │ └── landsat_ndwi.py │ ├── landsat-parse │ │ ├── Dockerfile │ │ ├── job_type.yml │ │ └── parse_landsat.sh │ ├── landsat-tiles │ │ ├── Dockerfile │ │ ├── job_type.yml │ │ └── landsat_tiles.sh │ ├── pca │ │ ├── Dockerfile │ │ ├── job_type.yml │ │ ├── pca.batchwiz │ │ ├── pca.wiz │ │ └── runOpticks.sh │ ├── read-bytes-seed │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── scale-job.py │ │ └── seed.manifest.json │ ├── read-bytes │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ └── scale-job.py │ ├── source-metadata │ │ ├── Dockerfile │ │ ├── generate-metadata.sh │ │ └── seed.manifest.json │ ├── tad │ │ ├── Dockerfile │ │ ├── centroid.py │ │ ├── job_type.yml │ │ ├── runOpticks.sh │ │ ├── tad.batchwiz │ │ └── tad.wiz │ ├── test-seed │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── seed.manifest.json │ │ └── test.py │ └── vash │ │ ├── Dockerfile │ │ ├── Vash.jar │ │ ├── job_type.yml │ │ └── run.sh ├── fluentd │ ├── Dockerfile │ ├── README.md │ ├── fluent.conf │ └── scripts │ │ ├── entrypoint.sh │ │ └── inject-es-config.py ├── framework │ └── scale │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app-templates │ │ ├── db.json │ │ ├── elasticsearch.json │ │ ├── fluentd.json │ │ ├── logstash.json │ │ ├── rabbitmq.json │ │ ├── silo.json │ │ ├── ui.json │ │ └── webserver.json │ │ ├── bootstrap.py │ │ ├── country_data.json.bz2 │ │ ├── entryPoint.sh │ │ └── scale.conf └── vault │ ├── Dockerfile │ ├── Readme.md │ ├── config.hcl │ └── run-vault ├── generate-release.sh ├── graphics ├── PoweredByScale │ ├── pbscale-large-earth.png │ ├── pbscale-large-earth.svg │ ├── pbscale-large-fill.png │ ├── pbscale-large-fill.svg │ ├── pbscale-large.ai │ ├── pbscale-small-earth.png │ ├── pbscale-small-earth.svg │ ├── pbscale-small-fill.png │ ├── pbscale-small-fill.svg │ └── pbscale-small.ai ├── images │ ├── icon-service-scale-large.png │ ├── icon-service-scale-medium.png │ ├── icon-service-scale-small.png │ ├── icons │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ └── safari-pinned-tab.svg │ ├── navigation-logo.png │ ├── navigation-logo.psd │ ├── scale3-a-gradient-1.png │ ├── scale3-a-gradient.png │ ├── scale3-a-solid.png │ ├── scale3-b-gradient.png │ ├── scale3-b-solid-240.png │ ├── scale3-b-solid-60.png │ ├── scale3-b-solid.png │ ├── scale3-lightbg-200.png │ ├── scale3-lightbg-48.png │ ├── scale3-lightbg-64.png │ ├── scale3-transparent-128.png │ └── scale3.ai ├── models │ ├── Scale_Base.stl │ ├── Scale_Logo.stl │ ├── Scale_Model.JPG │ └── models.txt ├── scale3-logo.svg └── scale3.ai ├── hooks └── build ├── push-docs.sh ├── scale-ui └── index.html ├── scale ├── .dockerignore ├── .gitignore ├── README.md ├── accounts │ ├── __init__.py │ ├── apps.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── scale_superuser.py │ ├── serializers.py │ ├── static │ │ └── accounts │ │ │ └── geoaxis.png │ ├── templates │ │ └── accounts │ │ │ └── login.html │ ├── test │ │ ├── __init__.py │ │ └── test_views.py │ ├── urls.py │ └── views.py ├── batch │ ├── __init__.py │ ├── apps.py │ ├── configuration │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── exceptions.py │ │ └── json │ │ │ ├── __init__.py │ │ │ └── configuration_v6.py │ ├── definition │ │ ├── __init__.py │ │ ├── definition.py │ │ ├── exceptions.py │ │ └── json │ │ │ ├── __init__.py │ │ │ └── definition_v6.py │ ├── exceptions.py │ ├── fixtures │ │ └── batch_job_types.json │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── scale_batch_creator.py │ ├── messages │ │ ├── __init__.py │ │ ├── create_batch_recipes.py │ │ └── update_batch_metrics.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20170412_1225.py │ │ ├── 0003_auto_20170706_1948.py │ │ ├── 0004_auto_20180122_1444.py │ │ ├── 0005_auto_20180314_1827.py │ │ ├── 0006_auto_20180401_0218.py │ │ ├── 0007_auto_20180516_1915.py │ │ ├── 0008_auto_20190226_1255.py │ │ ├── 0009_auto_20190531_1318.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_configuration_v6.py │ │ │ └── test_configuration.py │ │ ├── definition │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_definition_v6.py │ │ │ └── test_definition.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ └── test_scale_batch_creator.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ ├── test_create_batch_recipes.py │ │ │ └── test_update_batch_metrics.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── cli │ ├── __init__.py │ └── management │ │ ├── __init__.py │ │ └── commands │ │ ├── __init__.py │ │ └── migratedata.py ├── data │ ├── __init__.py │ ├── apps.py │ ├── data │ │ ├── __init__.py │ │ ├── data.py │ │ ├── data_util.py │ │ ├── exceptions.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ ├── data_v1.py │ │ │ └── data_v6.py │ │ └── value.py │ ├── dataset │ │ ├── __init__.py │ │ ├── dataset.py │ │ └── json │ │ │ ├── __init__.py │ │ │ └── dataset_v6.py │ ├── exceptions.py │ ├── filter │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── filter.py │ │ └── json │ │ │ ├── __init__.py │ │ │ └── filter_v6.py │ ├── interface │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── interface.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ └── interface_v6.py │ │ └── parameter.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── data │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ ├── test_data_v1.py │ │ │ │ └── test_data_v6.py │ │ │ ├── test_data.py │ │ │ └── test_value.py │ │ ├── dataset │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_dataset_v6.py │ │ │ └── test_dataset.py │ │ ├── filter │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_filter_v6.py │ │ │ └── test_filter.py │ │ ├── interface │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_interface_v6.py │ │ │ ├── test_interface.py │ │ │ └── test_parameter.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── diagnostic │ ├── __init__.py │ ├── apps.py │ ├── exceptions.py │ ├── fixtures │ │ ├── diagnostic_errors.json │ │ ├── diagnostic_job_types.json │ │ └── diagnostic_recipe_types.json │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── scale_bake.py │ │ │ ├── scale_count.py │ │ │ ├── scale_hello.py │ │ │ └── scale_roulette.py │ ├── test │ │ ├── __init__.py │ │ └── test_views.py │ ├── urls.py │ └── views.py ├── docs │ ├── Makefile │ ├── _static │ │ ├── images │ │ │ └── architecture │ │ │ │ ├── Scale_Architecture.pptx │ │ │ │ └── overview.png │ │ ├── scale3-transparent-128.png │ │ └── style.css │ ├── _templates │ │ └── layout.html │ ├── algorithm_integration │ │ ├── index.rst │ │ ├── results_manifest.rst │ │ ├── step1.rst │ │ ├── step2.rst │ │ ├── step3.rst │ │ ├── step4.rst │ │ └── step5.rst │ ├── architecture │ │ ├── django │ │ │ ├── .gitignore │ │ │ └── index.rst │ │ ├── index.rst │ │ ├── jobs │ │ │ ├── batch_definition.rst │ │ │ ├── error_interface.rst │ │ │ ├── exe_configuration.rst │ │ │ ├── index.rst │ │ │ ├── job_configuration.rst │ │ │ ├── job_data.rst │ │ │ ├── job_interface.rst │ │ │ ├── recipe_data.rst │ │ │ ├── recipe_definition.rst │ │ │ ├── resources.rst │ │ │ ├── seed.rst │ │ │ └── task_results.rst │ │ ├── logs.rst │ │ ├── messaging.rst │ │ ├── overview.rst │ │ ├── port.rst │ │ ├── scan.rst │ │ ├── strike.rst │ │ ├── triggers.rst │ │ └── workspaces.rst │ ├── build_openapi_docs.py │ ├── build_wiki_docs.py │ ├── cli │ │ ├── getting_started.rst │ │ ├── index.rst │ │ └── overview.rst │ ├── conf.py │ ├── development │ │ └── index.rst │ ├── images │ │ └── algorithm_integration │ │ │ ├── new_recipe.png │ │ │ ├── new_recipe_entry.png │ │ │ ├── recipe_input.png │ │ │ ├── setting_up_trigger.png │ │ │ └── trigger_input.png │ ├── index.rst │ ├── install │ │ └── index.rst │ ├── make.bat │ ├── overview │ │ └── index.rst │ ├── rest │ │ ├── index.rst │ │ └── v6 │ │ │ ├── batch.rst │ │ │ ├── batch.yml │ │ │ ├── data.rst │ │ │ ├── data.yml │ │ │ ├── deprecated.rst │ │ │ ├── diagnostic.rst │ │ │ ├── diagnostic.yml │ │ │ ├── error.rst │ │ │ ├── error.yml │ │ │ ├── ingest.rst │ │ │ ├── ingest.yml │ │ │ ├── job.rst │ │ │ ├── job.yml │ │ │ ├── job_type.rst │ │ │ ├── job_type.yml │ │ │ ├── metrics.rst │ │ │ ├── metrics.yml │ │ │ ├── node.rst │ │ │ ├── node.yml │ │ │ ├── openapi.yml │ │ │ ├── queue.rst │ │ │ ├── queue.yml │ │ │ ├── recipe.rst │ │ │ ├── recipe.yml │ │ │ ├── recipe_type.rst │ │ │ ├── recipe_type.yml │ │ │ ├── scale_file.rst │ │ │ ├── scale_file.yml │ │ │ ├── scan.rst │ │ │ ├── scan.yml │ │ │ ├── scheduler.rst │ │ │ ├── scheduler.yml │ │ │ ├── strike.rst │ │ │ ├── strike.yml │ │ │ ├── system.rst │ │ │ ├── system.yml │ │ │ ├── timeline.rst │ │ │ ├── timeline.yml │ │ │ ├── workspace.rst │ │ │ └── workspace.yml │ └── wiki │ │ ├── mkdocs.yml │ │ └── scale.wiki │ │ └── setup_wiki_git.sh ├── environment │ ├── cent7-init.sh │ ├── cloud-init.sh │ ├── legacy-cloud-init.sh │ ├── mac-init.sh │ └── win-init.bat ├── error │ ├── __init__.py │ ├── apps.py │ ├── exceptions.py │ ├── fixtures │ │ └── basic_errors.json │ ├── handlers.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151217_1319.py │ │ ├── 0003_error_is_builtin.py │ │ ├── 0004_error_should_be_retried.py │ │ ├── 0005_auto_20180621_2110.py │ │ ├── 0006_update_retried.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── ingest │ ├── __init__.py │ ├── apps.py │ ├── fixtures │ │ ├── ingest_errors.json │ │ └── ingest_job_types.json │ ├── handlers │ │ ├── __init__.py │ │ ├── file_handler.py │ │ └── file_rule.py │ ├── ingest_event_serializers.py │ ├── ingest_job.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── scale_ingest.py │ │ │ ├── scale_scan.py │ │ │ └── scale_strike.py │ ├── messages │ │ ├── __init__.py │ │ └── create_ingest_jobs.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20160414_0937.py │ │ ├── 0003_auto_20160711_1044.py │ │ ├── 0004_auto_20160711_1058.py │ │ ├── 0005_auto_20160728_1243.py │ │ ├── 0006_auto_20161202_1621.py │ │ ├── 0007_auto_20170127_1327.py │ │ ├── 0008_auto_20170127_1332.py │ │ ├── 0009_scan.py │ │ ├── 0010_auto_20170206_1646.py │ │ ├── 0011_auto_20170302_2130.py │ │ ├── 0012_scan_file_count.py │ │ ├── 0013_auto_20170406_1517.py │ │ ├── 0014_auto_20170412_1225.py │ │ ├── 0015_ingestevent.py │ │ ├── 0016_ingest_data_type_tags.py │ │ ├── 0017_populate_data_type_tags.py │ │ ├── 0018_remove_ingest_data_type.py │ │ ├── 0019_filename_index.py │ │ └── __init__.py │ ├── models.py │ ├── scan │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── configuration_v6.py │ │ │ └── scan_configuration.py │ │ └── scanners │ │ │ ├── __init__.py │ │ │ ├── dir_scanner.py │ │ │ ├── exceptions.py │ │ │ ├── factory.py │ │ │ ├── s3_scanner.py │ │ │ └── scanner.py │ ├── serializers.py │ ├── strike │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── configuration_v6.py │ │ │ └── strike_configuration.py │ │ └── monitors │ │ │ ├── __init__.py │ │ │ ├── dir_monitor.py │ │ │ ├── exceptions.py │ │ │ ├── factory.py │ │ │ ├── monitor.py │ │ │ └── s3_monitor.py │ ├── test │ │ ├── __init__.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ └── test_create_ingest_jobs.py │ │ ├── scan │ │ │ ├── __init__.py │ │ │ ├── configuration │ │ │ │ ├── __init__.py │ │ │ │ └── test_scan_configuration.py │ │ │ └── scanners │ │ │ │ ├── __init__.py │ │ │ │ ├── test_dir_scanner.py │ │ │ │ └── test_s3_scanner.py │ │ ├── strike │ │ │ ├── __init__.py │ │ │ ├── configuration │ │ │ │ ├── __init__.py │ │ │ │ ├── json │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── test_configuration_v6.py │ │ │ │ └── test_strike_configuration.py │ │ │ └── monitors │ │ │ │ ├── __init__.py │ │ │ │ ├── test_dir_monitor.py │ │ │ │ └── test_s3_monitor.py │ │ ├── test_app.py │ │ ├── test_ingest_job.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ ├── triggers │ │ │ ├── __init__.py │ │ │ └── test_ingest_recipe_handler.py │ │ └── utils.py │ ├── triggers │ │ ├── __init__.py │ │ └── ingest_recipe_handler.py │ ├── urls.py │ └── views.py ├── job │ ├── __init__.py │ ├── apps.py │ ├── clock.py │ ├── configuration │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── data │ │ │ ├── __init__.py │ │ │ ├── data_file.py │ │ │ ├── exceptions.py │ │ │ ├── job_connection.py │ │ │ └── job_data.py │ │ ├── exceptions.py │ │ ├── interface │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── job_interface.py │ │ │ ├── job_interface_1_0.py │ │ │ ├── job_interface_1_1.py │ │ │ ├── job_interface_1_2.py │ │ │ ├── job_interface_1_3.py │ │ │ └── scale_file.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ └── job_config_v6.py │ │ ├── mount.py │ │ └── results │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── job_results.py │ │ │ └── results_manifest │ │ │ ├── __init__.py │ │ │ ├── results_manifest.py │ │ │ └── results_manifest_1_0.py │ ├── data │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── job_connection.py │ │ ├── job_data.py │ │ └── types.py │ ├── deprecation.py │ ├── error │ │ ├── __init__.py │ │ ├── error.py │ │ └── mapping.py │ ├── errors.py │ ├── exceptions.py │ ├── execution │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── configurators.py │ │ │ ├── docker_param.py │ │ │ ├── exceptions.py │ │ │ ├── input_file.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ ├── exe_config.py │ │ │ │ ├── exe_config_1_0.py │ │ │ │ └── exe_config_1_1.py │ │ │ ├── volume.py │ │ │ └── workspace.py │ │ ├── container.py │ │ ├── exceptions.py │ │ ├── job_exe.py │ │ ├── manager.py │ │ ├── metrics.py │ │ └── tasks │ │ │ ├── __init__.py │ │ │ ├── cleanup_task.py │ │ │ ├── exe_task.py │ │ │ ├── json │ │ │ ├── __init__.py │ │ │ └── results │ │ │ │ ├── __init__.py │ │ │ │ └── task_results.py │ │ │ ├── main_task.py │ │ │ ├── post_task.py │ │ │ ├── pre_task.py │ │ │ └── pull_task.py │ ├── fixtures │ │ ├── basic_job_errors.json │ │ └── basic_system_job_types.json │ ├── handlers │ │ ├── __init__.py │ │ └── inputs │ │ │ ├── __init__.py │ │ │ ├── base_input.py │ │ │ ├── file.py │ │ │ ├── files.py │ │ │ └── property.py │ ├── job_type_serializers.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── scale_clock.py │ │ │ ├── scale_post_steps.py │ │ │ └── scale_pre_steps.py │ ├── messages │ │ ├── __init__.py │ │ ├── blocked_jobs.py │ │ ├── cancel_jobs.py │ │ ├── cancel_jobs_bulk.py │ │ ├── completed_jobs.py │ │ ├── create_jobs.py │ │ ├── failed_jobs.py │ │ ├── job_exe_end.py │ │ ├── pending_jobs.py │ │ ├── process_job_input.py │ │ ├── publish_job.py │ │ ├── purge_jobs.py │ │ ├── running_jobs.py │ │ ├── spawn_delete_files_job.py │ │ ├── uncancel_jobs.py │ │ └── unpublish_jobs.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_jobexecution_job_metrics.py │ │ ├── 0003_auto_20151016_0849.py │ │ ├── 0004_auto_20151020_1059.py │ │ ├── 0005_auto_20151030_1402.py │ │ ├── 0006_auto_20151106_1608.py │ │ ├── 0007_job_job_type_rev.py │ │ ├── 0008_jobtype_trigger_rule.py │ │ ├── 0009_jobtype_revision_num.py │ │ ├── 0010_auto_20151208_1503.py │ │ ├── 0011_jobtype_max_scheduled.py │ │ ├── 0012_auto_20160310_1318.py │ │ ├── 0013_auto_20160316_1805.py │ │ ├── 0014_auto_20160317_1208.py │ │ ├── 0015_auto_20160420_1345.py │ │ ├── 0016_auto_20160421_1553.py │ │ ├── 0017_auto_20160426_1556.py │ │ ├── 0018_auto_20160804_1402.py │ │ ├── 0019_taskupdate.py │ │ ├── 0020_auto_20161110_1517.py │ │ ├── 0021_auto_20161115_1524.py │ │ ├── 0022_jobtype_configuration.py │ │ ├── 0023_jobtype_shared_mem_required.py │ │ ├── 0024_auto_20170412_1225.py │ │ ├── 0025_auto_20170504_1534.py │ │ ├── 0026_auto_20170510_1151.py │ │ ├── 0027_auto_20170615_1652.py │ │ ├── 0028_jobinputfile.py │ │ ├── 0029_auto_20170707_1034.py │ │ ├── 0030_remove_job_configuration.py │ │ ├── 0031_auto_20170822_1544.py │ │ ├── 0032_job_node.py │ │ ├── 0033_auto_20180105_2113.py │ │ ├── 0034_auto_20180112_1759.py │ │ ├── 0035_auto_20180122_1444.py │ │ ├── 0036_auto_20180123_2042.py │ │ ├── 0037_auto_20180314_1827.py │ │ ├── 0038_auto_20180622_1510.py │ │ ├── 0039_auto_20180622_1827.py │ │ ├── 0040_auto_20180709_1807.py │ │ ├── 0041_jobtypetag.py │ │ ├── 0042_auto_20180802_1830.py │ │ ├── 0043_remove_jobtypetag_job_type.py │ │ ├── 0044_jobtypetag_job_type.py │ │ ├── 0045_auto_20180830_1812.py │ │ ├── 0046_jobtyperevision_docker_image.py │ │ ├── 0047_jobtype_versionarray.py │ │ ├── 0048_auto_20180913_1632.py │ │ ├── 0049_auto_20180927_1531.py │ │ ├── 0050_job_configuration.py │ │ ├── 0051_auto_20190211_1500.py │ │ ├── 0052_jobtype_is_published.py │ │ ├── 0053_jobtype_unmet_resources.py │ │ ├── 0054_convert_manifest.py │ │ ├── 0055_jobtype_v5_deprecation.py │ │ ├── 0056_convert_strike_jobs.py │ │ ├── 0057_auto_20190603_1846.py │ │ └── __init__.py │ ├── models.py │ ├── seed │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── manifest.py │ │ ├── metadata.py │ │ ├── results │ │ │ ├── __init__.py │ │ │ ├── job_results.py │ │ │ └── outputs_json.py │ │ ├── schema │ │ │ ├── seed.manifest.schema.json │ │ │ └── seed.metadata.schema.json │ │ └── types.py │ ├── serializers.py │ ├── tasks │ │ ├── __init__.py │ │ ├── base_task.py │ │ ├── health_task.py │ │ ├── manager.py │ │ ├── node_task.py │ │ ├── pull_task.py │ │ └── update.py │ ├── test │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── data │ │ │ │ ├── __init__.py │ │ │ │ ├── test_job_connection.py │ │ │ │ └── test_job_data.py │ │ │ ├── interface │ │ │ │ ├── __init__.py │ │ │ │ ├── test_configuration_interface.py │ │ │ │ ├── test_job_interface.py │ │ │ │ └── test_scale_file.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_job_config_v6.py │ │ │ ├── results │ │ │ │ ├── __init__.py │ │ │ │ ├── test_job_results.py │ │ │ │ └── test_results_manifest.py │ │ │ └── test_configuration.py │ │ ├── error │ │ │ ├── __init__.py │ │ │ ├── test_error.py │ │ │ └── test_mapping.py │ │ ├── execution │ │ │ ├── __init__.py │ │ │ ├── configuration │ │ │ │ ├── __init__.py │ │ │ │ ├── json │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── test_exe_config.py │ │ │ │ └── test_configurators.py │ │ │ ├── tasks │ │ │ │ ├── __init__.py │ │ │ │ ├── json │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── results │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── test_task_results.py │ │ │ │ ├── test_post_task.py │ │ │ │ └── test_pre_task.py │ │ │ ├── test_job_exe.py │ │ │ ├── test_manager.py │ │ │ └── test_metrics.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ ├── test_scale_post_steps.py │ │ │ │ └── test_scale_pre_steps.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ ├── test_blocked_jobs.py │ │ │ ├── test_cancel_jobs.py │ │ │ ├── test_cancel_jobs_bulk.py │ │ │ ├── test_completed_jobs.py │ │ │ ├── test_create_jobs.py │ │ │ ├── test_failed_jobs.py │ │ │ ├── test_job_exe_end.py │ │ │ ├── test_pending_jobs.py │ │ │ ├── test_process_job_input.py │ │ │ ├── test_publish_job.py │ │ │ ├── test_purge_jobs.py │ │ │ ├── test_running_jobs.py │ │ │ ├── test_spawn_delete_files_job.py │ │ │ ├── test_uncancel_jobs.py │ │ │ └── test_unpublish_jobs.py │ │ ├── seed │ │ │ ├── __init__.py │ │ │ ├── results │ │ │ │ ├── __init__.py │ │ │ │ └── test_job_results.py │ │ │ ├── test_job_data.py │ │ │ ├── test_manifest.py │ │ │ ├── test_metadata.py │ │ │ └── test_types.py │ │ ├── tasks │ │ │ ├── __init__.py │ │ │ ├── test_base_task.py │ │ │ └── test_manager.py │ │ ├── test_clock.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── manage.py ├── mesos_api │ ├── __init__.py │ ├── api.py │ ├── apps.py │ ├── offers.py │ ├── tasks.py │ ├── unversioned │ │ ├── __init__.py │ │ └── agent.py │ └── utils.py ├── messaging │ ├── __init__.py │ ├── apps.py │ ├── backends │ │ ├── __init__.py │ │ ├── amqp.py │ │ ├── backend.py │ │ ├── factory.py │ │ └── sqs.py │ ├── exceptions.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── scale_echo_message.py │ │ │ ├── scale_message_handler.py │ │ │ └── scale_send_message.py │ ├── manager.py │ ├── messages │ │ ├── __init__.py │ │ ├── chain.py │ │ ├── echo.py │ │ ├── factory.py │ │ ├── fail.py │ │ └── message.py │ └── test │ │ ├── __init__.py │ │ ├── test_apps.py │ │ ├── test_backends.py │ │ ├── test_manager.py │ │ ├── test_manager_singleton.py │ │ └── test_messages.py ├── metrics │ ├── __init__.py │ ├── apps.py │ ├── daily_metrics.py │ ├── fixtures │ │ ├── metrics_job_types.json │ │ └── metrics_trigger_rules.json │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── scale_daily_metrics.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151007_1352.py │ │ ├── 0003_metricsingest.py │ │ ├── 0004_auto_20151104_1640.py │ │ ├── 0005_auto_20160415_1636.py │ │ ├── 0006_metricserror.py │ │ ├── 0007_auto_20161013_2333.py │ │ ├── 0008_occurred_datetime.py │ │ ├── 0009_revert_datetime.py │ │ ├── 0010_occurred_datetime.py │ │ └── __init__.py │ ├── models.py │ ├── registry.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── test_daily_metrics.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── node │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_node_pause_reason.py │ │ ├── 0003_node_is_paused_errors.py │ │ ├── 0004_auto_20170524_1639.py │ │ ├── 0005_auto_20181220_2014.py │ │ ├── 0006_node_last_offer_received.py │ │ └── __init__.py │ ├── models.py │ ├── resources │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── gpu_manager.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ └── resources.py │ │ ├── node_resources.py │ │ └── resource.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── resources │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_resources.py │ │ │ └── test_gpu_manager.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── pip │ ├── docs.txt │ ├── production.txt │ └── requirements.txt ├── product │ ├── __init__.py │ ├── apps.py │ ├── configuration │ │ ├── __init__.py │ │ └── product_data_file.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20160622_1344.py │ │ ├── 0003_auto_20170127_1319.py │ │ ├── 0004_auto_20170127_1324.py │ │ ├── 0005_auto_20170127_1344.py │ │ ├── 0006_auto_20170127_1348.py │ │ ├── 0007_fileancestrylink_batch.py │ │ ├── 0009_auto_20170301_1130.py │ │ ├── 0010_auto_20170727_1349.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ └── test_product_data_file.py │ │ ├── test_models.py │ │ └── utils.py │ └── types.py ├── queue │ ├── __init__.py │ ├── apps.py │ ├── fixtures │ │ └── queue_trigger_rules.json │ ├── job_exe.py │ ├── job_load.py │ ├── messages │ │ ├── __init__.py │ │ ├── queued_jobs.py │ │ ├── requeue_jobs.py │ │ └── requeue_jobs_bulk.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_jobload.py │ │ ├── 0003_auto_20151023_1104.py │ │ ├── 0004_remove_queue_is_job_type_paused.py │ │ ├── 0005_queue_node_required.py │ │ ├── 0006_auto_20160316_1625.py │ │ ├── 0007_auto_20160421_1643.py │ │ ├── 0008_auto_20160421_1648.py │ │ ├── 0009_auto_20170412_1225.py │ │ ├── 0010_auto_20170615_1704.py │ │ ├── 0011_auto_20170616_1052.py │ │ ├── 0012_auto_20170616_1101.py │ │ ├── 0013_auto_20170720_1702.py │ │ ├── 0014_queue.py │ │ ├── 0015_auto_20170731_1527.py │ │ ├── 0016_auto_20180123_2037.py │ │ ├── 0017_queue_docker_image.py │ │ ├── 0018_queue_docker_image_populate.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ ├── test_queued_jobs.py │ │ │ ├── test_requeue_jobs.py │ │ │ └── test_requeue_jobs_bulk.py │ │ ├── test_job_load.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── recipe │ ├── __init__.py │ ├── apps.py │ ├── configuration │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── data │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── recipe_connection.py │ │ │ └── recipe_data.py │ │ ├── definition │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ └── recipe_definition.py │ │ ├── exceptions.py │ │ └── json │ │ │ ├── __init__.py │ │ │ └── recipe_config_v6.py │ ├── definition │ │ ├── __init__.py │ │ ├── connection.py │ │ ├── definition.py │ │ ├── exceptions.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ ├── definition_v1.py │ │ │ └── definition_v6.py │ │ └── node.py │ ├── diff │ │ ├── __init__.py │ │ ├── diff.py │ │ ├── exceptions.py │ │ ├── forced_nodes.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ ├── diff_v6.py │ │ │ └── forced_nodes_v6.py │ │ └── node.py │ ├── exceptions.py │ ├── handlers │ │ ├── __init__.py │ │ ├── connection.py │ │ ├── graph.py │ │ ├── graph_delta.py │ │ └── node.py │ ├── instance │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ └── recipe_v6.py │ │ ├── node.py │ │ └── recipe.py │ ├── messages │ │ ├── __init__.py │ │ ├── create_conditions.py │ │ ├── create_recipes.py │ │ ├── process_condition.py │ │ ├── process_recipe_input.py │ │ ├── purge_recipe.py │ │ ├── supersede_recipe_nodes.py │ │ ├── update_recipe.py │ │ ├── update_recipe_definition.py │ │ └── update_recipe_metrics.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151106_1409.py │ │ ├── 0003_recipe_recipe_type_rev.py │ │ ├── 0004_recipetype_trigger_rule.py │ │ ├── 0005_recipetype_revision_num.py │ │ ├── 0006_auto_20151125_1404.py │ │ ├── 0007_auto_20160310_1318.py │ │ ├── 0008_auto_20160317_1208.py │ │ ├── 0009_auto_20160511_2204.py │ │ ├── 0010_auto_20160330_1412.py │ │ ├── 0011_auto_20160330_1505.py │ │ ├── 0012_auto_20160330_1659.py │ │ ├── 0013_auto_20160331_1127.py │ │ ├── 0014_auto_20160608_1402.py │ │ ├── 0015_recipefile.py │ │ ├── 0016_recipefile_data.py │ │ ├── 0017_auto_20170412_1225.py │ │ ├── 0018_recipefile_recipe_input.py │ │ ├── 0019_recipetype_is_system.py │ │ ├── 0020_auto_20180119_0055.py │ │ ├── 0020_recipe_batch.py │ │ ├── 0021_auto_20180219_1916.py │ │ ├── 0022_auto_20180307_1617.py │ │ ├── 0023_auto_20180523_1247.py │ │ ├── 0024_auto_20180523_2057.py │ │ ├── 0025_auto_20180608_0114.py │ │ ├── 0026_auto_20180723_1914.py │ │ ├── 0027_auto_20181008_1756.py │ │ ├── 0027_auto_20181016_1344.py │ │ ├── 0028_auto_20181016_1349.py │ │ ├── 0029_auto_20181016_1431.py │ │ ├── 0030_auto_20181024_1607.py │ │ ├── 0031_auto_20181026_1417.py │ │ ├── 0032_recipe_type_link_tables.py │ │ ├── 0033_auto_20181102_0307.py │ │ ├── 0034_recipe_configuration.py │ │ ├── 0035_auto_20190126_2340.py │ │ ├── 0036_remove_recipetype_version.py │ │ ├── 0037_remove_recipetype_trigger_rule.py │ │ └── __init__.py │ ├── models.py │ ├── seed │ │ ├── __init__.py │ │ ├── recipe_connection.py │ │ ├── recipe_data.py │ │ ├── recipe_definition.py │ │ └── schema │ │ │ └── recipe_definition_2_0.json │ ├── serializers.py │ ├── test │ │ ├── __init__.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ ├── data │ │ │ │ ├── __init__.py │ │ │ │ └── test_recipe_data.py │ │ │ ├── definition │ │ │ │ ├── __init__.py │ │ │ │ └── test_recipe_definition.py │ │ │ ├── json │ │ │ │ └── test_recipe_config_v6.py │ │ │ └── test_configuration.py │ │ ├── definition │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ ├── test_definition_v1.py │ │ │ │ └── test_definition_v6.py │ │ │ └── test_definition.py │ │ ├── diff │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ ├── test_diff_v6.py │ │ │ │ └── test_forced_nodes_v6.py │ │ │ └── test_diff.py │ │ ├── handlers │ │ │ ├── __init__.py │ │ │ ├── test_graph.py │ │ │ └── test_graph_delta.py │ │ ├── instance │ │ │ ├── __init__.py │ │ │ ├── json │ │ │ │ ├── __init__.py │ │ │ │ └── test_recipe_v6.py │ │ │ └── test_recipe.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ ├── test_create_conditions.py │ │ │ ├── test_create_recipes.py │ │ │ ├── test_process_condition.py │ │ │ ├── test_process_recipe_input.py │ │ │ ├── test_purge_recipe.py │ │ │ ├── test_supersede_recipe_nodes.py │ │ │ ├── test_update_recipe.py │ │ │ ├── test_update_recipe_definition.py │ │ │ └── test_update_recipe_metrics.py │ │ ├── test_models.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── scale │ ├── .gitignore │ ├── __init__.py │ ├── __init__.py.template │ ├── custom_logging.py │ ├── local_settings_DOCS.py │ ├── local_settings_TRAVIS-CI.py │ ├── local_settings_dev.py │ ├── local_settings_docker.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── scheduler │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── cleanup │ │ ├── __init__.py │ │ ├── manager.py │ │ └── node.py │ ├── cluster_utils.py │ ├── configuration.py │ ├── database │ │ ├── __init__.py │ │ └── updater.py │ ├── dependencies │ │ ├── __init__.py │ │ └── manager.py │ ├── fixtures │ │ └── scheduler_errors.json │ ├── initialize.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── load_all_data.py │ │ │ ├── scale_db_update.py │ │ │ └── scale_scheduler.py │ ├── manager.py │ ├── messages │ │ ├── __init__.py │ │ └── restart_scheduler.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151007_1352.py │ │ ├── 0003_auto_20160201_0846.py │ │ ├── 0004_auto_20170209_1616.py │ │ ├── 0005_scheduler_queue_mode.py │ │ ├── 0006_scheduler_status.py │ │ ├── 0007_scheduler_num_message_handlers.py │ │ ├── 0008_auto_20171103_1334.py │ │ ├── 0009_scheduler_debugging_level.py │ │ ├── 0010_scheduler_resource_level.py │ │ ├── 0011_auto_20180517_1559.py │ │ ├── 0012_remove_scheduler_resource_level.py │ │ ├── 0013_auto_20181220_2014.py │ │ ├── 0014_clusterresources.py │ │ ├── 0015_auto_20200812_1929.py │ │ └── __init__.py │ ├── models.py │ ├── node │ │ ├── __init__.py │ │ ├── agent.py │ │ ├── conditions.py │ │ ├── manager.py │ │ └── node_class.py │ ├── recon │ │ ├── __init__.py │ │ └── manager.py │ ├── resources │ │ ├── __init__.py │ │ ├── agent.py │ │ ├── manager.py │ │ └── offer.py │ ├── scale_scheduler.py │ ├── scheduling │ │ ├── __init__.py │ │ ├── manager.py │ │ └── scheduling_node.py │ ├── serializers.py │ ├── sync │ │ ├── __init__.py │ │ ├── job_type_manager.py │ │ └── workspace_manager.py │ ├── task │ │ ├── __init__.py │ │ └── manager.py │ ├── tasks │ │ ├── __init__.py │ │ ├── db_update_task.py │ │ ├── manager.py │ │ ├── services │ │ │ ├── __init__.py │ │ │ ├── messaging │ │ │ │ ├── __init__.py │ │ │ │ ├── message_handler_task.py │ │ │ │ └── messaging_service.py │ │ │ └── service.py │ │ └── system_task.py │ ├── test │ │ ├── __init__.py │ │ ├── database │ │ │ ├── __init__.py │ │ │ └── test_updater.py │ │ ├── dependencies │ │ │ ├── __init__.py │ │ │ └── test_manager.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ └── test_restart_scheduler.py │ │ ├── node │ │ │ ├── __init__.py │ │ │ ├── test_conditions.py │ │ │ ├── test_manager.py │ │ │ └── test_node_class.py │ │ ├── resources │ │ │ ├── __init__.py │ │ │ └── test_manager.py │ │ ├── scheduling │ │ │ ├── __init__.py │ │ │ ├── test_manager.py │ │ │ └── test_node.py │ │ ├── sync │ │ │ ├── __init__.py │ │ │ ├── test_job_type_manager.py │ │ │ ├── test_scheduler_manager.py │ │ │ └── test_workspace_manager.py │ │ ├── tasks │ │ │ ├── __init__.py │ │ │ ├── services │ │ │ │ ├── __init__.py │ │ │ │ └── messaging │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── test_messaging_service.py │ │ │ └── test_manager.py │ │ ├── test_initialize.py │ │ ├── test_scheduler.py │ │ └── test_views.py │ ├── threads │ │ ├── __init__.py │ │ ├── base_thread.py │ │ ├── messaging.py │ │ ├── recon.py │ │ ├── schedule.py │ │ ├── scheduler_status.py │ │ ├── sync.py │ │ ├── task_handling.py │ │ └── task_update.py │ ├── urls.py │ ├── vault │ │ ├── __init__.py │ │ └── manager.py │ └── views.py ├── shared_resource │ ├── __init__.py │ ├── apps.py │ └── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20170412_1225.py │ │ ├── 0003_auto_20170426_0952.py │ │ └── __init__.py ├── source │ ├── __init__.py │ ├── apps.py │ ├── configuration │ │ ├── __init__.py │ │ └── source_data_file.py │ ├── messages │ │ ├── __init__.py │ │ └── purge_source_file.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20170127_1336.py │ │ ├── 0003_auto_20170127_1342.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ └── test │ │ ├── __init__.py │ │ ├── configuration │ │ ├── __init__.py │ │ └── test_source_data_file.py │ │ ├── messages │ │ ├── __init__.py │ │ └── test_purge_source_file.py │ │ ├── test_models.py │ │ └── utils.py ├── storage │ ├── __init__.py │ ├── apps.py │ ├── brokers │ │ ├── __init__.py │ │ ├── broker.py │ │ ├── exceptions.py │ │ ├── factory.py │ │ ├── host_broker.py │ │ ├── nfs_broker.py │ │ └── s3_broker.py │ ├── configuration │ │ ├── __init__.py │ │ ├── exceptions.py │ │ ├── json │ │ │ ├── __init__.py │ │ │ ├── workspace_config_1_0.py │ │ │ └── workspace_config_v6.py │ │ └── workspace_configuration.py │ ├── container.py │ ├── delete_files_job.py │ ├── exceptions.py │ ├── fixtures │ │ ├── basic_storage_errors.json │ │ ├── delete_files_job_type.json │ │ └── move_files_job_type.json │ ├── geospatial_utils.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── scale_delete_file.py │ │ │ ├── scale_delete_files.py │ │ │ ├── scale_download_file.py │ │ │ ├── scale_list_files.py │ │ │ ├── scale_move_file.py │ │ │ ├── scale_move_files.py │ │ │ └── scale_upload_file.py │ ├── media_type.py │ ├── messages │ │ ├── __init__.py │ │ ├── delete_files.py │ │ └── move_files.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_workspace_is_move_enabled.py │ │ ├── 0003_auto_20161202_1621.py │ │ ├── 0004_auto_20170127_1408.py │ │ ├── 0005_auto_20170127_1412.py │ │ ├── 0006_auto_20170127_1423.py │ │ ├── 0007_auto_20170412_1225.py │ │ ├── 0008_auto_20170609_1443.py │ │ ├── 0009_auto_20171002_1542.py │ │ ├── 0010_auto_20180613_1947.py │ │ ├── 0011_auto_20180821_1439.py │ │ ├── 0012_auto_20180920_1320.py │ │ ├── 0013_purgeresults.py │ │ ├── 0014_purgeresults_force_stop_purge.py │ │ ├── 0015_scalefile_data_type_tags.py │ │ ├── 0016_populate_data_type_tags.py │ │ ├── 0017_remove_scalefile_data_type.py │ │ ├── 0018_remove_scalefile_is_operational.py │ │ ├── 0019_optional_description.py │ │ └── __init__.py │ ├── models.py │ ├── move_files_job.py │ ├── serializers.py │ ├── settings.py │ ├── test │ │ ├── __init__.py │ │ ├── brokers │ │ │ ├── __init__.py │ │ │ ├── test_host_broker.py │ │ │ ├── test_nfs_broker.py │ │ │ └── test_s3_broker.py │ │ ├── configuration │ │ │ ├── __init__.py │ │ │ └── test_workspace_configuration.py │ │ ├── fixtures │ │ │ ├── __init__.py │ │ │ └── test_delete_files_job_type.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ ├── test_scale_delete_files.py │ │ │ │ └── test_scale_move_files.py │ │ ├── messages │ │ │ ├── __init__.py │ │ │ ├── test_delete_files.py │ │ │ └── test_move_files.py │ │ ├── test_delete_files_job.py │ │ ├── test_geospatial_utils.py │ │ ├── test_models.py │ │ ├── test_move_files_job.py │ │ ├── test_views.py │ │ └── utils.py │ ├── urls.py │ └── views.py ├── timeline │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── test │ │ ├── __init__.py │ │ └── test_views.py │ ├── urls.py │ └── views.py ├── trigger │ ├── __init__.py │ ├── apps.py │ ├── configuration │ │ ├── __init__.py │ │ ├── exceptions.py │ │ └── trigger_rule.py │ ├── handler.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151125_1438.py │ │ ├── 0003_auto_20151202_1325.py │ │ ├── 0004_auto_20151207_1215.py │ │ ├── 0005_auto_20170412_1225.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ └── test │ │ ├── __init__.py │ │ ├── tests.py │ │ └── utils.py ├── util │ ├── __init__.py │ ├── active_warnings.py │ ├── apps.py │ ├── aws.py │ ├── broker.py │ ├── command.py │ ├── database.py │ ├── dcos.py │ ├── deprecation.py │ ├── environment.py │ ├── exceptions.py │ ├── file_size.py │ ├── host.py │ ├── lock.py │ ├── middleware.py │ ├── os_helper.py │ ├── parse.py │ ├── rest.py │ ├── retry.py │ ├── test │ │ ├── __init__.py │ │ ├── test_aws.py │ │ ├── test_broker.py │ │ ├── test_command.py │ │ ├── test_host.py │ │ ├── test_parse.py │ │ ├── test_rest.py │ │ └── test_retry.py │ └── validation.py └── vault │ ├── __init__.py │ ├── apps.py │ ├── exceptions.py │ ├── secrets_handler.py │ └── test │ ├── __init__.py │ └── test_secrets_handler.py ├── tests └── postman │ ├── environment.json │ └── full-host-test.json ├── travis-build.sh └── web-docs ├── css ├── bootstrap-overrides.css ├── bootstrap.css ├── bootstrap.min.css └── main.css ├── docs.html ├── flow.html ├── fonts ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── images ├── example-thumb-audio.jpg ├── example-thumb-hyperspectral.jpg ├── example-thumb-mri.jpg ├── gif-source │ ├── quickstart1a.jpg │ ├── quickstart1b.jpg │ ├── quickstart1c.jpg │ ├── quickstart1d.jpg │ ├── quickstart1e.jpg │ ├── quickstart2a.png │ ├── quickstart2b.png │ ├── quickstart2c.png │ ├── quickstart2d.png │ ├── quickstart2e.png │ ├── quickstart2f.png │ ├── quickstart2g.png │ ├── quickstart2h.png │ ├── quickstart2i.png │ ├── quickstart3a.png │ ├── quickstart3b.png │ ├── quickstart3c.png │ ├── quickstart3d.png │ └── quickstart3e.png ├── horizon-1.jpg ├── horizon-2.jpg ├── horizon-3.jpg ├── quickstart1.gif ├── quickstart2.gif ├── quickstart3.gif ├── scale-dashboard.jpg ├── scale-flow-ingest-detail.jpg ├── scale-flow.png ├── scale3-transparent-128.png ├── shutterstock_128679269.jpg ├── tutorial-thumb-algorithm.jpg ├── tutorial-thumb-quickstart.jpg ├── tutorial-thumb-recipe.jpg └── tutorial-thumb-walkthrough.jpg ├── index.html ├── javascripts └── scale.fix.js ├── js ├── bootstrap.js ├── bootstrap.min.js └── jquery.js ├── quickstart.html ├── stylesheets ├── github-light.css └── styles.css └── walkthrough ├── generate-outputs.sh ├── generate-pdf.sh ├── images ├── create-input-workspace.png ├── create-job-type-search.png ├── create-output-workspace.png ├── job-type-configuration.png ├── job-type-general-info.png ├── output-file.png ├── recipe-add-input.png ├── recipe-add-job-type.png ├── recipe-file-inputs.png ├── scale-process.png └── strike-add-rule.png ├── index.adoc └── styles └── walkthrough.css /.dockerignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | env/ 3 | .idea/ 4 | .vscode/ 5 | .git 6 | LICENSE 7 | README.md 8 | 9 | # Exclude any developer local_settings files 10 | scale/scale/local_settings.py* 11 | scale/environment 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files 2 | * text=auto 3 | 4 | # Source files 5 | # ============ 6 | *.pxd text 7 | *.py text 8 | *.py3 text 9 | *.pyw text 10 | *.pyx text 11 | 12 | # Binary files 13 | # ============ 14 | *.db binary 15 | *.p binary 16 | *.pkl binary 17 | *.pyc binary 18 | *.pyd binary 19 | *.pyo binary 20 | 21 | # Note: .db, .p, and .pkl files are associated 22 | # with the python modules ``pickle``, ``dbm.*``, 23 | # ``shelve``, ``marshal``, ``anydbm``, & ``bsddb`` 24 | # (among others). 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Pain Point? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Desired Solution** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Alternative / Workaround** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional Context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/gitlab-mirror.yml: -------------------------------------------------------------------------------- 1 | name: Mirroring 2 | 3 | on: [push, delete] 4 | 5 | jobs: 6 | to_gitlab: 7 | runs-on: ubuntu-18.04 8 | steps: # <-- must use actions/checkout@v1 before mirroring! 9 | - uses: actions/checkout@v1 10 | - uses: pixta-dev/repository-mirroring-action@v1 11 | with: 12 | target_repo_url: 13 | git@gitlab.com:ngageoint/scale.git 14 | ssh_private_key: # <-- use 'secrets' to pass credential information. 15 | ${{ secrets.GITLAB_SSH_PRIVATE_KEY }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | env/ 2 | .idea/ 3 | .vscode/ 4 | .DS_Store 5 | .c9/ 6 | temp/ 7 | bin/ 8 | output/ 9 | pkg/ 10 | src/ 11 | scale-ui/ 12 | coverage.xml 13 | output.txt 14 | *.~c9*.py 15 | scale/local_settings.py 16 | scale/db.sqlite3 17 | redoc-static.html 18 | .python-version 19 | -------------------------------------------------------------------------------- /dev-build-push.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dcos marathon app remove /scale-db 4 | dcos marathon app remove /scale-elasticsearch 5 | dcos marathon app remove /scale-fluentd 6 | dcos marathon app remove /scale-rabbitmq 7 | dcos marathon app remove /scale-ui 8 | dcos marathon app remove /scale-webserver 9 | dcos marathon app stop /scale 10 | 11 | docker build --build-arg BUILD_DOCS=0 -t $1 . 12 | docker push $1 13 | 14 | dcos marathon app start /scale 1 15 | -------------------------------------------------------------------------------- /dockerfiles/examples/ace/oli-vis.wmd: -------------------------------------------------------------------------------- 1 | 2 | 3 | Coastal aerosol 4 | Blue 5 | Green 6 | Red 7 | NIR 8 | SWIR 1 9 | SWIR 2 10 | 11 | -------------------------------------------------------------------------------- /dockerfiles/examples/binary-parse/parse_binary.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -x 2 | 3 | echo "Running binary_parse.sh " $* 4 | 5 | # write results manifest 6 | 7 | DATE_STARTED=$(stat -c "%y" $1)"Z" 8 | 9 | cat > $2/results_manifest.json << EOF 10 | { "version": "1.1", 11 | "parse_results": [{ 12 | "filename": "$(basename $1)", 13 | "file-types": [], 14 | "geo_metadata": { 15 | "data_started": "${DATE_STARTED}" 16 | }} 17 | ] 18 | } 19 | EOF 20 | cat $2/results_manifest.json 21 | -------------------------------------------------------------------------------- /dockerfiles/examples/landsat-base/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:centos7 2 | MAINTAINER Trevor R.H. Clarke 3 | 4 | ADD epel-release-7-5.noarch.rpm /tmp/ 5 | RUN rpm -ivh /tmp/epel-release-7-5.noarch.rpm \ 6 | && yum groupinstall -y 'Development Tools' \ 7 | && yum install -y python-devel gdal-devel gdal gdal-python python-pip numpy && yum clean all \ 8 | && pip install rasterio 9 | 10 | USER nobody 11 | -------------------------------------------------------------------------------- /dockerfiles/examples/landsat-base/epel-release-7-5.noarch.rpm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/dockerfiles/examples/landsat-base/epel-release-7-5.noarch.rpm -------------------------------------------------------------------------------- /dockerfiles/examples/landsat-ndwi/job_type.yml: -------------------------------------------------------------------------------- 1 | name: landsat-ndwi 2 | version: "1.0.0" 3 | title: Landsat NDWI 4 | description: Perform NDWI on landsat 8 data. 5 | author_name: "tclarke@ball.com" 6 | docker_image: "geoint/landsat-ndwi" 7 | priority: 250 8 | timeout: 300 9 | max_tries: 3 10 | cpus_required: 1.0 11 | mem_required: 1024.0 12 | interface: 13 | version: "1.0" 14 | command: "python landsat_ndwi.py" 15 | command_arguments: '${msi} ${job_output_dir}' 16 | input_data: 17 | - media_types: [ "image/tiff" ] 18 | required: true 19 | type: file 20 | name: msi 21 | output_data: 22 | - name: ndwi 23 | media_type: "image/tiff" 24 | required: true 25 | type: file 26 | -------------------------------------------------------------------------------- /dockerfiles/examples/landsat-tiles/job_type.yml: -------------------------------------------------------------------------------- 1 | name: landsat-tiles 2 | version: "1.0.0" 3 | title: Landsat Tiles 4 | description: Generate map tiles for a landsat 8 product. 5 | author_name: "tclarke@ball.com" 6 | docker_image: "geoint/landsat-tiles" 7 | priority: 250 8 | timeout: 300 9 | max_tries: 3 10 | cpus_required: 0.5 11 | mem_required: 512.0 12 | interface: 13 | version: "1.0" 14 | command: "./landsat_tiles.sh" 15 | command_arguments: '${image} ${job_output_dir}' 16 | input_data: 17 | - media_types: [ "image/tiff" ] 18 | required: true 19 | type: file 20 | name: image 21 | output_data: 22 | - name: tiles 23 | required: true 24 | type: files 25 | -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes-seed/.dockerignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .git* 3 | Dockerfile 4 | README.md -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes-seed/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:2.7-alpine 2 | MAINTAINER Jonathan Meyer 3 | 4 | COPY scale-job.py /scale-job.py 5 | 6 | ENTRYPOINT ["python", "scale-job.py"] 7 | -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes-seed/README.md: -------------------------------------------------------------------------------- 1 | # scale-read-bytes 2 | Scale algorithm to read x bytes from input file into output file 3 | -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes/.dockerignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .git* 3 | Dockerfile 4 | README.md -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:2.7-alpine 2 | MAINTAINER Jonathan Meyer 3 | 4 | COPY scale-job.py /scale-job.py 5 | 6 | ENTRYPOINT ["python", "scale-job.py"] 7 | -------------------------------------------------------------------------------- /dockerfiles/examples/read-bytes/README.md: -------------------------------------------------------------------------------- 1 | # scale-read-bytes 2 | Scale algorithm to read x bytes from input file into output file 3 | -------------------------------------------------------------------------------- /dockerfiles/examples/source-metadata/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine 2 | MAINTAINER Jonathan Meyer 3 | 4 | COPY generate-metadata.sh /generate-metadata.sh 5 | -------------------------------------------------------------------------------- /dockerfiles/examples/source-metadata/generate-metadata.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | cat << EOF > $OUTPUT_DIR/INPUT_FILE.metadata.json 4 | { 5 | "type": "Feature", 6 | "geometry": { 7 | "type": "Point", 8 | "coordinates": [125.6, 10.1] 9 | }, 10 | "properties": { 11 | "dataStarted": "2019-10-14T00:00:00Z", 12 | "dataEnded": "2019-10-14T00:01:00Z", 13 | "dataTypes": [ "one", "two", "three" ] 14 | } 15 | } 16 | EOF 17 | 18 | echo Wrote metadata for input file $INPUT_FILE to $OUTPUT_DIR/INPUT_FILE.metadata.json 19 | -------------------------------------------------------------------------------- /dockerfiles/examples/test-seed/.dockerignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .git* 3 | Dockerfile 4 | README.md -------------------------------------------------------------------------------- /dockerfiles/examples/test-seed/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:2.7-alpine 2 | MAINTAINER Jonathan Meyer 3 | 4 | COPY test.py /test.py 5 | 6 | ENTRYPOINT ["python", "test.py"] 7 | -------------------------------------------------------------------------------- /dockerfiles/examples/test-seed/README.md: -------------------------------------------------------------------------------- 1 | # test-seed 2 | Seed algorithm to exercise the spec and validate executor completeness 3 | -------------------------------------------------------------------------------- /dockerfiles/examples/vash/Vash.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/dockerfiles/examples/vash/Vash.jar -------------------------------------------------------------------------------- /dockerfiles/examples/vash/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -x 2 | 3 | export outfile=$2/$(basename $1 .dat).jpg 4 | 5 | java -jar Vash.jar -a 1.1 -o ${outfile} -f $1 6 | 7 | # write results manifest 8 | cat > $2/results_manifest.json << EOF 9 | { "version": "1.1", 10 | "output_data": [{ 11 | "name": "results", 12 | "file": { 13 | "path": "${outfile}" 14 | } 15 | }] 16 | } 17 | EOF 18 | cat $2/results_manifest.json 19 | -------------------------------------------------------------------------------- /dockerfiles/fluentd/README.md: -------------------------------------------------------------------------------- 1 | # Fluentd - Scale 2 | Fluentd image loaded with custom configurations to support log capture within Scale. 3 | 4 | We require a single environment variable to configure the backing Elasticsearch cluster. `ELASTICSEARCH_URL` accepts a single URL serving the Elasticsearch API. 5 | Production deployments of Elasticsearch should be fronted with a load balancer to satisfy this requirement. 6 | 7 | Supported example settings for `ELASTICSEARCH_URL`: 8 | 9 | - "http://192.168.1.10" 10 | - "http://192.168.1.10:9200" 11 | - "https://elastic.example.com" 12 | - "https://username@password:elastic.example.com" -------------------------------------------------------------------------------- /dockerfiles/fluentd/scripts/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if [ "$@x" != "x" ] 6 | then 7 | exec $@ 8 | else 9 | python /inject-es-config.py /fluentd/etc/fluent.conf /tmp/fluent.conf 10 | fluentd -c /tmp/fluent.conf 11 | fi 12 | 13 | -------------------------------------------------------------------------------- /dockerfiles/framework/scale/.gitignore: -------------------------------------------------------------------------------- 1 | scale/ 2 | -------------------------------------------------------------------------------- /dockerfiles/framework/scale/README.md: -------------------------------------------------------------------------------- 1 | The Dockerfile for this image is in the root of the repository. This is necessary to avoid having to specify an alternative context directory to `docker build` 2 | -------------------------------------------------------------------------------- /dockerfiles/framework/scale/app-templates/logstash.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/dockerfiles/framework/scale/app-templates/logstash.json -------------------------------------------------------------------------------- /dockerfiles/framework/scale/country_data.json.bz2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/dockerfiles/framework/scale/country_data.json.bz2 -------------------------------------------------------------------------------- /dockerfiles/vault/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG IMAGE=alpine 2 | FROM $IMAGE 3 | 4 | ENV VAULT_VERSION 0.7.0 5 | ARG VAULT_ZIP=https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip 6 | 7 | ADD $VAULT_ZIP vault.zip 8 | RUN apk add --update unzip openssl ca-certificates curl && \ 9 | unzip vault.zip && \ 10 | rm vault.zip && \ 11 | cp vault /usr/bin && \ 12 | apk del unzip && \ 13 | rm -rf /var/cache/apk/* 14 | 15 | COPY run-vault /usr/bin/run-vault 16 | COPY config.hcl config.hcl 17 | 18 | RUN chmod +x /usr/bin/run-vault 19 | RUN sed -i 's/\r$//g' /usr/bin/run-vault 20 | 21 | ENTRYPOINT ["run-vault"] 22 | CMD ["server", "-config=config.hcl"] 23 | -------------------------------------------------------------------------------- /dockerfiles/vault/config.hcl: -------------------------------------------------------------------------------- 1 | listener "tcp" { 2 | address = "0.0.0.0:8200" 3 | tls_cert_file = "/tmp/server-cert.pem" 4 | tls_key_file = "/tmp/server-key.pem" 5 | } 6 | 7 | backend "zookeeper" { 8 | address = "master.mesos:2181" 9 | path = "vault" 10 | advertise_addr = "https://scale-vault.marathon.l4lb.thisdcos.directory:8200" 11 | } 12 | 13 | disable_mlock = true 14 | -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-large-earth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-large-earth.png -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-large-fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-large-fill.png -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-large.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-large.ai -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-small-earth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-small-earth.png -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-small-fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-small-fill.png -------------------------------------------------------------------------------- /graphics/PoweredByScale/pbscale-small.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/PoweredByScale/pbscale-small.ai -------------------------------------------------------------------------------- /graphics/images/icon-service-scale-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icon-service-scale-large.png -------------------------------------------------------------------------------- /graphics/images/icon-service-scale-medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icon-service-scale-medium.png -------------------------------------------------------------------------------- /graphics/images/icon-service-scale-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icon-service-scale-small.png -------------------------------------------------------------------------------- /graphics/images/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /graphics/images/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /graphics/images/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /graphics/images/icons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #25282b 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /graphics/images/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/favicon-16x16.png -------------------------------------------------------------------------------- /graphics/images/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/favicon-32x32.png -------------------------------------------------------------------------------- /graphics/images/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/favicon.ico -------------------------------------------------------------------------------- /graphics/images/icons/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Scale", 3 | "icons": [ 4 | { 5 | "src": "images/icons/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "images/icons/android-chrome-512x512.png", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /graphics/images/icons/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/mstile-144x144.png -------------------------------------------------------------------------------- /graphics/images/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/mstile-150x150.png -------------------------------------------------------------------------------- /graphics/images/icons/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/mstile-310x150.png -------------------------------------------------------------------------------- /graphics/images/icons/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/mstile-310x310.png -------------------------------------------------------------------------------- /graphics/images/icons/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/icons/mstile-70x70.png -------------------------------------------------------------------------------- /graphics/images/navigation-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/navigation-logo.png -------------------------------------------------------------------------------- /graphics/images/navigation-logo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/navigation-logo.psd -------------------------------------------------------------------------------- /graphics/images/scale3-a-gradient-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-a-gradient-1.png -------------------------------------------------------------------------------- /graphics/images/scale3-a-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-a-gradient.png -------------------------------------------------------------------------------- /graphics/images/scale3-a-solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-a-solid.png -------------------------------------------------------------------------------- /graphics/images/scale3-b-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-b-gradient.png -------------------------------------------------------------------------------- /graphics/images/scale3-b-solid-240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-b-solid-240.png -------------------------------------------------------------------------------- /graphics/images/scale3-b-solid-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-b-solid-60.png -------------------------------------------------------------------------------- /graphics/images/scale3-b-solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-b-solid.png -------------------------------------------------------------------------------- /graphics/images/scale3-lightbg-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-lightbg-200.png -------------------------------------------------------------------------------- /graphics/images/scale3-lightbg-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-lightbg-48.png -------------------------------------------------------------------------------- /graphics/images/scale3-lightbg-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-lightbg-64.png -------------------------------------------------------------------------------- /graphics/images/scale3-transparent-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3-transparent-128.png -------------------------------------------------------------------------------- /graphics/images/scale3.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/images/scale3.ai -------------------------------------------------------------------------------- /graphics/models/Scale_Base.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/models/Scale_Base.stl -------------------------------------------------------------------------------- /graphics/models/Scale_Logo.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/models/Scale_Logo.stl -------------------------------------------------------------------------------- /graphics/models/Scale_Model.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/models/Scale_Model.JPG -------------------------------------------------------------------------------- /graphics/models/models.txt: -------------------------------------------------------------------------------- 1 | Print your own scale logo!!! 2 | -------------------------------------------------------------------------------- /graphics/scale3.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/graphics/scale3.ai -------------------------------------------------------------------------------- /hooks/build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ "${BUILD_DOCS}x" != "x" ]] 4 | then 5 | BUILD_ARGS="--build-arg BUILD_DOCS=${BUILD_DOCS}" 6 | fi 7 | 8 | if [[ "${BASE_IMAGE}x" != "x" ]] 9 | then 10 | BUILD_ARGS="--build-arg BASE_IMAGE=${BASE_IMAGE}" 11 | fi 12 | 13 | if [[ "${GOSU_URL}x" != "x" ]] 14 | then 15 | BUILD_ARGS="$BUILD_ARGS --build-arg GOSU_URL=${GOSU_URL}" 16 | fi 17 | 18 | docker build $BUILD_ARGS --label VERSION=$CACHE_TAG -t $IMAGE_NAME . 19 | 20 | -------------------------------------------------------------------------------- /scale-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /scale/.dockerignore: -------------------------------------------------------------------------------- 1 | pip/ 2 | logs/* 3 | build.xml 4 | README.txt 5 | -------------------------------------------------------------------------------- /scale/.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | coverage.xml 3 | docs/_build/ 4 | htmlcov/ 5 | static/ 6 | ui/ 7 | logs/* 8 | environment/scale 9 | pip/mac.txt 10 | -------------------------------------------------------------------------------- /scale/accounts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/accounts/__init__.py -------------------------------------------------------------------------------- /scale/accounts/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class AccountsConfig(AppConfig): 8 | name = 'accounts' 9 | -------------------------------------------------------------------------------- /scale/accounts/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/accounts/management/__init__.py -------------------------------------------------------------------------------- /scale/accounts/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/accounts/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/accounts/static/accounts/geoaxis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/accounts/static/accounts/geoaxis.png -------------------------------------------------------------------------------- /scale/accounts/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/accounts/test/__init__.py -------------------------------------------------------------------------------- /scale/accounts/urls.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.conf.urls import url 4 | 5 | import accounts.views as views 6 | 7 | 8 | urlpatterns = [ 9 | url(r'^accounts/users/$', views.UserList.as_view(), name='users_list_view'), 10 | url(r'^accounts/users/(?P[\w-]+)/$', views.UserDetail.as_view(), name='user_detail_view'), 11 | url(r'^accounts/profile/$', views.GetUser.as_view(), name='current_user_view'), 12 | ] 13 | -------------------------------------------------------------------------------- /scale/batch/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'batch.apps.BatchConfig' 2 | -------------------------------------------------------------------------------- /scale/batch/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/configuration/__init__.py -------------------------------------------------------------------------------- /scale/batch/configuration/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with batch configurations""" 2 | from util.exceptions import ValidationException 3 | 4 | 5 | class InvalidConfiguration(ValidationException): 6 | """Exception indicating that the provided batch configuration was invalid""" 7 | 8 | def __init__(self, name, description): 9 | """Constructor 10 | 11 | :param name: The name of the validation error 12 | :type name: string 13 | :param description: The description of the validation error 14 | :type description: string 15 | """ 16 | 17 | super(InvalidConfiguration, self).__init__(name, description) 18 | -------------------------------------------------------------------------------- /scale/batch/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/batch/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/definition/__init__.py -------------------------------------------------------------------------------- /scale/batch/definition/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with batch definitions""" 2 | from util.exceptions import ValidationException 3 | 4 | 5 | class InvalidDefinition(ValidationException): 6 | """Exception indicating that the provided batch definition was invalid""" 7 | 8 | def __init__(self, name, description): 9 | """Constructor 10 | 11 | :param name: The name of the validation error 12 | :type name: string 13 | :param description: The description of the validation error 14 | :type description: string 15 | """ 16 | 17 | super(InvalidDefinition, self).__init__(name, description) 18 | -------------------------------------------------------------------------------- /scale/batch/definition/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/definition/json/__init__.py -------------------------------------------------------------------------------- /scale/batch/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with batches""" 2 | 3 | 4 | class BatchError(Exception): 5 | """Exception indicating that there was a problem with batch processing""" 6 | pass 7 | -------------------------------------------------------------------------------- /scale/batch/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/management/__init__.py -------------------------------------------------------------------------------- /scale/batch/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/batch/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/messages/__init__.py -------------------------------------------------------------------------------- /scale/batch/migrations/0002_auto_20170412_1225.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-04-12 12:25 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('batch', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='batch', 18 | name='definition', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/batch/migrations/0004_auto_20180122_1444.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-01-22 14:44 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('batch', '0003_auto_20170706_1948'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='batch', 18 | name='creator_job', 19 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='batch_creator_job', to='job.Job'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/batch/migrations/0007_auto_20180516_1915.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2018-05-16 19:15 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('batch', '0006_auto_20180401_0218'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='batchmetrics', 18 | name='batch', 19 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='metrics', to='batch.Batch'), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/batch/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/migrations/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/batch/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/definition/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/definition/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/definition/json/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/management/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/batch/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/batch/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/batch/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful batch services""" 2 | from django.conf.urls import url 3 | 4 | import batch.views as views 5 | 6 | urlpatterns = [ 7 | url(r'^batches/$', views.BatchesView.as_view(), name='batches_view'), 8 | url(r'^batches/(\d+)/$', views.BatchDetailsView.as_view(), name='batch_details_view'), 9 | url(r'^batches/comparison/(\d+)/$', views.BatchesComparisonView.as_view(), name='batch_comparison_view'), 10 | url(r'^batches/validation/$', views.BatchesValidationView.as_view(), name='batches_validation_view'), 11 | ] 12 | -------------------------------------------------------------------------------- /scale/cli/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/cli/__init__.py -------------------------------------------------------------------------------- /scale/cli/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/cli/management/__init__.py -------------------------------------------------------------------------------- /scale/cli/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/cli/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/data/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'data.apps.DataConfig' 2 | -------------------------------------------------------------------------------- /scale/data/apps.py: -------------------------------------------------------------------------------- 1 | """Defines the application configuration for the data application""" 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class DataConfig(AppConfig): 8 | """Configuration for the data app 9 | """ 10 | 11 | name = 'data' 12 | label = 'data' 13 | verbose_name = 'Data' 14 | -------------------------------------------------------------------------------- /scale/data/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/data/__init__.py -------------------------------------------------------------------------------- /scale/data/data/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/data/json/__init__.py -------------------------------------------------------------------------------- /scale/data/dataset/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/dataset/__init__.py -------------------------------------------------------------------------------- /scale/data/dataset/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/dataset/json/__init__.py -------------------------------------------------------------------------------- /scale/data/filter/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/filter/__init__.py -------------------------------------------------------------------------------- /scale/data/filter/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with data filters""" 2 | from util.exceptions import ValidationException 3 | 4 | 5 | class InvalidDataFilter(ValidationException): 6 | """Exception indicating that the data filter is invalid""" 7 | 8 | def __init__(self, name, description): 9 | """Constructor 10 | 11 | :param name: The name of the validation error 12 | :type name: string 13 | :param description: The description of the validation error 14 | :type description: string 15 | """ 16 | 17 | super(InvalidDataFilter, self).__init__(name, description) 18 | -------------------------------------------------------------------------------- /scale/data/filter/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/filter/json/__init__.py -------------------------------------------------------------------------------- /scale/data/interface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/interface/__init__.py -------------------------------------------------------------------------------- /scale/data/interface/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/interface/json/__init__.py -------------------------------------------------------------------------------- /scale/data/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/migrations/__init__.py -------------------------------------------------------------------------------- /scale/data/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/data/test/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/data/__init__.py -------------------------------------------------------------------------------- /scale/data/test/data/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/data/json/__init__.py -------------------------------------------------------------------------------- /scale/data/test/dataset/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/dataset/__init__.py -------------------------------------------------------------------------------- /scale/data/test/dataset/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/dataset/json/__init__.py -------------------------------------------------------------------------------- /scale/data/test/filter/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/filter/__init__.py -------------------------------------------------------------------------------- /scale/data/test/filter/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/filter/json/__init__.py -------------------------------------------------------------------------------- /scale/data/test/interface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/interface/__init__.py -------------------------------------------------------------------------------- /scale/data/test/interface/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/data/test/interface/json/__init__.py -------------------------------------------------------------------------------- /scale/diagnostic/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'diagnostic.apps.DiagnosticConfig' 2 | -------------------------------------------------------------------------------- /scale/diagnostic/apps.py: -------------------------------------------------------------------------------- 1 | """Defines the application configuration for the diagnostic application""" 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class DiagnosticConfig(AppConfig): 8 | """Configuration for the diagnostic app 9 | """ 10 | 11 | name = 'diagnostic' 12 | label = 'diagnostic' 13 | verbose_name = 'Diagnostic' 14 | 15 | def ready(self): 16 | """Registers the diagnostic errors""" 17 | 18 | from diagnostic.exceptions import TestException 19 | from error.exceptions import register_error 20 | 21 | register_error(TestException()) 22 | -------------------------------------------------------------------------------- /scale/diagnostic/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines the exceptions related to diagnostics""" 2 | from __future__ import unicode_literals 3 | 4 | from error.exceptions import ScaleError 5 | 6 | 7 | class TestException(ScaleError): 8 | """Error class indicating that a test error occurred 9 | """ 10 | 11 | def __init__(self): 12 | """Constructor 13 | """ 14 | 15 | super(TestException, self).__init__(11, 'test') 16 | 17 | def get_log_message(self): 18 | """See :meth:`error.exceptions.ScaleError.get_log_message` 19 | """ 20 | 21 | return '' 22 | -------------------------------------------------------------------------------- /scale/diagnostic/fixtures/diagnostic_errors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "error.Error", 4 | "pk": null, 5 | "fields": { 6 | "name": "test", 7 | "title": "Test Error", 8 | "description": "This is a test error, generated by a job helping to perform diagnostics on Scale.", 9 | "category": "SYSTEM", 10 | "is_builtin": true, 11 | "should_be_retried": false, 12 | "created": "2017-05-11T00:00:00.0Z", 13 | "last_modified": "2017-05-11T00:00:00.0Z" 14 | } 15 | } 16 | ] -------------------------------------------------------------------------------- /scale/diagnostic/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/diagnostic/management/__init__.py -------------------------------------------------------------------------------- /scale/diagnostic/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/diagnostic/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/diagnostic/management/commands/scale_hello.py: -------------------------------------------------------------------------------- 1 | """Defines the command line method for running the Scale Hello job""" 2 | from __future__ import unicode_literals 3 | from __future__ import print_function 4 | 5 | import sys 6 | 7 | from django.core.management.base import BaseCommand 8 | 9 | 10 | class Command(BaseCommand): 11 | """Command that executes the Scale Hello job 12 | """ 13 | 14 | help = 'Prints out "Hello Scale!"' 15 | 16 | def handle(self, *args, **options): 17 | """See :meth:`django.core.management.base.BaseCommand.handle`. 18 | """ 19 | 20 | print('Hello Scale! (stderr)', file=sys.stderr) 21 | print('Hello Scale! (stdout)', file=sys.stdout) -------------------------------------------------------------------------------- /scale/diagnostic/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/diagnostic/test/__init__.py -------------------------------------------------------------------------------- /scale/docs/_static/images/architecture/Scale_Architecture.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/_static/images/architecture/Scale_Architecture.pptx -------------------------------------------------------------------------------- /scale/docs/_static/images/architecture/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/_static/images/architecture/overview.png -------------------------------------------------------------------------------- /scale/docs/_static/scale3-transparent-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/_static/scale3-transparent-128.png -------------------------------------------------------------------------------- /scale/docs/_static/style.css: -------------------------------------------------------------------------------- 1 | .wy-nav-content { 2 | max-width: none; 3 | } 4 | 5 | .wy-table-responsive table td, .wy-table-responsive table th { 6 | white-space: nowrap; 7 | } 8 | 9 | .wy-table-bordered-all, .rst-content table.docutils { 10 | width: 100%; 11 | } 12 | 13 | /* override table width restrictions */ 14 | .wy-table-responsive table td, .wy-table-responsive table th { 15 | white-space: normal; 16 | } 17 | 18 | .wy-table-responsive { 19 | margin-bottom: 24px; 20 | max-width: 100%; 21 | overflow: visible; 22 | } 23 | -------------------------------------------------------------------------------- /scale/docs/_templates/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "!layout.html" %} 2 | {% block extrahead %} 3 | 4 | {% endblock %} 5 | -------------------------------------------------------------------------------- /scale/docs/architecture/django/.gitignore: -------------------------------------------------------------------------------- 1 | code_docs/ 2 | -------------------------------------------------------------------------------- /scale/docs/architecture/index.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _architecture: 3 | 4 | ======================================================================================================================== 5 | Architecture 6 | ======================================================================================================================== 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | 11 | overview 12 | jobs/index 13 | logs 14 | messaging 15 | port 16 | scan 17 | strike 18 | triggers 19 | workspaces 20 | django/index 21 | -------------------------------------------------------------------------------- /scale/docs/architecture/jobs/index.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _architecture_jobs: 3 | 4 | Jobs and Recipes 5 | ================ 6 | 7 | Jobs represent the various algorithms or units of work that get executed in Scale. Recipes represent a graph/workflow of 8 | jobs that allow jobs to depend upon one another and for files produced by one job to be fed as input into another job. 9 | 10 | .. toctree:: 11 | :maxdepth: 1 12 | 13 | batch_definition 14 | error_interface 15 | job_interface 16 | job_configuration 17 | job_data 18 | exe_configuration 19 | recipe_definition 20 | recipe_data 21 | resources 22 | seed 23 | task_results 24 | -------------------------------------------------------------------------------- /scale/docs/cli/index.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _cli: 3 | 4 | ################### 5 | Command Line Client 6 | ################### 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | 11 | overview 12 | getting_started 13 | -------------------------------------------------------------------------------- /scale/docs/images/algorithm_integration/new_recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/images/algorithm_integration/new_recipe.png -------------------------------------------------------------------------------- /scale/docs/images/algorithm_integration/new_recipe_entry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/images/algorithm_integration/new_recipe_entry.png -------------------------------------------------------------------------------- /scale/docs/images/algorithm_integration/recipe_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/images/algorithm_integration/recipe_input.png -------------------------------------------------------------------------------- /scale/docs/images/algorithm_integration/setting_up_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/images/algorithm_integration/setting_up_trigger.png -------------------------------------------------------------------------------- /scale/docs/images/algorithm_integration/trigger_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/docs/images/algorithm_integration/trigger_input.png -------------------------------------------------------------------------------- /scale/docs/rest/v6/openapi.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.0' 2 | 3 | info: 4 | title: Scale API 5 | description: Scale API Overview 6 | version: v6 7 | contact: 8 | name: "Scale Team" 9 | url: "gitter.com/ngageoint/scale" 10 | x-logo: 11 | url: "http://ngageoint.github.io/scale/images/scale3-transparent-128.png" 12 | altText: "Scale logo" 13 | 14 | servers: 15 | - url: http://scale.nga.gov/api/v6 16 | 17 | -------------------------------------------------------------------------------- /scale/docs/wiki/scale.wiki/setup_wiki_git.sh: -------------------------------------------------------------------------------- 1 | git init && 2 | git remote add origin https://github.com/ngageoint/scale.wiki.git -------------------------------------------------------------------------------- /scale/error/__init__.py: -------------------------------------------------------------------------------- 1 | """The standard interface for errors in scale""" 2 | default_app_config = 'error.apps.ErrorConfig' 3 | -------------------------------------------------------------------------------- /scale/error/apps.py: -------------------------------------------------------------------------------- 1 | """The scale error application""" 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class ErrorConfig(AppConfig): 8 | """Configuration for the error app 9 | """ 10 | name = 'error' 11 | label = 'error' 12 | verbose_name = 'Error' 13 | 14 | def ready(self): 15 | """Registers basic errors""" 16 | from error.exceptions import ScaleDatabaseError, ScaleIOError, ScaleOperationalError, register_error 17 | 18 | register_error(ScaleDatabaseError()) 19 | register_error(ScaleIOError()) 20 | register_error(ScaleOperationalError()) 21 | -------------------------------------------------------------------------------- /scale/error/migrations/0002_auto_20151217_1319.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('error', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='error', 16 | name='description', 17 | field=models.CharField(max_length=250, null=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/error/migrations/0003_error_is_builtin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('error', '0002_auto_20151217_1319'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='error', 16 | name='is_builtin', 17 | field=models.BooleanField(default=False, db_index=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/error/migrations/0004_error_should_be_retried.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('error', '0003_error_is_builtin'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='error', 16 | name='should_be_retried', 17 | field=models.BooleanField(default=False), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/error/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/error/migrations/__init__.py -------------------------------------------------------------------------------- /scale/error/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/error/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful recipe services""" 2 | from django.conf.urls import url 3 | 4 | import error.views 5 | 6 | urlpatterns = [ 7 | url(r'^errors/$', error.views.ErrorsView.as_view(), name='errors_view'), 8 | url(r'^errors/(\d+)/$', error.views.ErrorDetailsView.as_view(), name='error_details_view'), 9 | ] 10 | -------------------------------------------------------------------------------- /scale/ingest/__init__.py: -------------------------------------------------------------------------------- 1 | """This model handles the ingestion of new data into scale""" 2 | default_app_config = 'ingest.apps.IngestConfig' 3 | -------------------------------------------------------------------------------- /scale/ingest/fixtures/ingest_errors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "error.Error", 4 | "pk": null, 5 | "fields": { 6 | "name": "ingest-timeout", 7 | "title": "Ingest Timeout", 8 | "description": "The ingest job exceeded its timeout threshold. This is likely due to excessive time uploading the source data to its workspace.", 9 | "category": "SYSTEM", 10 | "is_builtin": true, 11 | "should_be_retried": true, 12 | "created": "2017-01-06T00:00:00.0Z", 13 | "last_modified": "2017-01-06T00:00:00.0Z" 14 | } 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /scale/ingest/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/handlers/__init__.py -------------------------------------------------------------------------------- /scale/ingest/ingest_event_serializers.py: -------------------------------------------------------------------------------- 1 | """Defines the serializers for ingests""" 2 | import rest_framework.serializers as serializers 3 | from util.rest import ModelIdSerializer 4 | 5 | class IngestEventBaseSerializerV6(ModelIdSerializer): 6 | """Converts ingest event model fields to REST output""" 7 | type = serializers.CharField() 8 | occurred = serializers.DateTimeField() 9 | 10 | class IngestEventSerializerV6(IngestEventBaseSerializerV6): 11 | """Converts ingest event model fields to REST output""" 12 | 13 | 14 | class IngestEventDetailsSerializerV6(IngestEventBaseSerializerV6): 15 | """Converts ingest event model fields to REST output""" 16 | description = serializers.JSONField(default=dict) -------------------------------------------------------------------------------- /scale/ingest/management/__init__.py: -------------------------------------------------------------------------------- 1 | """management for the ingest app""" 2 | -------------------------------------------------------------------------------- /scale/ingest/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | """django commands for the ingest app""" 2 | -------------------------------------------------------------------------------- /scale/ingest/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/messages/__init__.py -------------------------------------------------------------------------------- /scale/ingest/migrations/0002_auto_20160414_0937.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('ingest', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='ingest', 17 | name='strike', 18 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=1, to='ingest.Strike'), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/ingest/migrations/0005_auto_20160728_1243.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('ingest', '0004_auto_20160711_1058'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ingest', 16 | name='bytes_transferred', 17 | field=models.BigIntegerField(null=True, blank=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/ingest/migrations/0008_auto_20170127_1332.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('ingest', '0007_auto_20170127_1327'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ingest', 16 | name='source_file', 17 | field=models.ForeignKey(blank=True, to='storage.ScaleFile', null=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/ingest/migrations/0012_scan_file_count.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('ingest', '0011_auto_20170302_2130'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='scan', 16 | name='file_count', 17 | field=models.BigIntegerField(null=True, blank=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/ingest/migrations/0016_ingest_data_type_tags.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2019-03-18 18:11 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('ingest', '0015_ingestevent'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='ingest', 18 | name='data_type_tags', 19 | field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=250), default=list, size=None), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/ingest/migrations/0018_remove_ingest_data_type.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2019-03-18 19:04 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('ingest', '0017_populate_data_type_tags'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='ingest', 17 | name='data_type', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/ingest/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/migrations/__init__.py -------------------------------------------------------------------------------- /scale/ingest/scan/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/scan/__init__.py -------------------------------------------------------------------------------- /scale/ingest/scan/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/scan/configuration/__init__.py -------------------------------------------------------------------------------- /scale/ingest/scan/configuration/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with Scan configuration""" 2 | from util.exceptions import ValidationException 3 | 4 | class InvalidScanConfiguration(ValidationException): 5 | """Exception indicating that the provided Scan configuration was invalid""" 6 | 7 | def __init__(self, description): 8 | """Constructor 9 | 10 | :param description: The description of the validation error 11 | :type description: string 12 | """ 13 | 14 | super(InvalidScanConfiguration, self).__init__('INVALID_SCAN_CONFIGURATION', description) -------------------------------------------------------------------------------- /scale/ingest/scan/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/scan/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/ingest/scan/scanners/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/scan/scanners/__init__.py -------------------------------------------------------------------------------- /scale/ingest/strike/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/strike/__init__.py -------------------------------------------------------------------------------- /scale/ingest/strike/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/strike/configuration/__init__.py -------------------------------------------------------------------------------- /scale/ingest/strike/configuration/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with Strike configuration""" 2 | from util.exceptions import ValidationException 3 | 4 | 5 | class InvalidStrikeConfiguration(ValidationException): 6 | """Exception indicating that the provided strike configuration was invalid""" 7 | 8 | def __init__(self, description): 9 | """Constructor 10 | 11 | :param description: The description of the validation error 12 | :type description: string 13 | """ 14 | 15 | super(InvalidStrikeConfiguration, self).__init__('INVALID_STRIKE_CONFIGURATION', description) -------------------------------------------------------------------------------- /scale/ingest/strike/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/strike/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/ingest/strike/monitors/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/strike/monitors/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/ingest/test/messages/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/ingest/test/scan/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/scan/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/scan/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/scan/configuration/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/scan/scanners/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/scan/scanners/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/strike/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/strike/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/strike/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/strike/configuration/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/strike/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/strike/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/strike/monitors/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/strike/monitors/__init__.py -------------------------------------------------------------------------------- /scale/ingest/test/test_ingest_job.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | import django 4 | from django.test import TransactionTestCase 5 | 6 | import ingest.test.utils as ingest_test_utils 7 | import source.test.utils as source_test_utils 8 | 9 | 10 | class TestPerformIngest(TransactionTestCase): 11 | fixtures = ['ingest_job_types.json'] 12 | 13 | def setUp(self): 14 | django.setup() 15 | 16 | self.ingest = ingest_test_utils.create_ingest(status='QUEUED') 17 | self.source_file = source_test_utils.create_source(workspace=self.ingest.workspace) 18 | 19 | def test_successful(self): 20 | """Tests processing a new ingest successfully.""" 21 | 22 | pass 23 | -------------------------------------------------------------------------------- /scale/ingest/test/triggers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/ingest/test/triggers/__init__.py -------------------------------------------------------------------------------- /scale/ingest/triggers/__init__.py: -------------------------------------------------------------------------------- 1 | """Triggers (see trigger app) related to ingest""" 2 | -------------------------------------------------------------------------------- /scale/job/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'job.apps.JobConfig' 2 | -------------------------------------------------------------------------------- /scale/job/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/__init__.py -------------------------------------------------------------------------------- /scale/job/configuration/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/data/__init__.py -------------------------------------------------------------------------------- /scale/job/configuration/interface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/interface/__init__.py -------------------------------------------------------------------------------- /scale/job/configuration/interface/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with a job interface""" 2 | from __future__ import unicode_literals 3 | 4 | from error.exceptions import ScaleError 5 | 6 | 7 | class InvalidInterfaceDefinition(Exception): 8 | """Exception indicating that the provided definition of a job interface was invalid 9 | """ 10 | pass 11 | 12 | 13 | class InvalidEnvironment(Exception): 14 | """Exception indicating that the provided definition of a job interface was invalid 15 | """ 16 | pass 17 | -------------------------------------------------------------------------------- /scale/job/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/job/configuration/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/results/__init__.py -------------------------------------------------------------------------------- /scale/job/configuration/results/results_manifest/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/configuration/results/results_manifest/__init__.py -------------------------------------------------------------------------------- /scale/job/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/data/__init__.py -------------------------------------------------------------------------------- /scale/job/data/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with job data""" 2 | 3 | 4 | class InvalidConnection(Exception): 5 | """Exception indicating that the provided job connection was invalid 6 | """ 7 | pass 8 | 9 | 10 | class InvalidData(Exception): 11 | """Exception indicating that the provided job data was invalid 12 | """ 13 | pass 14 | 15 | 16 | class StatusError(Exception): 17 | """Exception indicating that an operation cannot be completed due to the current job status. 18 | """ 19 | pass 20 | -------------------------------------------------------------------------------- /scale/job/error/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/error/__init__.py -------------------------------------------------------------------------------- /scale/job/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with jobs and job types""" 2 | from __future__ import unicode_literals 3 | 4 | 5 | class InvalidJobField(Exception): 6 | """Exception indicating that a job type or job field was given an invalid value 7 | """ 8 | 9 | pass 10 | 11 | class NonSeedJobType(Exception): 12 | """Exception indicating that a job type is not a seed job type 13 | """ 14 | pass 15 | 16 | class InactiveJobType(Exception): 17 | """Exception indicating that a job type is inactive 18 | """ 19 | pass -------------------------------------------------------------------------------- /scale/job/execution/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/__init__.py -------------------------------------------------------------------------------- /scale/job/execution/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/configuration/__init__.py -------------------------------------------------------------------------------- /scale/job/execution/configuration/docker_param.py: -------------------------------------------------------------------------------- 1 | """Defines a Docker parameter that is set for a task""" 2 | from __future__ import unicode_literals 3 | 4 | 5 | class DockerParameter(object): 6 | """Represents a Docker parameter set for a task 7 | """ 8 | 9 | def __init__(self, flag, value): 10 | """Creates a Docker parameter 11 | 12 | :param flag: The Docker flag of the parameter 13 | :type flag: string 14 | :param value: The value being passed to the Docker parameter 15 | :type value: string 16 | """ 17 | 18 | self.flag = flag 19 | self.value = value 20 | -------------------------------------------------------------------------------- /scale/job/execution/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/job/execution/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with job executions""" 2 | from __future__ import unicode_literals 3 | 4 | 5 | class InvalidTaskResults(Exception): 6 | """Exception indicating that the provided task results JSON was invalid 7 | """ 8 | 9 | pass 10 | -------------------------------------------------------------------------------- /scale/job/execution/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/tasks/__init__.py -------------------------------------------------------------------------------- /scale/job/execution/tasks/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/tasks/json/__init__.py -------------------------------------------------------------------------------- /scale/job/execution/tasks/json/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/execution/tasks/json/results/__init__.py -------------------------------------------------------------------------------- /scale/job/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/handlers/__init__.py -------------------------------------------------------------------------------- /scale/job/handlers/inputs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/handlers/inputs/__init__.py -------------------------------------------------------------------------------- /scale/job/handlers/inputs/file.py: -------------------------------------------------------------------------------- 1 | """Defines the class for handling file inputs""" 2 | from __future__ import unicode_literals 3 | 4 | from job.handlers.inputs.base_input import Input 5 | 6 | 7 | class FileInput(Input): 8 | """Represents a file input 9 | """ 10 | 11 | def __init__(self, input_name, required): 12 | """Constructor 13 | 14 | :param input_name: The name of the input 15 | :type input_name: str 16 | :param required: Whether the input is required 17 | :type required: bool 18 | """ 19 | 20 | super(FileInput, self).__init__(input_name, 'file', required) 21 | -------------------------------------------------------------------------------- /scale/job/handlers/inputs/files.py: -------------------------------------------------------------------------------- 1 | """Defines the class for handling files inputs""" 2 | from __future__ import unicode_literals 3 | 4 | from job.handlers.inputs.base_input import Input 5 | 6 | 7 | class FilesInput(Input): 8 | """Represents a multiple file input 9 | """ 10 | 11 | def __init__(self, input_name, required): 12 | """Constructor 13 | 14 | :param input_name: The name of the input 15 | :type input_name: str 16 | :param required: Whether the input is required 17 | :type required: bool 18 | """ 19 | 20 | super(FilesInput, self).__init__(input_name, 'files', required) 21 | -------------------------------------------------------------------------------- /scale/job/handlers/inputs/property.py: -------------------------------------------------------------------------------- 1 | """Defines the class for handling property inputs""" 2 | from __future__ import unicode_literals 3 | 4 | from job.handlers.inputs.base_input import Input 5 | 6 | 7 | class PropertyInput(Input): 8 | """Represents a property input 9 | """ 10 | 11 | def __init__(self, input_name, required): 12 | """Constructor 13 | 14 | :param input_name: The name of the input 15 | :type input_name: str 16 | :param required: Whether the input is required 17 | :type required: bool 18 | """ 19 | 20 | super(PropertyInput, self).__init__(input_name, 'property', required) 21 | -------------------------------------------------------------------------------- /scale/job/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/management/__init__.py -------------------------------------------------------------------------------- /scale/job/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/job/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/messages/__init__.py -------------------------------------------------------------------------------- /scale/job/migrations/0002_jobexecution_job_metrics.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import util.deprecation 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='jobexecution', 17 | name='job_metrics', 18 | field=util.deprecation.JSONStringField(default={}, null=True, blank=True), 19 | preserve_default=True, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/job/migrations/0007_job_job_type_rev.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0006_auto_20151106_1608'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='job', 17 | name='job_type_rev', 18 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=1, to='job.JobTypeRevision'), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/job/migrations/0008_jobtype_trigger_rule.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('trigger', '0001_initial'), 12 | ('job', '0007_job_job_type_rev'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='jobtype', 18 | name='trigger_rule', 19 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='trigger.TriggerRule', null=True), 20 | preserve_default=True, 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /scale/job/migrations/0009_jobtype_revision_num.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('job', '0008_jobtype_trigger_rule'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='jobtype', 16 | name='revision_num', 17 | field=models.IntegerField(default=1), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0011_jobtype_max_scheduled.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('job', '0010_auto_20151208_1503'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='jobtype', 16 | name='max_scheduled', 17 | field=models.IntegerField(null=True, blank=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0018_auto_20160804_1402.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('job', '0017_auto_20160426_1556'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='jobexecution', 16 | name='current_stderr_url', 17 | ), 18 | migrations.RemoveField( 19 | model_name='jobexecution', 20 | name='current_stdout_url', 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /scale/job/migrations/0022_jobtype_configuration.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import util.deprecation 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0021_auto_20161115_1524'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='jobtype', 17 | name='configuration', 18 | field=util.deprecation.JSONStringField(default={}, null=True, blank=True), 19 | preserve_default=True, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/job/migrations/0023_jobtype_shared_mem_required.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('job', '0022_jobtype_configuration'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='jobtype', 16 | name='shared_mem_required', 17 | field=models.FloatField(default=0.0), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0025_auto_20170504_1534.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-05-04 19:34 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0024_auto_20170412_1225'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='jobexecution', 17 | name='ended', 18 | field=models.DateTimeField(blank=True, db_index=True, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0026_auto_20170510_1151.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-05-10 15:51 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0025_auto_20170504_1534'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='job', 17 | name='last_status_change', 18 | field=models.DateTimeField(blank=True, db_index=True, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0030_remove_job_configuration.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-07-27 19:25 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0029_auto_20170707_1034'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='job', 17 | name='configuration', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/job/migrations/0032_job_node.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-09-26 19:29 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('node', '0004_auto_20170524_1639'), 13 | ('job', '0031_auto_20170822_1544'), 14 | ] 15 | 16 | operations = [ 17 | migrations.AddField( 18 | model_name='job', 19 | name='node', 20 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='node.Node'), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /scale/job/migrations/0042_auto_20180802_1830.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-08-02 18:30 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0041_jobtypetag'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterModelTable( 16 | name='jobtypetag', 17 | table='job_type_tag', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/job/migrations/0043_remove_jobtypetag_job_type.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-08-24 01:09 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0042_auto_20180802_1830'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='jobtypetag', 17 | name='job_type', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/job/migrations/0050_job_configuration.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-11-15 22:41 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('job', '0049_auto_20180927_1531'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='job', 18 | name='configuration', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/job/migrations/0052_jobtype_is_published.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.16 on 2019-02-19 19:13 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0051_auto_20190211_1500'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='jobtype', 17 | name='is_published', 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/0053_jobtype_unmet_resources.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2019-02-24 15:14 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('job', '0052_jobtype_is_published'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='jobtype', 17 | name='unmet_resources', 18 | field=models.CharField(blank=True, max_length=250, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/job/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/migrations/__init__.py -------------------------------------------------------------------------------- /scale/job/seed/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/seed/__init__.py -------------------------------------------------------------------------------- /scale/job/seed/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/seed/results/__init__.py -------------------------------------------------------------------------------- /scale/job/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/tasks/__init__.py -------------------------------------------------------------------------------- /scale/job/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/job/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/job/test/configuration/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/configuration/data/__init__.py -------------------------------------------------------------------------------- /scale/job/test/configuration/interface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/configuration/interface/__init__.py -------------------------------------------------------------------------------- /scale/job/test/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/job/test/configuration/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/configuration/results/__init__.py -------------------------------------------------------------------------------- /scale/job/test/error/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/error/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/configuration/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/tasks/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/tasks/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/tasks/json/__init__.py -------------------------------------------------------------------------------- /scale/job/test/execution/tasks/json/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/execution/tasks/json/results/__init__.py -------------------------------------------------------------------------------- /scale/job/test/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/management/__init__.py -------------------------------------------------------------------------------- /scale/job/test/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/job/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/job/test/seed/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/seed/__init__.py -------------------------------------------------------------------------------- /scale/job/test/seed/results/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/seed/results/__init__.py -------------------------------------------------------------------------------- /scale/job/test/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/job/test/tasks/__init__.py -------------------------------------------------------------------------------- /scale/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scale.local_settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /scale/mesos_api/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'mesos_api.apps.MesosConfig' 2 | -------------------------------------------------------------------------------- /scale/mesos_api/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class MesosConfig(AppConfig): 7 | """Configuration for the mesos_api app 8 | """ 9 | 10 | name = 'mesos_api' 11 | label = 'mesos_api' 12 | verbose_name = 'Mesos API' 13 | -------------------------------------------------------------------------------- /scale/mesos_api/offers.py: -------------------------------------------------------------------------------- 1 | """Defines the functions for generating Mesos tasks""" 2 | from __future__ import unicode_literals 3 | 4 | import logging 5 | 6 | from mesos_api.utils import obj_from_json 7 | 8 | logger = logging.getLogger(__name__) 9 | 10 | 11 | def from_mesos_offer(mesos_offer): 12 | """Creates a dot accessible offer from input dict 13 | 14 | :param mesos_offer: Offer object to translate into dot accessible object 15 | :type mesos_offer: :class:`mesoshttp.offers.Offer` 16 | :returns: Dot accessible object 17 | :rtype: :class:`Namespace` 18 | """ 19 | 20 | return obj_from_json(mesos_offer.get_offer()) -------------------------------------------------------------------------------- /scale/mesos_api/unversioned/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/mesos_api/unversioned/__init__.py -------------------------------------------------------------------------------- /scale/messaging/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'messaging.apps.MessagingConfig' 2 | -------------------------------------------------------------------------------- /scale/messaging/backends/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scale/messaging/exceptions.py: -------------------------------------------------------------------------------- 1 | class InvalidCommandMessage(Exception): 2 | """Exception indicating an invalid message identified during message processing""" 3 | 4 | pass 5 | 6 | 7 | class CommandMessageExecuteFailure(Exception): 8 | """Exception indicating a failure signaled by execute function of CommandMessage""" 9 | 10 | pass 11 | -------------------------------------------------------------------------------- /scale/messaging/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/messaging/management/__init__.py -------------------------------------------------------------------------------- /scale/messaging/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/messaging/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/messaging/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/messaging/messages/__init__.py -------------------------------------------------------------------------------- /scale/messaging/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/messaging/test/__init__.py -------------------------------------------------------------------------------- /scale/metrics/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'metrics.apps.MetricsConfig' 2 | -------------------------------------------------------------------------------- /scale/metrics/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/metrics/management/__init__.py -------------------------------------------------------------------------------- /scale/metrics/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/metrics/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/metrics/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/metrics/migrations/__init__.py -------------------------------------------------------------------------------- /scale/metrics/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/metrics/test/__init__.py -------------------------------------------------------------------------------- /scale/metrics/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful metrics services""" 2 | from django.conf.urls import url 3 | 4 | import metrics.views 5 | 6 | urlpatterns = [ 7 | url(r'^metrics/$', metrics.views.MetricsView.as_view(), name='metrics_view'), 8 | url(r'^metrics/([\w-]+)/$', metrics.views.MetricDetailsView.as_view(), name='metric_details_view'), 9 | url(r'^metrics/([\w-]+)/plot-data/$', metrics.views.MetricPlotView.as_view(), name='metric_plot_view'), 10 | ] 11 | -------------------------------------------------------------------------------- /scale/node/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'node.apps.NodeConfig' 2 | -------------------------------------------------------------------------------- /scale/node/admin.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.contrib import admin 4 | from node.models import Node 5 | 6 | 7 | class NodeAdmin(admin.ModelAdmin): 8 | list_display = ('hostname', 'is_paused', 'pause_reason', 'is_active', 'deprecated') 9 | 10 | admin.site.register(Node, NodeAdmin) 11 | -------------------------------------------------------------------------------- /scale/node/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class NodeConfig(AppConfig): 7 | """Configuration for the node app 8 | """ 9 | name = 'node' 10 | label = 'node' 11 | verbose_name = 'Node' 12 | -------------------------------------------------------------------------------- /scale/node/migrations/0002_node_pause_reason.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('node', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='node', 16 | name='pause_reason', 17 | field=models.CharField(max_length=250, null=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/node/migrations/0003_node_is_paused_errors.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('node', '0002_node_pause_reason'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='node', 16 | name='is_paused_errors', 17 | field=models.BooleanField(default=False), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/node/migrations/0004_auto_20170524_1639.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-05-24 20:39 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('node', '0003_node_is_paused_errors'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name='node', 17 | old_name='archived', 18 | new_name='deprecated', 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/node/migrations/0006_node_last_offer_received.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2019-08-01 15:24 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('node', '0005_auto_20181220_2014'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='node', 17 | name='last_offer_received', 18 | field=models.DateTimeField(auto_now_add=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/node/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/node/migrations/__init__.py -------------------------------------------------------------------------------- /scale/node/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/node/resources/__init__.py -------------------------------------------------------------------------------- /scale/node/resources/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with resources""" 2 | from __future__ import unicode_literals 3 | 4 | 5 | class InvalidResources(Exception): 6 | """Exception indicating that the provided resources schema was invalid 7 | """ 8 | 9 | pass 10 | -------------------------------------------------------------------------------- /scale/node/resources/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/node/resources/json/__init__.py -------------------------------------------------------------------------------- /scale/node/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/node/test/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/node/test/resources/__init__.py -------------------------------------------------------------------------------- /scale/node/test/resources/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/node/test/resources/json/__init__.py -------------------------------------------------------------------------------- /scale/node/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful node services""" 2 | from __future__ import unicode_literals 3 | 4 | from django.conf.urls import url 5 | 6 | import node.views as views 7 | 8 | urlpatterns = [ 9 | url(r'^nodes/$', views.NodesView.as_view(), name='nodes_view'), 10 | url(r'^nodes/(\d+)/$', views.NodeDetailsView.as_view(), name='node_details_view'), 11 | ] 12 | -------------------------------------------------------------------------------- /scale/pip/docs.txt: -------------------------------------------------------------------------------- 1 | # This file lists all Python libraries required to build the docs on Linux 2 | # This also requires the production.txt requirements 3 | # Use command: pip install -r docs.txt 4 | 5 | # Doc build packages 6 | mock>=2.0.0,<2.1.0 7 | Sphinx>=1.5.3,<1.6.0 8 | sphinx_rtd_theme>=0.1.9,<1 9 | 10 | # Needed for new wiki docs 11 | mkdocs>0.16.0,<1.0.0 12 | mkdocs-material<=3.0.0 13 | pymdown-extensions<=6.0 14 | -------------------------------------------------------------------------------- /scale/product/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'product.apps.ProductConfig' 2 | -------------------------------------------------------------------------------- /scale/product/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/product/configuration/__init__.py -------------------------------------------------------------------------------- /scale/product/migrations/0005_auto_20170127_1344.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import connection, models, migrations 5 | 6 | 7 | def copy_product_file(apps, schema_editor): 8 | with connection.cursor() as cursor: 9 | cursor.execute('SELECT * INTO product_file_temp FROM product_file') 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('product', '0004_auto_20170127_1324'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(copy_product_file), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/product/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/product/migrations/__init__.py -------------------------------------------------------------------------------- /scale/product/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/product/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/product/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/queue/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'queue.apps.QueueConfig' 2 | -------------------------------------------------------------------------------- /scale/queue/fixtures/queue_trigger_rules.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "trigger.TriggerRule", 4 | "pk": null, 5 | "fields": { 6 | "type": "CLOCK", 7 | "name": "scale-job-load", 8 | "configuration": { 9 | "version": "1.0", 10 | "event_type": "JOB_LOAD", 11 | "schedule": "PT1H0M0S" 12 | }, 13 | "is_active": true, 14 | "created": "2015-09-22T00:00:00.0Z", 15 | "archived": null, 16 | "last_modified": "2015-09-22T00:00:00.0Z" 17 | } 18 | } 19 | ] 20 | -------------------------------------------------------------------------------- /scale/queue/job_load.py: -------------------------------------------------------------------------------- 1 | """Defines the clock event processor for tracking historical job load.""" 2 | from job.clock import ClockEventProcessor 3 | from queue.models import JobLoad 4 | 5 | 6 | class JobLoadProcessor(ClockEventProcessor): 7 | """This class queries and stores job load statistics for tracking and trending.""" 8 | 9 | def process_event(self, event, last_event=None): 10 | """See :meth:`job.clock.ClockEventProcessor.process_event`. 11 | 12 | Calculates metrics for the job load over time. 13 | """ 14 | JobLoad.objects.calculate() 15 | -------------------------------------------------------------------------------- /scale/queue/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/queue/messages/__init__.py -------------------------------------------------------------------------------- /scale/queue/migrations/0003_auto_20151023_1104.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('queue', '0002_jobload'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='jobload', 17 | name='job_type', 18 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='job.JobType', null=True), 19 | preserve_default=True, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/queue/migrations/0004_remove_queue_is_job_type_paused.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('queue', '0003_auto_20151023_1104'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='queue', 16 | name='is_job_type_paused', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /scale/queue/migrations/0006_auto_20160316_1625.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('queue', '0005_queue_node_required'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='queuedepthbyjobtype', 16 | name='job_type', 17 | ), 18 | migrations.DeleteModel( 19 | name='QueueDepthByJobType', 20 | ), 21 | migrations.DeleteModel( 22 | name='QueueDepthByPriority', 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /scale/queue/migrations/0017_queue_docker_image.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.15 on 2018-08-30 17:49 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('queue', '0016_auto_20180123_2037'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='queue', 17 | name='docker_image', 18 | field=models.TextField(default=''), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/queue/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/queue/migrations/__init__.py -------------------------------------------------------------------------------- /scale/queue/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/queue/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/queue/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/queue/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful queue services""" 2 | from django.conf.urls import url 3 | 4 | import queue.views 5 | 6 | urlpatterns = [ 7 | url(r'^load/$', queue.views.JobLoadView.as_view(), name='load_view'), 8 | url(r'^queue/status/$', queue.views.QueueStatusView.as_view(), name='queue_status_view'), 9 | ] 10 | -------------------------------------------------------------------------------- /scale/recipe/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'recipe.apps.RecipeConfig' 2 | -------------------------------------------------------------------------------- /scale/recipe/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/configuration/__init__.py -------------------------------------------------------------------------------- /scale/recipe/configuration/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/configuration/data/__init__.py -------------------------------------------------------------------------------- /scale/recipe/configuration/data/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipe data""" 2 | 3 | 4 | class InvalidRecipeConnection(Exception): 5 | """Exception indicating that the provided recipe connection was invalid 6 | """ 7 | 8 | pass 9 | 10 | 11 | class InvalidRecipeData(Exception): 12 | """Exception indicating that the provided recipe data was invalid 13 | """ 14 | 15 | pass 16 | -------------------------------------------------------------------------------- /scale/recipe/configuration/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/configuration/definition/__init__.py -------------------------------------------------------------------------------- /scale/recipe/configuration/definition/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipe definitions""" 2 | 3 | 4 | class InvalidDefinition(Exception): 5 | """Exception indicating that the provided recipe definition was invalid 6 | """ 7 | pass 8 | -------------------------------------------------------------------------------- /scale/recipe/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/definition/__init__.py -------------------------------------------------------------------------------- /scale/recipe/definition/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipe definitions""" 2 | from util.exceptions import ValidationException 3 | 4 | 5 | class InvalidDefinition(ValidationException): 6 | """Exception indicating that the provided recipe definition was invalid""" 7 | 8 | def __init__(self, name, description): 9 | """Constructor 10 | 11 | :param name: The name of the validation error 12 | :type name: string 13 | :param description: The description of the validation error 14 | :type description: string 15 | """ 16 | 17 | super(InvalidDefinition, self).__init__(name, description) 18 | -------------------------------------------------------------------------------- /scale/recipe/definition/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/definition/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/diff/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/diff/__init__.py -------------------------------------------------------------------------------- /scale/recipe/diff/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipe graph diffs""" 2 | 3 | 4 | class InvalidDiff(Exception): 5 | """Exception indicating that the provided recipe graph diff was invalid""" 6 | 7 | pass 8 | -------------------------------------------------------------------------------- /scale/recipe/diff/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/diff/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipes and recipe types""" 2 | 3 | 4 | class CreateRecipeError(Exception): 5 | """Exception indicating that a recipe cannot be created""" 6 | pass 7 | 8 | 9 | class ReprocessError(Exception): 10 | """Exception indicating that a reprocessing request cannot be completed""" 11 | pass 12 | 13 | 14 | class SupersedeError(Exception): 15 | """Exception indicating that a recipe cannot be superseded""" 16 | pass 17 | 18 | class InactiveRecipeType(Exception): 19 | """Exception indicating that a recipe type is inactive 20 | """ 21 | pass -------------------------------------------------------------------------------- /scale/recipe/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/handlers/__init__.py -------------------------------------------------------------------------------- /scale/recipe/instance/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/instance/__init__.py -------------------------------------------------------------------------------- /scale/recipe/instance/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with recipe instances""" 2 | 3 | 4 | class InvalidRecipe(Exception): 5 | """Exception indicating that the provided recipe instance was invalid""" 6 | 7 | pass 8 | -------------------------------------------------------------------------------- /scale/recipe/instance/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/instance/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/messages/__init__.py -------------------------------------------------------------------------------- /scale/recipe/migrations/0003_recipe_recipe_type_rev.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0002_auto_20151106_1409'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='recipe', 17 | name='recipe_type_rev', 18 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=1, to='recipe.RecipeTypeRevision'), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0005_recipetype_revision_num.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('recipe', '0004_recipetype_trigger_rule'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='recipetype', 16 | name='revision_num', 17 | field=models.IntegerField(default=1), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0006_auto_20151125_1404.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('recipe', '0005_recipetype_revision_num'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='recipetype', 16 | name='title', 17 | field=models.CharField(default='', max_length=50, blank=True), 18 | preserve_default=False, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0007_auto_20160310_1318.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('recipe', '0006_auto_20151125_1404'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='recipe', 16 | name='last_modified', 17 | field=models.DateTimeField(auto_now=True), # Removed db_index to workaround a migration hashing bug 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0011_auto_20160330_1505.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('recipe', '0010_auto_20160330_1412'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RenameModel( 15 | old_name='recipejob', 16 | new_name='recipejobold', 17 | ), 18 | migrations.AlterModelTable( 19 | name='recipejobold', 20 | table='recipe_job_old', 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0014_auto_20160608_1402.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('recipe', '0013_auto_20160331_1127'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='recipejobold', 16 | name='job', 17 | ), 18 | migrations.RemoveField( 19 | model_name='recipejobold', 20 | name='recipe', 21 | ), 22 | migrations.DeleteModel( 23 | name='recipejobold', 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0019_recipetype_is_system.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-11-13 21:34 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0018_recipefile_recipe_input'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='recipetype', 17 | name='is_system', 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0020_auto_20180119_0055.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.1 on 2018-01-19 00:55 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0019_recipetype_is_system'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name='recipe', 17 | old_name='data', 18 | new_name='input', 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0023_auto_20180523_1247.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-05-23 12:47 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0022_auto_20180307_1617'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameModel( 16 | old_name='RecipeJob', 17 | new_name='RecipeNode', 18 | ), 19 | migrations.AlterModelTable( 20 | name='recipenode', 21 | table='recipe_node', 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0026_auto_20180723_1914.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-07-23 19:14 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0025_auto_20180608_0114'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name='recipeinputfile', 17 | old_name='scale_file', 18 | new_name='input_file', 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0027_auto_20181016_1344.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-10-16 13:44 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0027_auto_20181008_1756'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterUniqueTogether( 16 | name='recipetype', 17 | unique_together=set([]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0029_auto_20181016_1431.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2018-10-16 14:31 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0028_auto_20181016_1349'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='recipetype', 17 | name='name', 18 | field=models.CharField(max_length=50, unique=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0033_auto_20181102_0307.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-11-02 03:07 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0032_recipe_type_link_tables'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name='recipetype', 17 | old_name='archived', 18 | new_name='deprecated', 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0034_recipe_configuration.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-12-20 17:11 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('recipe', '0033_auto_20181102_0307'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='recipe', 18 | name='configuration', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0036_remove_recipetype_version.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.15 on 2019-03-25 19:54 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0035_auto_20190126_2340'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='recipetype', 17 | name='version', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/recipe/migrations/0037_remove_recipetype_trigger_rule.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.15 on 2019-04-15 14:28 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('recipe', '0036_remove_recipetype_version'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='recipetype', 17 | name='trigger_rule', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/recipe/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/migrations/__init__.py -------------------------------------------------------------------------------- /scale/recipe/seed/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/seed/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/recipe/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/configuration/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/configuration/data/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/configuration/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/configuration/definition/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/definition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/definition/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/definition/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/definition/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/diff/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/diff/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/diff/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/diff/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/handlers/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/instance/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/instance/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/instance/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/instance/json/__init__.py -------------------------------------------------------------------------------- /scale/recipe/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/recipe/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/scale/.gitignore: -------------------------------------------------------------------------------- 1 | local_settings.py 2 | -------------------------------------------------------------------------------- /scale/scale/custom_logging.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | 4 | class UserFilter(logging.Filter): 5 | def filter(self, record): 6 | return record.levelno in (logging.DEBUG, logging.INFO) 7 | -------------------------------------------------------------------------------- /scale/scale/local_settings_DOCS.py: -------------------------------------------------------------------------------- 1 | # Settings file for use with readthedocs sphinx generation 2 | 3 | # Include all the default settings. 4 | from settings import * 5 | 6 | SECRET_KEY='15tryuv4t3hugbv7890aQ' 7 | -------------------------------------------------------------------------------- /scale/scale/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for scale project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scale.local_settings") 13 | 14 | from django.core.wsgi import get_wsgi_application 15 | 16 | _application = get_wsgi_application() 17 | 18 | def application(environ, start_response): 19 | environ['SCRIPT_NAME'] = '/api' 20 | 21 | return _application(environ, start_response) 22 | -------------------------------------------------------------------------------- /scale/scheduler/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'scheduler.apps.SchedulerConfig' 2 | -------------------------------------------------------------------------------- /scale/scheduler/admin.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.contrib import admin 4 | from models import Scheduler 5 | 6 | 7 | class SchedulerAdmin(admin.ModelAdmin): 8 | list_display = ('is_paused', 'id') 9 | 10 | admin.site.register(Scheduler, SchedulerAdmin) 11 | -------------------------------------------------------------------------------- /scale/scheduler/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class SchedulerConfig(AppConfig): 7 | """Configuration for the scheduler app 8 | """ 9 | name = 'scheduler' 10 | label = 'scheduler' 11 | verbose_name = 'Scheduler' 12 | 13 | def ready(self): 14 | """Registers components related to the scheduler""" 15 | 16 | # Register scheduler message types 17 | from messaging.messages.factory import add_message_type 18 | from scheduler.messages.restart_scheduler import RestartScheduler 19 | 20 | add_message_type(RestartScheduler) 21 | -------------------------------------------------------------------------------- /scale/scheduler/cleanup/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/cleanup/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/database/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/database/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/dependencies/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/dependencies/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/fixtures/scheduler_errors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "error.Error", 4 | "pk": null, 5 | "fields": { 6 | "name": "scheduler-lost", 7 | "title": "Scheduler Restarted", 8 | "description": "The Scale scheduler was restarted, causing the job to stop running and fail.", 9 | "category": "SYSTEM", 10 | "is_builtin": true, 11 | "should_be_retried": true, 12 | "created": "2015-03-11T00:00:00.0Z", 13 | "last_modified": "2015-03-11T00:00:00.0Z" 14 | } 15 | } 16 | ] -------------------------------------------------------------------------------- /scale/scheduler/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/management/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/messages/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/migrations/0003_auto_20160201_0846.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('scheduler', '0002_auto_20151007_1352'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='scheduler', 16 | name='max_node_errors', 17 | field=models.FloatField(default=50.0), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0004_auto_20170209_1616.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('scheduler', '0003_auto_20160201_0846'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='scheduler', 16 | name='max_node_errors', 17 | ), 18 | migrations.RemoveField( 19 | model_name='scheduler', 20 | name='node_error_period', 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0005_scheduler_queue_mode.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('scheduler', '0004_auto_20170209_1616'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='scheduler', 16 | name='queue_mode', 17 | field=models.CharField(default='FIFO', max_length=50, choices=[('FIFO', 'FIFO'), ('LIFO', 'LIFO')]), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0006_scheduler_status.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-04-24 18:29 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('scheduler', '0005_scheduler_queue_mode'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='scheduler', 18 | name='status', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0007_scheduler_num_message_handlers.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-09-11 17:06 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0006_scheduler_status'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='scheduler', 17 | name='num_message_handlers', 18 | field=models.IntegerField(default=2), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0008_auto_20171103_1334.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-11-03 13:34 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0007_scheduler_num_message_handlers'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='scheduler', 17 | name='num_message_handlers', 18 | field=models.IntegerField(default=1), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0009_scheduler_debugging_level.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2017-12-21 16:01 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0008_auto_20171103_1334'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='scheduler', 17 | name='system_logging_level', 18 | field=models.CharField(default='INFO', max_length=10), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0010_scheduler_resource_level.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2018-05-16 19:15 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0009_scheduler_debugging_level'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='scheduler', 17 | name='resource_level', 18 | field=models.CharField(default='GOOD', max_length=10), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0011_auto_20180517_1559.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2018-05-17 15:59 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0010_scheduler_resource_level'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='scheduler', 17 | name='resource_level', 18 | field=models.CharField(choices=[('TOO HIGH', 'TOO HIGH'), ('TOO LOW', 'TOO LOW'), ('GOOD', 'GOOD')], default='GOOD', max_length=10), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0012_remove_scheduler_resource_level.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-09-01 04:04 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0011_auto_20180517_1559'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='scheduler', 17 | name='resource_level', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/0013_auto_20181220_2014.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2018-12-20 20:14 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('scheduler', '0012_remove_scheduler_resource_level'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='scheduler', 17 | name='master_hostname', 18 | ), 19 | migrations.RemoveField( 20 | model_name='scheduler', 21 | name='master_port', 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /scale/scheduler/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/migrations/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/node/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/node/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/node/agent.py: -------------------------------------------------------------------------------- 1 | """Defines the class that represents an agent in the scheduler""" 2 | from __future__ import unicode_literals 3 | 4 | 5 | class Agent(object): 6 | """This class represents an agent available to Scale.""" 7 | 8 | def __init__(self, agent_id, hostname): 9 | """Constructor 10 | 11 | :param agent_id: The agent ID 12 | :type agent_id: string 13 | :param hostname: The agent's host name 14 | :type hostname: string 15 | """ 16 | 17 | self.agent_id = agent_id 18 | self.hostname = hostname 19 | -------------------------------------------------------------------------------- /scale/scheduler/recon/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/recon/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/resources/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/scheduling/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/scheduling/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/serializers.py: -------------------------------------------------------------------------------- 1 | """Defines the serializers for schedulers""" 2 | from __future__ import unicode_literals 3 | 4 | import rest_framework.serializers as serializers 5 | 6 | from scheduler.models import Scheduler 7 | 8 | class SchedulerSerializerV6(serializers.ModelSerializer): 9 | """V6 Serializer for the scheduler""" 10 | 11 | class Meta(object): 12 | """Meta class used to define what is serialized and how""" 13 | model = Scheduler 14 | fields = ('is_paused', 'num_message_handlers', 'system_logging_level', 'queue_mode') -------------------------------------------------------------------------------- /scale/scheduler/sync/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/sync/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/task/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/task/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/tasks/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/tasks/services/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/tasks/services/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/tasks/services/messaging/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/tasks/services/messaging/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/scheduler/test/database/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/database/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/dependencies/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/dependencies/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/node/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/node/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/resources/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/scheduling/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/scheduling/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/sync/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/sync/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/sync/test_scheduler_manager.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | import django 4 | from django.test import TestCase 5 | 6 | from scheduler.manager import SchedulerManager 7 | from scheduler.models import Scheduler 8 | 9 | 10 | class TestSchedulerManager(TestCase): 11 | 12 | def setUp(self): 13 | django.setup() 14 | 15 | def test_successful_update(self): 16 | """Tests doing a successful database update""" 17 | 18 | manager = SchedulerManager() 19 | manager.sync_with_database() 20 | -------------------------------------------------------------------------------- /scale/scheduler/test/sync/test_workspace_manager.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | import django 4 | from django.test import TestCase 5 | 6 | from scheduler.sync.workspace_manager import WorkspaceManager 7 | 8 | 9 | class TestWorkspaceManager(TestCase): 10 | 11 | def setUp(self): 12 | django.setup() 13 | 14 | def test_successful_update(self): 15 | """Tests doing a successful database update""" 16 | 17 | manager = WorkspaceManager() 18 | manager.sync_with_database() 19 | -------------------------------------------------------------------------------- /scale/scheduler/test/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/tasks/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/tasks/services/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/tasks/services/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/test/tasks/services/messaging/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/test/tasks/services/messaging/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/threads/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/threads/__init__.py -------------------------------------------------------------------------------- /scale/scheduler/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful node services""" 2 | from __future__ import unicode_literals 3 | 4 | from django.conf.urls import url 5 | 6 | import views 7 | 8 | urlpatterns = [ 9 | url(r'^scheduler/$', views.SchedulerView.as_view(), name='scheduler_view'), 10 | url(r'^scheduler/queued-resources/$', views.QueuedResourcesView.as_view(), name='queued_resrouces_view'), 11 | url(r'^status/$', views.StatusView.as_view(), name='status_view'), 12 | url(r'^version/$', views.VersionView.as_view(), name='version_view'), 13 | ] 14 | -------------------------------------------------------------------------------- /scale/scheduler/vault/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/scheduler/vault/__init__.py -------------------------------------------------------------------------------- /scale/shared_resource/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'shared_resource.apps.SharedResourceConfig' 2 | -------------------------------------------------------------------------------- /scale/shared_resource/apps.py: -------------------------------------------------------------------------------- 1 | """Configuration for Shared Resource App""" 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class SharedResourceConfig(AppConfig): 8 | """Configuration for the shared resource app 9 | """ 10 | name = 'shared_resource' 11 | label = 'shared_resource' 12 | verbose_name = 'Shared Resource' 13 | -------------------------------------------------------------------------------- /scale/shared_resource/migrations/0002_auto_20170412_1225.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11 on 2017-04-12 12:25 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('shared_resource', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='sharedresource', 18 | name='json_config', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /scale/shared_resource/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/shared_resource/migrations/__init__.py -------------------------------------------------------------------------------- /scale/source/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'source.apps.SourceConfig' 2 | -------------------------------------------------------------------------------- /scale/source/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/source/configuration/__init__.py -------------------------------------------------------------------------------- /scale/source/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/source/messages/__init__.py -------------------------------------------------------------------------------- /scale/source/migrations/0002_auto_20170127_1336.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import connection, models, migrations 5 | 6 | 7 | def copy_source_file(apps, schema_editor): 8 | with connection.cursor() as cursor: 9 | cursor.execute('SELECT * INTO source_file_temp FROM source_file') 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('source', '0001_initial'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(copy_source_file), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/source/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/source/migrations/__init__.py -------------------------------------------------------------------------------- /scale/source/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/source/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/source/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/source/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/source/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/storage/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'storage.apps.StorageConfig' 2 | -------------------------------------------------------------------------------- /scale/storage/brokers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/brokers/__init__.py -------------------------------------------------------------------------------- /scale/storage/brokers/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines the exceptions related to workspace brokers""" 2 | 3 | from storage.configuration.exceptions import InvalidWorkspaceConfiguration 4 | 5 | 6 | class InvalidBrokerConfiguration(InvalidWorkspaceConfiguration): 7 | """Exception indicating that a broker configuration was invalid 8 | """ 9 | 10 | pass 11 | -------------------------------------------------------------------------------- /scale/storage/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/configuration/__init__.py -------------------------------------------------------------------------------- /scale/storage/configuration/json/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/configuration/json/__init__.py -------------------------------------------------------------------------------- /scale/storage/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/management/__init__.py -------------------------------------------------------------------------------- /scale/storage/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/storage/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/messages/__init__.py -------------------------------------------------------------------------------- /scale/storage/migrations/0002_workspace_is_move_enabled.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('storage', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='workspace', 16 | name='is_move_enabled', 17 | field=models.BooleanField(default=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/0003_auto_20161202_1621.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('storage', '0002_workspace_is_move_enabled'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='scalefile', 16 | name='data_ended', 17 | field=models.DateTimeField(db_index=True, null=True, blank=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/0009_auto_20171002_1542.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-10-02 15:42 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0008_auto_20170609_1443'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='scalefile', 17 | name='created', 18 | field=models.DateTimeField(auto_now_add=True, db_index=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/0010_auto_20180613_1947.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2018-06-13 19:47 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0009_auto_20171002_1542'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name='scalefile', 17 | old_name='recipe_job', 18 | new_name='recipe_node', 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/0014_purgeresults_force_stop_purge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.15 on 2018-11-01 12:57 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0013_purgeresults'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='purgeresults', 17 | name='force_stop_purge', 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/0017_remove_scalefile_data_type.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.12 on 2019-03-18 19:04 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0016_populate_data_type_tags'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='scalefile', 17 | name='data_type', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/storage/migrations/0018_remove_scalefile_is_operational.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.15 on 2019-03-01 14:44 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0017_remove_scalefile_data_type'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='scalefile', 17 | name='is_operational', 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /scale/storage/migrations/0019_optional_description.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.10 on 2019-07-11 18:09 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('storage', '0018_remove_scalefile_is_operational'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='workspace', 17 | name='description', 18 | field=models.CharField(blank=True, max_length=500, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/storage/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/migrations/__init__.py -------------------------------------------------------------------------------- /scale/storage/settings.py: -------------------------------------------------------------------------------- 1 | """Defines all the custom settings used by this application.""" 2 | 3 | from django.conf import settings 4 | 5 | # S3 file storage options 6 | S3_STORAGE_CLASS = getattr(settings, 'S3_STORAGE_CLASS', 'STANDARD') # (STANDARD, REDUCED_REDUNDANCY) 7 | S3_SERVER_SIDE_ENCRYPTION = getattr(settings, 'S3_SERVER_SIDE_ENCRYPTION', None) # (None, AES256) 8 | 9 | # Max number of retries for recoverable download errors 10 | S3_RETRY_COUNT = getattr(settings, 'S3_RETRY_COUNT', 3) 11 | 12 | # The delay between retry attempts 13 | S3_RETRY_DELAY = getattr(settings, 'S3_RETRY_DELAY', 60) # 1 minute 14 | -------------------------------------------------------------------------------- /scale/storage/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/storage/test/brokers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/brokers/__init__.py -------------------------------------------------------------------------------- /scale/storage/test/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/configuration/__init__.py -------------------------------------------------------------------------------- /scale/storage/test/fixtures/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/fixtures/__init__.py -------------------------------------------------------------------------------- /scale/storage/test/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/management/__init__.py -------------------------------------------------------------------------------- /scale/storage/test/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/management/commands/__init__.py -------------------------------------------------------------------------------- /scale/storage/test/messages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/storage/test/messages/__init__.py -------------------------------------------------------------------------------- /scale/timeline/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/timeline/__init__.py -------------------------------------------------------------------------------- /scale/timeline/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class TimelineConfig(AppConfig): 8 | name = 'timeline' 9 | -------------------------------------------------------------------------------- /scale/timeline/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/timeline/migrations/__init__.py -------------------------------------------------------------------------------- /scale/timeline/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models 5 | 6 | # Create your models here. 7 | -------------------------------------------------------------------------------- /scale/timeline/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/timeline/urls.py: -------------------------------------------------------------------------------- 1 | """Defines the URLs for the RESTful recipe services""" 2 | from django.conf.urls import url 3 | 4 | import timeline.views 5 | 6 | # Gantt Chart urls 7 | urlpatterns = [ 8 | # Recipe type views 9 | url(r'^timeline/recipe-types/$', timeline.views.TimelineRecipeTypeView.as_view(), name='timeline_recipe_type_view'), 10 | url(r'^timeline/job-types/$', timeline.views.TimelineJobTypeView.as_view(), name='timeline_job_type_view'), 11 | ] 12 | -------------------------------------------------------------------------------- /scale/trigger/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'trigger.apps.TriggerConfig' 2 | -------------------------------------------------------------------------------- /scale/trigger/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class TriggerConfig(AppConfig): 7 | """Configuration for the trigger app 8 | """ 9 | name = 'trigger' 10 | label = 'trigger' 11 | verbose_name = 'Trigger' 12 | -------------------------------------------------------------------------------- /scale/trigger/configuration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/trigger/configuration/__init__.py -------------------------------------------------------------------------------- /scale/trigger/configuration/exceptions.py: -------------------------------------------------------------------------------- 1 | """Defines exceptions that can occur when interacting with trigger rules""" 2 | 3 | 4 | class InvalidTriggerRule(Exception): 5 | """Exception indicating that the provided trigger rule configuration was invalid 6 | """ 7 | 8 | pass 9 | 10 | 11 | class InvalidTriggerType(Exception): 12 | """Exception indicating that the provided trigger rule type was invalid 13 | """ 14 | 15 | pass 16 | 17 | class InvalidTriggerMissingConfiguration(Exception): 18 | """Exception indicating that the provided trigger rule was missing an associated configuration 19 | """ 20 | 21 | pass 22 | -------------------------------------------------------------------------------- /scale/trigger/migrations/0002_auto_20151125_1438.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('trigger', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='triggerrule', 16 | name='is_active', 17 | field=models.BooleanField(default=True, db_index=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/trigger/migrations/0004_auto_20151207_1215.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('trigger', '0003_auto_20151202_1325'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='triggerrule', 16 | name='name', 17 | field=models.CharField(default='', max_length=50, blank=True), 18 | preserve_default=False, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /scale/trigger/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/trigger/migrations/__init__.py -------------------------------------------------------------------------------- /scale/trigger/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/trigger/test/__init__.py -------------------------------------------------------------------------------- /scale/trigger/test/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /scale/util/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'util.apps.UtilConfig' 2 | -------------------------------------------------------------------------------- /scale/util/apps.py: -------------------------------------------------------------------------------- 1 | """Defines the application configuration for the util application""" 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class UtilConfig(AppConfig): 8 | """Configuration for the util app 9 | """ 10 | name = 'util' 11 | label = 'util' 12 | verbose_name = 'Util' 13 | -------------------------------------------------------------------------------- /scale/util/deprecation.py: -------------------------------------------------------------------------------- 1 | # Classes needed to shim migrations based on abandoned external packages 2 | 3 | from django.contrib.postgres.fields import JSONField 4 | 5 | 6 | class JSONStringField(JSONField): 7 | def db_type(self, connection): 8 | return 'json' 9 | -------------------------------------------------------------------------------- /scale/util/environment.py: -------------------------------------------------------------------------------- 1 | def normalize_env_var_name(name): 2 | """Returns a normalized version of the given string name so it can be used as the name of an environment variable 3 | 4 | :param name: The string name to normalize 5 | :type name: string 6 | :returns: The normalized environment variable name 7 | :rtype: string 8 | """ 9 | 10 | return name.replace('-', '_').upper() -------------------------------------------------------------------------------- /scale/util/file_size.py: -------------------------------------------------------------------------------- 1 | """Defines a utility method for displaying file sizes""" 2 | 3 | SIZE_LABELS = ['bytes', 'KiB', 'MiB', 'GiB', 'TiB'] 4 | MAX_LABEL_INDEX = len(SIZE_LABELS) - 1 5 | 6 | 7 | def file_size_to_string(file_size): 8 | """Returns the given file size as a human-readable string 9 | 10 | :param file_size: The file size 11 | :type file_size: long 12 | :returns: The human-readable string 13 | :rtype: string 14 | """ 15 | 16 | label_index = 0 17 | factor = 1024.0 18 | while label_index < MAX_LABEL_INDEX and file_size > factor: 19 | file_size /= factor 20 | label_index += 1 21 | return '%.2f %s' % (file_size, SIZE_LABELS[label_index]) 22 | -------------------------------------------------------------------------------- /scale/util/os_helper.py: -------------------------------------------------------------------------------- 1 | """Helper methods for os operations""" 2 | 3 | import os, errno 4 | 5 | def makedirs(path, mode=0755): 6 | try: 7 | os.makedirs(path, mode) 8 | except OSError as e: 9 | if e.errno != errno.EEXIST: 10 | raise -------------------------------------------------------------------------------- /scale/util/test/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Disable logging for unit tests 4 | logging.disable(logging.CRITICAL) 5 | -------------------------------------------------------------------------------- /scale/vault/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'vault.apps.VaultConfig' 2 | -------------------------------------------------------------------------------- /scale/vault/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class VaultConfig(AppConfig): 7 | """ 8 | Configuration for the vault app 9 | """ 10 | name = 'vault' 11 | label = 'vault' 12 | verbose_name = 'Vault' 13 | -------------------------------------------------------------------------------- /scale/vault/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/scale/vault/test/__init__.py -------------------------------------------------------------------------------- /tests/postman/environment.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f5eb4cac-e508-4815-8be6-e67ba7d86b62", 3 | "name": "AIS Public Omega", 4 | "values": [ 5 | { 6 | "key": "SCALE_BASE", 7 | "value": "https://scale.omega.aisohio.net/api", 8 | "enabled": true 9 | }, 10 | { 11 | "key": "SCALE_USERNAME", 12 | "value": "admin", 13 | "enabled": true 14 | }, 15 | { 16 | "key": "SCALE_PASSWORD", 17 | "value": "admin", 18 | "enabled": true 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /web-docs/css/bootstrap-overrides.css: -------------------------------------------------------------------------------- 1 | .navbar-brand img { 2 | width: 20px; 3 | float: left; 4 | vertical-align: middle; 5 | margin: 0 5px 0 0; 6 | } 7 | 8 | .jumbotron { 9 | background: url('../images/horizon-3.jpg') no-repeat 50% top scroll; 10 | background-size: 100%; 11 | background-color: #000; 12 | padding-top: 0; 13 | padding-bottom: 15px; 14 | min-height: 55vh; 15 | } 16 | 17 | .jumbotron h1 { 18 | color: #fff; 19 | text-shadow: 2px 2px 2px #000; 20 | margin-right: auto; 21 | margin-left: auto; 22 | max-width: 80%; 23 | } 24 | 25 | .panel-body { 26 | padding: 5px; 27 | } 28 | -------------------------------------------------------------------------------- /web-docs/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /web-docs/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /web-docs/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /web-docs/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /web-docs/images/example-thumb-audio.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/example-thumb-audio.jpg -------------------------------------------------------------------------------- /web-docs/images/example-thumb-hyperspectral.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/example-thumb-hyperspectral.jpg -------------------------------------------------------------------------------- /web-docs/images/example-thumb-mri.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/example-thumb-mri.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart1a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart1a.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart1b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart1b.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart1c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart1c.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart1d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart1d.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart1e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart1e.jpg -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2a.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2b.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2c.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2d.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2e.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2f.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2g.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2h.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart2i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart2i.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart3a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart3a.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart3b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart3b.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart3c.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart3d.png -------------------------------------------------------------------------------- /web-docs/images/gif-source/quickstart3e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/gif-source/quickstart3e.png -------------------------------------------------------------------------------- /web-docs/images/horizon-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/horizon-1.jpg -------------------------------------------------------------------------------- /web-docs/images/horizon-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/horizon-2.jpg -------------------------------------------------------------------------------- /web-docs/images/horizon-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/horizon-3.jpg -------------------------------------------------------------------------------- /web-docs/images/quickstart1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/quickstart1.gif -------------------------------------------------------------------------------- /web-docs/images/quickstart2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/quickstart2.gif -------------------------------------------------------------------------------- /web-docs/images/quickstart3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/quickstart3.gif -------------------------------------------------------------------------------- /web-docs/images/scale-dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/scale-dashboard.jpg -------------------------------------------------------------------------------- /web-docs/images/scale-flow-ingest-detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/scale-flow-ingest-detail.jpg -------------------------------------------------------------------------------- /web-docs/images/scale-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/scale-flow.png -------------------------------------------------------------------------------- /web-docs/images/scale3-transparent-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/scale3-transparent-128.png -------------------------------------------------------------------------------- /web-docs/images/shutterstock_128679269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/shutterstock_128679269.jpg -------------------------------------------------------------------------------- /web-docs/images/tutorial-thumb-algorithm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/tutorial-thumb-algorithm.jpg -------------------------------------------------------------------------------- /web-docs/images/tutorial-thumb-quickstart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/tutorial-thumb-quickstart.jpg -------------------------------------------------------------------------------- /web-docs/images/tutorial-thumb-recipe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/tutorial-thumb-recipe.jpg -------------------------------------------------------------------------------- /web-docs/images/tutorial-thumb-walkthrough.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/images/tutorial-thumb-walkthrough.jpg -------------------------------------------------------------------------------- /web-docs/javascripts/scale.fix.js: -------------------------------------------------------------------------------- 1 | fixScale = function(doc) { 2 | 3 | var addEvent = 'addEventListener', 4 | type = 'gesturestart', 5 | qsa = 'querySelectorAll', 6 | scales = [1, 1], 7 | meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; 8 | 9 | function fix() { 10 | meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; 11 | doc.removeEventListener(type, fix, true); 12 | } 13 | 14 | if ((meta = meta[meta.length - 1]) && addEvent in doc) { 15 | fix(); 16 | scales = [.25, 1.6]; 17 | doc[addEvent](type, fix, true); 18 | } 19 | 20 | }; -------------------------------------------------------------------------------- /web-docs/walkthrough/generate-pdf.sh: -------------------------------------------------------------------------------- 1 | echo Generating PDF... 2 | asciidoctor-pdf -a stylesdir=./styles -a stylesheet=walkthrough.css -D /documents/output index.adoc 3 | 4 | echo Rename output PDF... 5 | mv /documents/output/index.pdf /documents/output/scale-walkthrough.pdf -------------------------------------------------------------------------------- /web-docs/walkthrough/images/create-input-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/create-input-workspace.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/create-job-type-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/create-job-type-search.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/create-output-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/create-output-workspace.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/job-type-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/job-type-configuration.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/job-type-general-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/job-type-general-info.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/output-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/output-file.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/recipe-add-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/recipe-add-input.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/recipe-add-job-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/recipe-add-job-type.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/recipe-file-inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/recipe-file-inputs.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/scale-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/scale-process.png -------------------------------------------------------------------------------- /web-docs/walkthrough/images/strike-add-rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngageoint/scale/1b6a3b879ffe83e10d3b9d9074835a4c3bf476ee/web-docs/walkthrough/images/strike-add-rule.png --------------------------------------------------------------------------------