From aea6e4858d93337ba8de4b437cd58408b10182c6 Mon Sep 17 00:00:00 2001 From: Witek Bedyk Date: Tue, 15 Sep 2020 10:29:46 +0200 Subject: [PATCH] Remove project content This is step 2 of the project retirement process as described in [1]. Project retirement has been anounced here [2]. [1] https://docs.opendev.org/opendev/infra-manual/latest/drivers.html#step-2-remove-project-content [2] http://lists.openstack.org/pipermail/openstack-discuss/2020-August/016830.html Depends-On: https://review.opendev.org/751987 Change-Id: Id4c4f95fee1787e23a3156933c40c491f298128e --- .gitignore | 14 - LICENSE | 175 --- Makefile | 30 - README.md | 110 -- README.rst | 10 + SUMMARY.md | 7 - Vagrantfile | 43 - __init__.py | 0 config/config_template.json | 52 - config/iptables_anomalies.banana | 16 - config/iptables_anomalies.json | 58 - config/logging.json | 23 - config/markov_source_config.banana | 57 - config/markov_source_config.json | 107 -- config/metric_experiments.banana | 30 - config/metric_experiments.json | 60 - config/monasca_aggregate_all_fn.banana | 13 - config/monasca_aggregate_all_fn.json | 64 - config_dsl.py | 54 - devstack/README.md | 71 -- devstack/files/kafka/kafka-server-start.sh | 40 - devstack/files/kafka/kafka.conf | 35 - devstack/files/kafka/kafka.service | 12 - devstack/files/kafka/log4j.properties | 75 -- devstack/files/kafka/server.properties | 119 -- devstack/files/maven/settings.xml | 14 - devstack/files/zookeeper/environment | 36 - devstack/files/zookeeper/log4j.properties | 69 -- devstack/files/zookeeper/myid | 1 - devstack/files/zookeeper/zoo.cfg | 74 -- devstack/plugin.sh | 362 ------ devstack/settings | 59 - doc/banana.md | 141 --- doc/cli.md | 187 --- doc/configuration.md | 123 -- doc/design.md | 106 -- doc/dev_guide.md | 89 -- doc/examples.md | 556 --------- doc/getting_started.md | 68 -- doc/images/alert_fatigue_pipeline.png | Bin 31280 -> 0 bytes .../alert_fatigue_pipeline_with_markov.png | Bin 31404 -> 0 bytes doc/images/architecture.png | Bin 87129 -> 0 bytes doc/images/disk_failure_prediction.png | Bin 117307 -> 0 bytes .../disk_failure_prediction_with_data.png | Bin 123015 -> 0 bytes doc/images/got_tons_of_alarms.png | Bin 123291 -> 0 bytes doc/images/iptables_arch.png | Bin 15140 -> 0 bytes doc/images/iptables_src.png | Bin 21478 -> 0 bytes doc/images/monanas-logo.png | Bin 18016 -> 0 bytes doc/images/save_long_investigation_works.png | Bin 117366 -> 0 bytes doc/images/tags.png | Bin 959693 -> 0 bytes doc/monasca.md | 213 ---- doc/use_cases.md | 20 - fetch-deps.sh | 92 -- monasca_analytics/__init__.py | 0 monasca_analytics/banana/README.md | 40 - monasca_analytics/banana/__init__.py | 0 monasca_analytics/banana/bytecode/__init__.py | 0 .../banana/bytecode/assembler.py | 1030 ----------------- .../banana/bytecode/decorators.py | 104 -- monasca_analytics/banana/bytecode/symbols.py | 51 - monasca_analytics/banana/cli/__init__.py | 0 monasca_analytics/banana/cli/const.py | 27 - monasca_analytics/banana/cli/dsl.py | 367 ------ monasca_analytics/banana/cli/interpreter.py | 275 ----- monasca_analytics/banana/cli/parser.py | 66 -- monasca_analytics/banana/deadpathck/README.md | 22 - .../banana/deadpathck/__init__.py | 0 monasca_analytics/banana/deadpathck/config.py | 118 -- monasca_analytics/banana/deadpathck/dag.py | 56 - monasca_analytics/banana/emitter.py | 94 -- monasca_analytics/banana/eval/README.md | 50 - monasca_analytics/banana/eval/__init__.py | 0 monasca_analytics/banana/eval/config.py | 265 ----- monasca_analytics/banana/eval/ctx.py | 119 -- monasca_analytics/banana/eval/old_style.py | 59 - monasca_analytics/banana/grammar/README.md | 63 - monasca_analytics/banana/grammar/__init__.py | 0 monasca_analytics/banana/grammar/ast.py | 704 ----------- monasca_analytics/banana/grammar/base_ast.py | 169 --- monasca_analytics/banana/grammar/config.py | 285 ----- monasca_analytics/banana/grammar/const.py | 31 - monasca_analytics/banana/pass_manager.py | 117 -- monasca_analytics/banana/typeck/README.md | 85 -- monasca_analytics/banana/typeck/__init__.py | 0 monasca_analytics/banana/typeck/config.py | 285 ----- .../banana/typeck/connections.py | 60 - monasca_analytics/banana/typeck/type_table.py | 215 ---- monasca_analytics/banana/typeck/type_util.py | 626 ---------- monasca_analytics/component/__init__.py | 0 monasca_analytics/component/base.py | 126 -- monasca_analytics/component/params.py | 54 - monasca_analytics/config/__init__.py | 0 monasca_analytics/config/config.py | 63 - monasca_analytics/config/connection.py | 107 -- monasca_analytics/config/const.py | 54 - monasca_analytics/config/creation.py | 82 -- monasca_analytics/config/validation.py | 251 ---- monasca_analytics/exception/__init__.py | 0 monasca_analytics/exception/banana.py | 353 ------ monasca_analytics/exception/dsl.py | 64 - monasca_analytics/exception/ingestor.py | 37 - monasca_analytics/exception/monanas.py | 228 ---- monasca_analytics/ingestor/__init__.py | 0 monasca_analytics/ingestor/base.py | 59 - monasca_analytics/ingestor/cloud.py | 72 -- monasca_analytics/ingestor/iptables.py | 117 -- monasca_analytics/ldp/__init__.py | 0 monasca_analytics/ldp/base.py | 66 -- monasca_analytics/ldp/cloud_causality.py | 90 -- monasca_analytics/ldp/iptables_ldp.py | 96 -- monasca_analytics/ldp/monasca/__init__.py | 0 monasca_analytics/ldp/monasca/base.py | 22 - monasca_analytics/ldp/monasca/helpers.py | 61 - monasca_analytics/ldp/monasca_aggregate.py | 196 ---- monasca_analytics/ldp/monasca_combine.py | 260 ----- monasca_analytics/ldp/monasca_derivative.py | 158 --- monasca_analytics/monanas.py | 194 ---- monasca_analytics/parsing/__init__.py | 0 monasca_analytics/parsing/api.py | 25 - monasca_analytics/parsing/expression.py | 230 ---- monasca_analytics/parsing/private.py | 25 - monasca_analytics/sink/__init__.py | 0 monasca_analytics/sink/base.py | 33 - monasca_analytics/sink/base_sqlite.py | 79 -- monasca_analytics/sink/file.py | 87 -- monasca_analytics/sink/iptables_sqlite.py | 63 - monasca_analytics/sink/kafkas.py | 82 -- .../sink/sink_config_validator.py | 41 - monasca_analytics/sink/stdout_sink.py | 49 - monasca_analytics/sml/__init__.py | 0 monasca_analytics/sml/base.py | 74 -- monasca_analytics/sml/decision_tree.py | 102 -- monasca_analytics/sml/elliptic_envelope.py | 88 -- monasca_analytics/sml/isolation_forest.py | 88 -- monasca_analytics/sml/lingam.py | 156 --- monasca_analytics/sml/logistic_regression.py | 101 -- .../sml/random_forest_classifier.py | 101 -- monasca_analytics/sml/svc.py | 101 -- monasca_analytics/sml/svm_one_class.py | 86 -- monasca_analytics/source/__init__.py | 0 monasca_analytics/source/base.py | 67 -- .../source/cloud_markov_chain.py | 334 ------ .../source/iptables_markov_chain.py | 192 --- monasca_analytics/source/kafka.py | 106 -- .../source/markov_chain/__init__.py | 0 monasca_analytics/source/markov_chain/base.py | 289 ----- .../source/markov_chain/events.py | 98 -- .../source/markov_chain/prob_checks.py | 55 - .../source/markov_chain/state_check.py | 94 -- .../source/markov_chain/transition.py | 91 -- .../source/monasca_markov_chain.py | 143 --- monasca_analytics/source/randoms.py | 403 ------- monasca_analytics/spark/__init__.py | 0 monasca_analytics/spark/aggregator.py | 113 -- monasca_analytics/spark/driver.py | 272 ----- monasca_analytics/spark/streaming_context.py | 107 -- monasca_analytics/util/__init__.py | 0 monasca_analytics/util/common_util.py | 290 ----- monasca_analytics/util/math.py | 38 - monasca_analytics/util/singleton.py | 27 - monasca_analytics/util/spark_func.py | 21 - monasca_analytics/util/string_util.py | 125 -- monasca_analytics/util/timestamp.py | 30 - monasca_analytics/util/validation_utils.py | 89 -- monasca_analytics/voter/__init__.py | 0 monasca_analytics/voter/base.py | 94 -- monasca_analytics/voter/pick_index.py | 66 -- monasca_analytics/web_service/__init__.py | 0 .../web_service/request_handler.py | 168 --- monasca_analytics/web_service/web_service.py | 50 - .../web_service/web_service_model.py | 41 - .../notes/drop-py-2-7-e99c2ab58c9d978a.yaml | 6 - requirements.txt | 7 - run.py | 136 --- setup.cfg | 41 - setup.py | 26 - setup_property.py | 19 - test-requirements.txt | 6 - test/__init__.py | 0 test/aggregator/__init__.py | 0 test/banana/__init__.py | 0 test/banana/deadpathck/__init__.py | 0 .../test_at_least_one_sink_or_source.py | 95 -- test/banana/deadpathck/test_deadpathck.py | 111 -- test/banana/eval/__init__.py | 0 .../cloud_markov_chain_source.banana | 3 - .../eval_each_stmt/calc_expressions.banana | 8 - .../eval_each_stmt/json_expressions.banana | 4 - test/banana/eval/test_eval_config.py | 77 -- test/banana/grammar/__init__.py | 0 .../component_cant_be_in_object.banana | 2 - .../json_obj_props_cant_shadow.banana | 4 - .../wrong_symbol_in_connection.banana | 3 - .../should_fail/wrong_symbol_in_expr.banana | 2 - .../should_pass/component_creation.banana | 12 - .../grammar/should_pass/connection.banana | 13 - .../grammar/should_pass/dot_accesses.banana | 10 - .../grammar/should_pass/eval_json_obj.banana | 6 - .../should_pass/eval_simple_expression.banana | 8 - .../grammar/should_pass/full_example.banana | 14 - .../grammar/should_pass/json_obj.banana | 8 - .../should_pass/jsonlike_objects.banana | 6 - .../grammar/should_pass/scary_json_ops.banana | 4 - .../should_pass/valid_expression.banana | 5 - .../various_literal_assignments.banana | 5 - test/banana/grammar/test_config.py | 126 -- test/banana/test_api.py | 71 -- test/banana/test_config_examples.py | 104 -- test/banana/typeck/__init__.py | 0 .../comp_var_cant_be_shadowed.banana | 3 - .../component_cant_be_in_object.banana | 4 - .../component_unkown_param_in_arg.banana | 2 - .../component_unkown_param_in_stmt.banana | 9 - .../should_fail/impossible_connection.banana | 5 - .../incompatible_json_props_types.banana | 8 - .../should_fail/invalid_str_concat.banana | 14 - .../type_has_no_nested_properties.banana | 9 - .../should_fail/type_is_not_a_subtype.banana | 18 - .../should_fail/wrong_param_type.banana | 7 - .../wrong_parameter_name_throw.banana | 9 - .../compatible_json_props_types.banana | 3 - .../component_param_has_a_type.banana | 3 - .../should_pass/expression_shenanigan.banana | 19 - .../typeck/should_pass/monasca_combine.banana | 22 - .../nested_value_in_component_params.banana | 9 - .../number_can_be_shadowed_by_object.banana | 4 - .../object_can_be_shadowed_by_number.banana | 4 - .../should_pass/simple_connection.banana | 7 - .../typeck/should_pass/simple_literal.banana | 4 - .../should_pass/type_is_a_subtype.banana | 20 - .../should_pass/valid_str_concat.banana | 4 - .../various_object_use_case.banana | 7 - test/banana/typeck/test_typeck_config.py | 155 --- test/cli/__init__.py | 0 test/cli/test_dsl.py | 265 ----- test/cli/test_interpreter.py | 182 --- test/cli/test_parser.py | 156 --- test/config/__init__.py | 0 test/config/test_create_components.py | 122 -- test/ingestor/__init__.py | 0 test/ingestor/test_base.py | 45 - test/ingestor/test_cloud.py | 44 - test/ingestor/test_iptables_ingestor.py | 77 -- test/ldp/__init__.py | 0 test/ldp/test_cloud_causality.py | 32 - test/ldp/test_iptables_ldp.py | 80 -- test/ldp/test_monasca_aggregator.py | 112 -- test/ldp/test_monasca_combine.py | 32 - test/ldp/test_monasca_derivative.py | 68 -- test/mocks/__init__.py | 0 test/mocks/classifier_mock.py | 32 - test/mocks/ingestors.py | 58 - test/mocks/markov.py | 31 - test/mocks/sml_mocks.py | 337 ------ test/mocks/sources.py | 52 - test/mocks/spark_mocks.py | 126 -- test/resources/dsl_code.txt | 15 - test/resources/logging.json | 23 - test/resources/test_json.json | 71 -- test/sink/__init__.py | 0 test/sink/test_base_sqlite.py | 159 --- test/sink/test_iptables_sqlite.py | 60 - test/sink/test_kafka.py | 58 - test/sink/test_sink_config_validator.py | 65 -- test/sml/__init__.py | 0 test/sml/test_decision_tree.py | 58 - test/sml/test_elliptic_envelope.py | 54 - test/sml/test_isolation_forest.py | 54 - test/sml/test_lingam.py | 86 -- test/sml/test_logistic_regression.py | 58 - test/sml/test_random_forest_classifier.py | 58 - test/sml/test_svc.py | 58 - test/sml/test_svm_one_class.py | 56 - test/source/__init__.py | 0 test/source/markov_chain/__init__.py | 0 test/source/markov_chain/test_base.py | 100 -- test/source/markov_chain/test_events.py | 64 - test/source/markov_chain/test_transition.py | 146 --- test/source/test_base.py | 36 - test/source/test_iptables_markov_chain.py | 120 -- test/source/test_kafka.py | 102 -- test/source/test_markov_chain.py | 137 --- test/source/test_random.py | 32 - test/spark/__init__.py | 0 test/spark/test_aggregator.py | 55 - test/spark/test_driver.py | 197 ---- test/test_monanas.py | 124 -- test/test_run.py | 89 -- test/util/__init__.py | 0 test/util/inheritance.py | 39 - test/util/test_common_util.py | 141 --- test/util/test_config_model.py | 172 --- test/util/test_math.py | 37 - test/util_for_testing.py | 50 - test/voter/__init__.py | 0 test/voter/test_base_voter.py | 53 - test/voter/test_pick_index.py | 32 - tools/test-setup.sh | 15 - tox.ini | 51 - 299 files changed, 10 insertions(+), 22549 deletions(-) delete mode 100644 .gitignore delete mode 100644 LICENSE delete mode 100644 Makefile delete mode 100644 README.md create mode 100644 README.rst delete mode 100644 SUMMARY.md delete mode 100644 Vagrantfile delete mode 100644 __init__.py delete mode 100644 config/config_template.json delete mode 100644 config/iptables_anomalies.banana delete mode 100644 config/iptables_anomalies.json delete mode 100644 config/logging.json delete mode 100644 config/markov_source_config.banana delete mode 100644 config/markov_source_config.json delete mode 100644 config/metric_experiments.banana delete mode 100644 config/metric_experiments.json delete mode 100644 config/monasca_aggregate_all_fn.banana delete mode 100644 config/monasca_aggregate_all_fn.json delete mode 100644 config_dsl.py delete mode 100644 devstack/README.md delete mode 100644 devstack/files/kafka/kafka-server-start.sh delete mode 100644 devstack/files/kafka/kafka.conf delete mode 100644 devstack/files/kafka/kafka.service delete mode 100644 devstack/files/kafka/log4j.properties delete mode 100644 devstack/files/kafka/server.properties delete mode 100644 devstack/files/maven/settings.xml delete mode 100644 devstack/files/zookeeper/environment delete mode 100644 devstack/files/zookeeper/log4j.properties delete mode 100644 devstack/files/zookeeper/myid delete mode 100644 devstack/files/zookeeper/zoo.cfg delete mode 100755 devstack/plugin.sh delete mode 100644 devstack/settings delete mode 100644 doc/banana.md delete mode 100644 doc/cli.md delete mode 100644 doc/configuration.md delete mode 100644 doc/design.md delete mode 100644 doc/dev_guide.md delete mode 100644 doc/examples.md delete mode 100644 doc/getting_started.md delete mode 100644 doc/images/alert_fatigue_pipeline.png delete mode 100644 doc/images/alert_fatigue_pipeline_with_markov.png delete mode 100644 doc/images/architecture.png delete mode 100644 doc/images/disk_failure_prediction.png delete mode 100644 doc/images/disk_failure_prediction_with_data.png delete mode 100644 doc/images/got_tons_of_alarms.png delete mode 100755 doc/images/iptables_arch.png delete mode 100755 doc/images/iptables_src.png delete mode 100644 doc/images/monanas-logo.png delete mode 100644 doc/images/save_long_investigation_works.png delete mode 100644 doc/images/tags.png delete mode 100644 doc/monasca.md delete mode 100644 doc/use_cases.md delete mode 100644 fetch-deps.sh delete mode 100644 monasca_analytics/__init__.py delete mode 100644 monasca_analytics/banana/README.md delete mode 100644 monasca_analytics/banana/__init__.py delete mode 100644 monasca_analytics/banana/bytecode/__init__.py delete mode 100644 monasca_analytics/banana/bytecode/assembler.py delete mode 100644 monasca_analytics/banana/bytecode/decorators.py delete mode 100644 monasca_analytics/banana/bytecode/symbols.py delete mode 100644 monasca_analytics/banana/cli/__init__.py delete mode 100644 monasca_analytics/banana/cli/const.py delete mode 100644 monasca_analytics/banana/cli/dsl.py delete mode 100644 monasca_analytics/banana/cli/interpreter.py delete mode 100644 monasca_analytics/banana/cli/parser.py delete mode 100644 monasca_analytics/banana/deadpathck/README.md delete mode 100644 monasca_analytics/banana/deadpathck/__init__.py delete mode 100644 monasca_analytics/banana/deadpathck/config.py delete mode 100644 monasca_analytics/banana/deadpathck/dag.py delete mode 100644 monasca_analytics/banana/emitter.py delete mode 100644 monasca_analytics/banana/eval/README.md delete mode 100644 monasca_analytics/banana/eval/__init__.py delete mode 100644 monasca_analytics/banana/eval/config.py delete mode 100644 monasca_analytics/banana/eval/ctx.py delete mode 100644 monasca_analytics/banana/eval/old_style.py delete mode 100644 monasca_analytics/banana/grammar/README.md delete mode 100644 monasca_analytics/banana/grammar/__init__.py delete mode 100644 monasca_analytics/banana/grammar/ast.py delete mode 100644 monasca_analytics/banana/grammar/base_ast.py delete mode 100644 monasca_analytics/banana/grammar/config.py delete mode 100644 monasca_analytics/banana/grammar/const.py delete mode 100644 monasca_analytics/banana/pass_manager.py delete mode 100644 monasca_analytics/banana/typeck/README.md delete mode 100644 monasca_analytics/banana/typeck/__init__.py delete mode 100644 monasca_analytics/banana/typeck/config.py delete mode 100644 monasca_analytics/banana/typeck/connections.py delete mode 100644 monasca_analytics/banana/typeck/type_table.py delete mode 100644 monasca_analytics/banana/typeck/type_util.py delete mode 100644 monasca_analytics/component/__init__.py delete mode 100644 monasca_analytics/component/base.py delete mode 100644 monasca_analytics/component/params.py delete mode 100644 monasca_analytics/config/__init__.py delete mode 100644 monasca_analytics/config/config.py delete mode 100644 monasca_analytics/config/connection.py delete mode 100644 monasca_analytics/config/const.py delete mode 100644 monasca_analytics/config/creation.py delete mode 100644 monasca_analytics/config/validation.py delete mode 100644 monasca_analytics/exception/__init__.py delete mode 100644 monasca_analytics/exception/banana.py delete mode 100644 monasca_analytics/exception/dsl.py delete mode 100644 monasca_analytics/exception/ingestor.py delete mode 100644 monasca_analytics/exception/monanas.py delete mode 100644 monasca_analytics/ingestor/__init__.py delete mode 100644 monasca_analytics/ingestor/base.py delete mode 100644 monasca_analytics/ingestor/cloud.py delete mode 100644 monasca_analytics/ingestor/iptables.py delete mode 100644 monasca_analytics/ldp/__init__.py delete mode 100644 monasca_analytics/ldp/base.py delete mode 100644 monasca_analytics/ldp/cloud_causality.py delete mode 100644 monasca_analytics/ldp/iptables_ldp.py delete mode 100644 monasca_analytics/ldp/monasca/__init__.py delete mode 100644 monasca_analytics/ldp/monasca/base.py delete mode 100644 monasca_analytics/ldp/monasca/helpers.py delete mode 100644 monasca_analytics/ldp/monasca_aggregate.py delete mode 100644 monasca_analytics/ldp/monasca_combine.py delete mode 100644 monasca_analytics/ldp/monasca_derivative.py delete mode 100644 monasca_analytics/monanas.py delete mode 100644 monasca_analytics/parsing/__init__.py delete mode 100644 monasca_analytics/parsing/api.py delete mode 100644 monasca_analytics/parsing/expression.py delete mode 100644 monasca_analytics/parsing/private.py delete mode 100644 monasca_analytics/sink/__init__.py delete mode 100644 monasca_analytics/sink/base.py delete mode 100644 monasca_analytics/sink/base_sqlite.py delete mode 100644 monasca_analytics/sink/file.py delete mode 100644 monasca_analytics/sink/iptables_sqlite.py delete mode 100644 monasca_analytics/sink/kafkas.py delete mode 100644 monasca_analytics/sink/sink_config_validator.py delete mode 100644 monasca_analytics/sink/stdout_sink.py delete mode 100644 monasca_analytics/sml/__init__.py delete mode 100644 monasca_analytics/sml/base.py delete mode 100644 monasca_analytics/sml/decision_tree.py delete mode 100644 monasca_analytics/sml/elliptic_envelope.py delete mode 100644 monasca_analytics/sml/isolation_forest.py delete mode 100644 monasca_analytics/sml/lingam.py delete mode 100644 monasca_analytics/sml/logistic_regression.py delete mode 100644 monasca_analytics/sml/random_forest_classifier.py delete mode 100644 monasca_analytics/sml/svc.py delete mode 100644 monasca_analytics/sml/svm_one_class.py delete mode 100644 monasca_analytics/source/__init__.py delete mode 100644 monasca_analytics/source/base.py delete mode 100644 monasca_analytics/source/cloud_markov_chain.py delete mode 100644 monasca_analytics/source/iptables_markov_chain.py delete mode 100644 monasca_analytics/source/kafka.py delete mode 100644 monasca_analytics/source/markov_chain/__init__.py delete mode 100644 monasca_analytics/source/markov_chain/base.py delete mode 100644 monasca_analytics/source/markov_chain/events.py delete mode 100644 monasca_analytics/source/markov_chain/prob_checks.py delete mode 100644 monasca_analytics/source/markov_chain/state_check.py delete mode 100644 monasca_analytics/source/markov_chain/transition.py delete mode 100644 monasca_analytics/source/monasca_markov_chain.py delete mode 100644 monasca_analytics/source/randoms.py delete mode 100644 monasca_analytics/spark/__init__.py delete mode 100644 monasca_analytics/spark/aggregator.py delete mode 100644 monasca_analytics/spark/driver.py delete mode 100644 monasca_analytics/spark/streaming_context.py delete mode 100644 monasca_analytics/util/__init__.py delete mode 100644 monasca_analytics/util/common_util.py delete mode 100644 monasca_analytics/util/math.py delete mode 100644 monasca_analytics/util/singleton.py delete mode 100644 monasca_analytics/util/spark_func.py delete mode 100644 monasca_analytics/util/string_util.py delete mode 100644 monasca_analytics/util/timestamp.py delete mode 100644 monasca_analytics/util/validation_utils.py delete mode 100644 monasca_analytics/voter/__init__.py delete mode 100644 monasca_analytics/voter/base.py delete mode 100644 monasca_analytics/voter/pick_index.py delete mode 100644 monasca_analytics/web_service/__init__.py delete mode 100644 monasca_analytics/web_service/request_handler.py delete mode 100644 monasca_analytics/web_service/web_service.py delete mode 100644 monasca_analytics/web_service/web_service_model.py delete mode 100644 releasenotes/notes/drop-py-2-7-e99c2ab58c9d978a.yaml delete mode 100644 requirements.txt delete mode 100644 run.py delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 setup_property.py delete mode 100644 test-requirements.txt delete mode 100644 test/__init__.py delete mode 100644 test/aggregator/__init__.py delete mode 100644 test/banana/__init__.py delete mode 100644 test/banana/deadpathck/__init__.py delete mode 100644 test/banana/deadpathck/test_at_least_one_sink_or_source.py delete mode 100644 test/banana/deadpathck/test_deadpathck.py delete mode 100644 test/banana/eval/__init__.py delete mode 100644 test/banana/eval/should_pass/eval_components_only/cloud_markov_chain_source.banana delete mode 100644 test/banana/eval/should_pass/eval_each_stmt/calc_expressions.banana delete mode 100644 test/banana/eval/should_pass/eval_each_stmt/json_expressions.banana delete mode 100644 test/banana/eval/test_eval_config.py delete mode 100644 test/banana/grammar/__init__.py delete mode 100644 test/banana/grammar/should_fail/component_cant_be_in_object.banana delete mode 100644 test/banana/grammar/should_fail/json_obj_props_cant_shadow.banana delete mode 100644 test/banana/grammar/should_fail/wrong_symbol_in_connection.banana delete mode 100644 test/banana/grammar/should_fail/wrong_symbol_in_expr.banana delete mode 100644 test/banana/grammar/should_pass/component_creation.banana delete mode 100644 test/banana/grammar/should_pass/connection.banana delete mode 100644 test/banana/grammar/should_pass/dot_accesses.banana delete mode 100644 test/banana/grammar/should_pass/eval_json_obj.banana delete mode 100644 test/banana/grammar/should_pass/eval_simple_expression.banana delete mode 100644 test/banana/grammar/should_pass/full_example.banana delete mode 100644 test/banana/grammar/should_pass/json_obj.banana delete mode 100644 test/banana/grammar/should_pass/jsonlike_objects.banana delete mode 100644 test/banana/grammar/should_pass/scary_json_ops.banana delete mode 100644 test/banana/grammar/should_pass/valid_expression.banana delete mode 100644 test/banana/grammar/should_pass/various_literal_assignments.banana delete mode 100644 test/banana/grammar/test_config.py delete mode 100644 test/banana/test_api.py delete mode 100644 test/banana/test_config_examples.py delete mode 100644 test/banana/typeck/__init__.py delete mode 100644 test/banana/typeck/should_fail/comp_var_cant_be_shadowed.banana delete mode 100644 test/banana/typeck/should_fail/component_cant_be_in_object.banana delete mode 100644 test/banana/typeck/should_fail/component_unkown_param_in_arg.banana delete mode 100644 test/banana/typeck/should_fail/component_unkown_param_in_stmt.banana delete mode 100644 test/banana/typeck/should_fail/impossible_connection.banana delete mode 100644 test/banana/typeck/should_fail/incompatible_json_props_types.banana delete mode 100644 test/banana/typeck/should_fail/invalid_str_concat.banana delete mode 100644 test/banana/typeck/should_fail/type_has_no_nested_properties.banana delete mode 100644 test/banana/typeck/should_fail/type_is_not_a_subtype.banana delete mode 100644 test/banana/typeck/should_fail/wrong_param_type.banana delete mode 100644 test/banana/typeck/should_fail/wrong_parameter_name_throw.banana delete mode 100644 test/banana/typeck/should_pass/compatible_json_props_types.banana delete mode 100644 test/banana/typeck/should_pass/component_param_has_a_type.banana delete mode 100644 test/banana/typeck/should_pass/expression_shenanigan.banana delete mode 100644 test/banana/typeck/should_pass/monasca_combine.banana delete mode 100644 test/banana/typeck/should_pass/nested_value_in_component_params.banana delete mode 100644 test/banana/typeck/should_pass/number_can_be_shadowed_by_object.banana delete mode 100644 test/banana/typeck/should_pass/object_can_be_shadowed_by_number.banana delete mode 100644 test/banana/typeck/should_pass/simple_connection.banana delete mode 100644 test/banana/typeck/should_pass/simple_literal.banana delete mode 100644 test/banana/typeck/should_pass/type_is_a_subtype.banana delete mode 100644 test/banana/typeck/should_pass/valid_str_concat.banana delete mode 100644 test/banana/typeck/should_pass/various_object_use_case.banana delete mode 100644 test/banana/typeck/test_typeck_config.py delete mode 100644 test/cli/__init__.py delete mode 100644 test/cli/test_dsl.py delete mode 100644 test/cli/test_interpreter.py delete mode 100644 test/cli/test_parser.py delete mode 100644 test/config/__init__.py delete mode 100644 test/config/test_create_components.py delete mode 100644 test/ingestor/__init__.py delete mode 100644 test/ingestor/test_base.py delete mode 100644 test/ingestor/test_cloud.py delete mode 100644 test/ingestor/test_iptables_ingestor.py delete mode 100644 test/ldp/__init__.py delete mode 100644 test/ldp/test_cloud_causality.py delete mode 100644 test/ldp/test_iptables_ldp.py delete mode 100644 test/ldp/test_monasca_aggregator.py delete mode 100644 test/ldp/test_monasca_combine.py delete mode 100644 test/ldp/test_monasca_derivative.py delete mode 100644 test/mocks/__init__.py delete mode 100644 test/mocks/classifier_mock.py delete mode 100644 test/mocks/ingestors.py delete mode 100644 test/mocks/markov.py delete mode 100644 test/mocks/sml_mocks.py delete mode 100644 test/mocks/sources.py delete mode 100644 test/mocks/spark_mocks.py delete mode 100644 test/resources/dsl_code.txt delete mode 100644 test/resources/logging.json delete mode 100644 test/resources/test_json.json delete mode 100644 test/sink/__init__.py delete mode 100644 test/sink/test_base_sqlite.py delete mode 100644 test/sink/test_iptables_sqlite.py delete mode 100644 test/sink/test_kafka.py delete mode 100644 test/sink/test_sink_config_validator.py delete mode 100644 test/sml/__init__.py delete mode 100644 test/sml/test_decision_tree.py delete mode 100644 test/sml/test_elliptic_envelope.py delete mode 100644 test/sml/test_isolation_forest.py delete mode 100644 test/sml/test_lingam.py delete mode 100644 test/sml/test_logistic_regression.py delete mode 100644 test/sml/test_random_forest_classifier.py delete mode 100644 test/sml/test_svc.py delete mode 100644 test/sml/test_svm_one_class.py delete mode 100644 test/source/__init__.py delete mode 100644 test/source/markov_chain/__init__.py delete mode 100644 test/source/markov_chain/test_base.py delete mode 100644 test/source/markov_chain/test_events.py delete mode 100644 test/source/markov_chain/test_transition.py delete mode 100644 test/source/test_base.py delete mode 100644 test/source/test_iptables_markov_chain.py delete mode 100644 test/source/test_kafka.py delete mode 100644 test/source/test_markov_chain.py delete mode 100644 test/source/test_random.py delete mode 100644 test/spark/__init__.py delete mode 100644 test/spark/test_aggregator.py delete mode 100644 test/spark/test_driver.py delete mode 100644 test/test_monanas.py delete mode 100644 test/test_run.py delete mode 100644 test/util/__init__.py delete mode 100644 test/util/inheritance.py delete mode 100644 test/util/test_common_util.py delete mode 100644 test/util/test_config_model.py delete mode 100644 test/util/test_math.py delete mode 100644 test/util_for_testing.py delete mode 100644 test/voter/__init__.py delete mode 100644 test/voter/test_base_voter.py delete mode 100644 test/voter/test_pick_index.py delete mode 100755 tools/test-setup.sh delete mode 100644 tox.ini diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7cb168c..0000000 --- a/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*~ -*.egg-info -*.swp -*.log -*.pyc -*.pyo -.eggs -.project -.pydevproject -.vagrant -.idea -.tox -.coverage -cover diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 67db858..0000000 --- a/LICENSE +++ /dev/null @@ -1,175 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/Makefile b/Makefile deleted file mode 100644 index abeca03..0000000 --- a/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -ifeq (testspec,$(firstword $(MAKECMDGOALS))) - # use the rest as arguments for "run" - TEST_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) - # ...and turn them into do-nothing targets - $(eval $(TEST_ARGS):;@:) -endif - -MONANAS_SRC=monasca_analytics -PYTHON=python - -all: test style - -test: - $(PYTHON) -m unittest discover -v - -testspec: - $(PYTHON) -m unittest -v $(TEST_ARGS) - -clean: - find $(MONANAS_SRC) -type f -name '*.pyc' -exec rm {} + - -style: - find $(MONANAS_SRC) -type f -name '*.py' -exec pep8 --max-line-length 79 {} + - -start: - bash -c "sleep 7; curl -H \"Content-Type: application/json\" -d '{\"action\": \"start_streaming\"}' http://localhost:3000/" & - $(PYTHON) run.py -p ~/spark/spark-1.6.1 -c ./config/metric_experiments.json -l ./config/logging.json - - -.PHONY: all test clean style testspec diff --git a/README.md b/README.md deleted file mode 100644 index 802da43..0000000 --- a/README.md +++ /dev/null @@ -1,110 +0,0 @@ -Team and repository tags -======================== - -[![Team and repository tags](https://governance.openstack.org/tc/badges/monasca-analytics.svg)](https://governance.openstack.org/tc/reference/tags/index.html) - - - -# MoNanas - Monasca Analytics Framework - -![MoNanas Logo](doc/images/monanas-logo.png) - -## Overview - -Monasca Analytics (MoNanas) is a statistical/machine-learning -([SML](doc/design.md#sml)) [flow](doc/design.md#flow) composition -engine. Users can compose a sequence of algorithms to be executed by just -providing a description as an input to MoNanas. The data flow is automatically -handled by the framework. - -Easy [flow](doc/design.md#flow) composition and reusability means that -we can speed up the extraction of actionable infrastructure insight. - -### Advantages -:thumbsup: Decouple algorithm design from execution. - -:thumbsup: Reusable specification of the desired [flow](doc/design.md#flow). - -:thumbsup: Language independent [flow](doc/design.md#flow) definition. - -:thumbsup: Data source and format independent. - -:thumbsup: Easy to add new [SML](doc/design.md#sml) algorithms and # combine them with pre-existing ones in the [flow](doc/design.md#flow). - -:thumbsup: Transparently exploit data parallelism. - -### Documentation -* [MoNanas/GettingStarted](doc/getting_started.md): A starting point for users -and developers of MoNanas. - -### Repositories -Core: https://github.com/openstack/monasca-analytics.git - -## Example Use Cases - -### Integrate with Monasca -See: [MoNanas/IntegrateMonasca](doc/monasca.md) for more details integration with Monasca - -### Relevant to OpenStack -See: [MoNanas/UseCases](doc/use_cases.md) for more details use cases that are relevant to OpenStack. - -## MoNanas Design -See: [MoNanas/Design](doc/design.md) for details on MoNanas's architecture, -its functional requirements and core concepts. - -## Technologies -MoNanas uses a number of third-party technologies: -* Apache Spark (https://spark.apache.org/): Apache Spark is a fast and general -engine for large-scale data processing. -* Apache Kafka (https://kafka.apache.org/): Used by Monasca and MoNanas's Kafka -`source` and `sink`. -* Apache ZooKeeper (https://zookeeper.apache.org/): Used by Kafka. - -## Feature Release Schedule -- [x] Basic SML flow. -- [x] New algorithm "add-on" ability. -- [x] Example datasets and SML flows. -- [ ] Support end-to-end learning + data processing flows (currently, the latter part does not get updated due to Spark's immutability.) -- [ ] Refactor codes to be consistent with terms used in the documentation. -- [ ] Add a source, ingestor and transformer for Monasca. -- [ ] Model connections as objects rather than references and have driver specifics in one place. -- [ ] Expanded orchestration abilities/expressiveness. -- [ ] Container-enabled testing/deployment for non-production environments. -- [ ] Add Vitrage Sink. -- [ ] Add a ready-to-use virtual machine image (get rid of the fetch-deps.sh). - -## Contributing -There are multiple ways to contribute to the project. All are equally important -to us! -* You can have a look at the -[Monasca launchpad](https://launchpad.net/monasca) for problems that -needs to be solved (bugs/issues), and blueprints. -* You can also help us to add -[new learning algorithms](doc/dev_guide.md#add_new_algorithms). -* Finally, we are very interested in having more data sources to experiment -with. The source can either be from an existing data provider or randomly -generated. The more, the better! :) If you are interested to work on that -aspect, [you are welcome as well](doc/dev_guide.md#add_new_sources). - -For more information on setting up your development environment, see -[MoNanas/DevGuide](doc/dev_guide.md). - -For more information about Monanas, please visit the wiki page: -[Monanas wiki](https://wiki.openstack.org/wiki/Monasca/Analytics). - -And for more information about Monasca, please visit the wiki page: -[Monasca wiki](https://wiki.openstack.org/wiki/Monasca). - -## License -Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -Licensed under the Apache License, Version 2.0 (the "License"); you may not -used this file except in compliance with the License. You may obtain a copy of -the License at: -``` -http://www.apache.org/licenses/LICENSE-2.0 -``` -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations under -the License. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..46d1993 --- /dev/null +++ b/README.rst @@ -0,0 +1,10 @@ +This project is no longer maintained. + +The contents of this repository are still available in the Git +source code management system. To see the contents of this +repository before it reached its end of life, please check out the +previous commit with "git checkout HEAD^1". + +For any further questions, please email +openstack-discuss@lists.openstack.org or join #openstack-monasca on +Freenode. \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 60337c3..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,7 +0,0 @@ -# Summary - -* [MoNanas](README.md) - * [Design](doc/design.md) - * [Getting Started](doc/getting_started.md) -* [Developer Guide](doc/dev_guide.md) -* [Examples](doc/examples.md) diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index ad63651..0000000 --- a/Vagrantfile +++ /dev/null @@ -1,43 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# All Vagrant configuration is done below. The "2" in Vagrant.configure -# configures the configuration version (we support older styles for -# backwards compatibility). Please don't change it unless you know what -# you're doing. -Vagrant.configure(2) do |config| - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. - - # Default box - config.vm.box = "ubuntu/trusty64" - - # Setup port for Machine Learning Framework - config.vm.network "forwarded_port", guest: 3000, host: 3000 - config.vm.network "forwarded_port", guest: 4040, host: 4040 - - # Shell provisioning - config.vm.provision "shell", - inline: "echo 'export VAGRANT_ENV=1' >> /home/vagrant/.profile" - - config.vm.provision "shell" do |s| - # s.env is only available since Vagrant 1.8 - s.path = "fetch-deps.sh" - s.privileged = false - end - - # Virtual box settings - config.vm.provider "virtualbox" do |v| - v.memory = 4096 - v.cpus = 3 - end - - # Proxy settings - if Vagrant.has_plugin?("vagrant-proxyconf") - config.proxy.http = ENV['HTTP_PROXY'] || ENV['http_proxy'] - config.proxy.https = ENV['HTTPS_PROXY'] || ENV['https_proxy'] - config.proxy.no_proxy = "localhost,127.0.0.1" - end - -end diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/config/config_template.json b/config/config_template.json deleted file mode 100644 index 6f9da55..0000000 --- a/config/config_template.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "id": "my_id", - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "my_src_module" - } - }, - "ingestors": { - "ing1": { - "module": "my_ingestor_module" - } - }, - "smls": { - "sml1": { - "module": "my_sml_module" - } - }, - "voters": { - "vot1": { - "module": "my_voter_module" - } - }, - "sinks": { - "snk1": { - "module": "my_sink_module" - } - }, - "ldps": { - "ldp1": { - "module": "my_ldp_module" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "sml1": ["vot1"], - "ing1": [], - "vot1": ["ldp1"], - "ldp1": ["snk1"], - "snk1": [] - }, - "feedback": {} -} diff --git a/config/iptables_anomalies.banana b/config/iptables_anomalies.banana deleted file mode 100644 index 1677f5f..0000000 --- a/config/iptables_anomalies.banana +++ /dev/null @@ -1,16 +0,0 @@ -############################## -# IP Tables anomalies -# - -sleep = 0.01 -src = IPTablesSource(sleep=sleep) -ing1 = IptablesIngestor() -svm = SvmOneClass() -voter = PickIndexVoter(0) -ldp1 = IptablesLDP() -stdout = StdoutSink() -sqlite = IptablesSQLiteSink() - -src -> [ing1, ldp1] -ing1 -> svm -> voter -> ldp1 -ldp1 -> [sqlite, stdout] diff --git a/config/iptables_anomalies.json b/config/iptables_anomalies.json deleted file mode 100644 index 5170fdd..0000000 --- a/config/iptables_anomalies.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "IPTablesSource", - "sleep": 0.01 - } - }, - "ingestors": { - "ing1": { - "module": "IptablesIngestor" - } - }, - "smls": { - "sml1": { - "module": "SvmOneClass", - "nb_samples": 500 - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "index": 0 - } - }, - "sinks": { - "snk1": { - "module": "IptablesSQLiteSink" - }, - "snk2": { - "module": "StdoutSink" - } - }, - "ldps": { - "ldp1": { - "module": "IptablesLDP" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "ing1": [], - "sml1": ["vot1"], - "vot1": ["ldp1"], - "ldp1": ["snk1", "snk2"], - "snk1": [], - "snk2": [] - }, - "feedback": {} -} diff --git a/config/logging.json b/config/logging.json deleted file mode 100644 index 47ccb3c..0000000 --- a/config/logging.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": 1, - "disable_existing_loggers": false, - "formatters": { - "standard": { - "format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s" - } - }, - "handlers": { - "default": { - "level": "INFO", - "class": "logging.StreamHandler", - "formatter": "standard" - } - }, - "loggers": { - "": { - "handlers": ["default"], - "level": "INFO", - "propagate": true - } - } -} diff --git a/config/markov_source_config.banana b/config/markov_source_config.banana deleted file mode 100644 index 2c1ec98..0000000 --- a/config/markov_source_config.banana +++ /dev/null @@ -1,57 +0,0 @@ -############################## -# Markov source config example -# (cloud-like data model) -# - -src = CloudMarkovChainSource(sleep=0.01, min_event_per_burst=500) - -src.transitions.web_service = { - "run=>slow": { - "0": 0.001, - "8": 0.02, - "12": 0.07, - "14": 0.07, - "22": 0.03, - "24": 0.00 - }, - "slow=>run": { - "0": 0.99, - "8": 0.7, - "12": 0.1, - "14": 0.1, - "22": 0.8, - "24": 0.9 - }, - "stop=>run": 0.7 -} - -src.transitions.host = { - "on=>off": 0.005, - "off=>on": 0.5 -} - -src.transitions.switch = { - "on=>off": 0.01, - "off=>on": 0.7 -} - -src.triggers.support = { - "get_called" : { - "0": 0.1, - "8": 0.2, - "12": 0.8, - "14": 0.8, - "22": 0.5, - "24": 0.0 - } -} - -ing1 = CloudIngestor() -ling = LiNGAM(threshold=0.5) -voter = PickIndexVoter(0) -sink = KafkaSink(host="localhost", port=9092, topic="transformed_alerts") -ldp = CloudCausalityLDP() - -# Connections -src -> [ing1 -> ling, ldp] -ling -> voter -> ldp -> sink diff --git a/config/markov_source_config.json b/config/markov_source_config.json deleted file mode 100644 index 8e64fa3..0000000 --- a/config/markov_source_config.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "CloudMarkovChainSource", - "sleep": 0.01, - "min_event_per_burst": 500, - "transitions": { - "web_service": { - "run=>slow": { - "0": 0.001, - "8": 0.02, - "12": 0.07, - "14": 0.07, - "22": 0.03, - "24": 0.001 - }, - "slow=>run": { - "0": 0.99, - "8": 0.7, - "12": 0.1, - "14": 0.1, - "22": 0.8, - "24": 0.99 - }, - "stop=>run": 0.7 - }, - "host": { - "on=>off": 0.005, - "off=>on": 0.5 - }, - "switch": { - "on=>off": 0.01, - "off=>on": 0.7 - } - }, - "triggers": { - "support": { - "get_called": { - "0": 0.1, - "8": 0.2, - "12": 0.8, - "14": 0.8, - "22": 0.5, - "24": 0.0 - } - } - }, - "graph": { - "h1:host": ["s1"], - "h2:host": ["s1"], - "s1:switch": [], - "w1:web_service": ["h1"], - "w2:web_service": ["h2"] - } - - } - }, - "ingestors": { - "ing1": { - "module": "CloudIngestor" - } - }, - "smls": { - "sml1": { - "module": "LiNGAM", - "threshold": 0.5 - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "index": 0 - } - }, - "sinks": { - "snk1": { - "module": "KafkaSink", - "host": "localhost", - "port": 9092, - "topic": "transformed_alerts" - } - }, - "ldps": { - "ldp1": { - "module": "CloudCausalityLDP" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "sml1": ["vot1"], - "ing1": [], - "vot1": ["ldp1"], - "ldp1": ["snk1"], - "snk1": [] - }, - "feedback": {} -} \ No newline at end of file diff --git a/config/metric_experiments.banana b/config/metric_experiments.banana deleted file mode 100644 index fa34e9c..0000000 --- a/config/metric_experiments.banana +++ /dev/null @@ -1,30 +0,0 @@ -####################### -# Metric experiments -# - -# Sources -src = MonascaMarkovChainSource(sleep=0.01) - -# Sinks -stdout = StdoutSink() -file = FileSink(path="~/monasca-aggregate.log") - -# Live data processors -period = 0.1 * 2 -aggregator = MonascaAggregateLDP(func="cnt", period=period) -combiner = MonascaCombineLDP( - metric= "cpu.logical_cores_actives", - bindings= { - a: "cpu.idle_perc", - b: "cpu.total_logical_cores", - }, - lambda= "a * b", - period= period -) -derivator = MonascaDerivativeLDP(period=period) - - -# Connections -src -> aggregator -> stdout -src -> [combiner, derivator] -> stdout -[combiner, derivator] -> file diff --git a/config/metric_experiments.json b/config/metric_experiments.json deleted file mode 100644 index 63c564d..0000000 --- a/config/metric_experiments.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "MonascaMarkovChainSource", - "sleep": 0.01 - } - }, - "ingestors": {}, - "smls": {}, - "voters": {}, - "sinks": { - "snk2": { - "module": "StdoutSink" - }, - "snk3": { - "module": "FileSink", - "path": "~/monasca-aggregate.log" - } - }, - "ldps": { - "ldp3": { - "module": "MonascaAggregateLDP", - "period": 2, - "func": "cnt" - }, - "ldp4": { - "module": "MonascaCombineLDP", - "metric": "cpu.logical_cores_actives", - "period": 1, - "lambda": "a * b", - "bindings": { - "a": "cpu.idle_perc", - "b": "cpu.total_logical_cores" - } - }, - "ldp5": { - "module": "MonascaDerivativeLDP", - "period": 1 - } - }, - "connections": { - "src1": ["ldp5"], - "ldp3": [], - "ldp4": [], - "ldp5": ["snk2"], - "snk2": [], - "snk3": [] - }, - "feedback": {} -} diff --git a/config/monasca_aggregate_all_fn.banana b/config/monasca_aggregate_all_fn.banana deleted file mode 100644 index 9f4303a..0000000 --- a/config/monasca_aggregate_all_fn.banana +++ /dev/null @@ -1,13 +0,0 @@ -############################## -# Monasca aggregate all functions - -src = MonascaMarkovChainSource(sleep=0.01) -snk = KafkaSink(host="localhost", port=9092, topic="experiments") -stdout = StdoutSink() - -ldp1 = MonascaAggregateLDP(func="cnt") -ldp2 = MonascaAggregateLDP(func="max") -ldp3 = MonascaAggregateLDP(func="min") -ldp4 = MonascaAggregateLDP(func="avg") - -src -> [ldp1, ldp2, ldp3, ldp4] -> [snk, stdout] diff --git a/config/monasca_aggregate_all_fn.json b/config/monasca_aggregate_all_fn.json deleted file mode 100644 index c81754f..0000000 --- a/config/monasca_aggregate_all_fn.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "MonascaMarkovChainSource", - "sleep": 0.01 - } - }, - "ingestors": {}, - "smls": {}, - "voters": {}, - "sinks": { - "snk1": { - "module": "KafkaSink", - "host": "localhost", - "port": 9092, - "topic": "monasca_experiments" - }, - "snk2": { - "module": "StdoutSink" - } - }, - "ldps": { - "ldp1": { - "module": "MonascaAggregateLDP", - "period": 2, - "func": "max" - }, - "ldp2": { - "module": "MonascaAggregateLDP", - "period": 2, - "func": "min" - }, - "ldp3": { - "module": "MonascaAggregateLDP", - "period": 2, - "func": "avg" - }, - "ldp4": { - "module": "MonascaAggregateLDP", - "period": 2, - "func": "sum" - } - }, - "connections": { - "src1": ["ldp1", "ldp2", "ldp3", "ldp4"], - "ldp1": ["snk2"], - "ldp2": ["snk2"], - "ldp3": ["snk2"], - "ldp4": ["snk2"], - "snk1": [], - "snk2": [] - }, - "feedback": {} -} diff --git a/config_dsl.py b/config_dsl.py deleted file mode 100644 index b3efea7..0000000 --- a/config_dsl.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import os -import six -from logging import config as log_conf - -from monasca_analytics.banana.cli import interpreter - -DEFAULT_LOGGING_CONFIG_FILE = "config/logging.json" - - -def setup_logging(): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - DEFAULT_LOGGING_CONFIG_FILE) - with open(logging_config_file, "rt") as f: - config = json.load(f) - log_conf.dictConfig(config) - - -def main(): - setup_logging() - print(">>>>> DEPRECATED TOOL <<<<<") - print(">>>>> Use the banana language instead <<<<<") - print("") - print("Welcome to Monanas config command line") - print("Type help for help about commands") - inter = interpreter.DSLInterpreter() - cmd = "" - while "exit" != cmd.lower(): - cmd = six.moves.input(">> ") - if cmd != "": - try: - print(inter.execute_string(cmd)) - except Exception as e: - print("Failed : " + str(e)) - -if __name__ == "__main__": - main() diff --git a/devstack/README.md b/devstack/README.md deleted file mode 100644 index 5f15e63..0000000 --- a/devstack/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Monasca Analytics DevStack Plugin - -The Monasca Analytics DevStack plugin currently only works on Ubuntu 16.04 (Xenial). -More Linux Distributions will be supported in the future. - -Running the Monasca Analytics DevStack plugin requires a machine with 8GB of RAM. - -Directions for installing and running Devstack can be found here: - - http://docs.openstack.org/developer/devstack/ - -To run Monasca Analytics in DevStack, do the following three steps. - -1. Clone the DevStack repo. - -``` -git clone https://opendev.org/openstack/devstack -``` - -2. Add the following to the DevStack local.conf file in the root of the devstack directory. You may - need to create the local.conf if it does not already exist. - -# BEGIN DEVSTACK LOCAL.CONF CONTENTS - -``` -[[local|localrc]] -MYSQL_PASSWORD=secretmysql -DATABASE_PASSWORD=secretdatabase -RABBIT_PASSWORD=secretrabbit -ADMIN_PASSWORD=secretadmin -SERVICE_PASSWORD=secretservice -SERVICE_TOKEN=111222333444 - -LOGFILE=$DEST/logs/stack.sh.log -LOGDIR=$DEST/logs -LOG_COLOR=False - -# This line will enable all of Monasca Analytics. -enable_plugin monasca-analytics https://opendev.org/openstack/monasca-analytics -``` - -# END DEVSTACK LOCAL.CONF CONTENTS - -3. Run './stack.sh' from the root of the devstack directory. - -To run Monasca Analytics with the bare mininum of OpenStack components you can -add the following two lines to the local.conf file. - -``` -disable_all_services -enable_service rabbit mysql key -``` - -# License - -``` -# (C) Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -``` diff --git a/devstack/files/kafka/kafka-server-start.sh b/devstack/files/kafka/kafka-server-start.sh deleted file mode 100644 index 5785bbd..0000000 --- a/devstack/files/kafka/kafka-server-start.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -if [ $# -lt 1 ]; -then - echo "USAGE: $0 [-daemon] server.properties" - exit 1 -fi -base_dir=$(dirname $0) -export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties" -export KAFKA_HEAP_OPTS="-Xms256m -Xmx256m" - -EXTRA_ARGS="-name kafkaServer -loggc" - -COMMAND=$1 -case $COMMAND in - -daemon) - EXTRA_ARGS="-daemon "$EXTRA_ARGS - shift - ;; - *) - ;; -esac - -exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka $@ diff --git a/devstack/files/kafka/kafka.conf b/devstack/files/kafka/kafka.conf deleted file mode 100644 index 005e77c..0000000 --- a/devstack/files/kafka/kafka.conf +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -description "Kafka" - -start on runlevel [2345] -stop on runlevel [!2345] - -respawn - -limit nofile 32768 32768 - -# If zookeeper is running on this box also give it time to start up properly -pre-start script - if [ -e /etc/init.d/zookeeper ]; then - /etc/init.d/zookeeper start || true - fi -end script - -# Rather than using setuid/setgid sudo is used because the pre-start task must run as root -exec sudo -Hu kafka -g kafka KAFKA_HEAP_OPTS="-Xmx128m" /opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties diff --git a/devstack/files/kafka/kafka.service b/devstack/files/kafka/kafka.service deleted file mode 100644 index c03d2af..0000000 --- a/devstack/files/kafka/kafka.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Apache Kafka -Requires=network.target -After=zookeepepr.service - -[Service] -Type=simple -ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties -ExecStop=/opt/kafka/bin/kafka-server-stop.sh - -[Install] -WantedBy=multi-user.target diff --git a/devstack/files/kafka/log4j.properties b/devstack/files/kafka/log4j.properties deleted file mode 100644 index b3cff00..0000000 --- a/devstack/files/kafka/log4j.properties +++ /dev/null @@ -1,75 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -log4j.rootLogger=WARN, stdout - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n - -log4j.appender.kafkaAppender=org.apache.log4j.RollingFileAppender -log4j.appender.kafkaAppender.MaxFileSize=50MB -log4j.appender.kafkaAppender.MaxBackupIndex=4 -log4j.appender.kafkaAppender.File=/var/log/kafka/server.log -log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout -log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n - -log4j.appender.stateChangeAppender=org.apache.log4j.RollingFileAppender -log4j.appender.stateChangeAppender.MaxFileSize=50MB -log4j.appender.stateChangeAppender.MaxBackupIndex=4 -log4j.appender.stateChangeAppender.File=/var/log/kafka/state-change.log -log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout -log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n - -log4j.appender.controllerAppender=org.apache.log4j.RollingFileAppender -log4j.appender.controllerAppender.MaxFileSize=50MB -log4j.appender.controllerAppender.MaxBackupIndex=4 -log4j.appender.controllerAppender.File=/var/log/kafka/controller.log -log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout -log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n - -# Turn on all our debugging info -#log4j.logger.kafka.producer.async.DefaultEventHandler=DEBUG, kafkaAppender -#log4j.logger.kafka.client.ClientUtils=DEBUG, kafkaAppender -#log4j.logger.kafka.perf=DEBUG, kafkaAppender -#log4j.logger.kafka.perf.ProducerPerformance$ProducerThread=DEBUG, kafkaAppender -#log4j.logger.org.I0Itec.zkclient.ZkClient=DEBUG -log4j.logger.kafka=WARN, kafkaAppender - -# Tracing requests results in large logs -#log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender -#log4j.appender.requestAppender.MaxFileSize=50MB -#log4j.appender.requestAppender.MaxBackupIndex=4 -#log4j.appender.requestAppender.File=/var/log/kafka/kafka-request.log -#log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout -#log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n -# -#log4j.logger.kafka.network.RequestChannel$=TRACE, requestAppender -#log4j.additivity.kafka.network.RequestChannel$=false -# -#log4j.logger.kafka.network.Processor=TRACE, requestAppender -#log4j.logger.kafka.server.KafkaApis=TRACE, requestAppender -#log4j.additivity.kafka.server.KafkaApis=false -#log4j.logger.kafka.request.logger=TRACE, requestAppender -#log4j.additivity.kafka.request.logger=false - -log4j.logger.kafka.controller=TRACE, controllerAppender -log4j.additivity.kafka.controller=false - -log4j.logger.state.change.logger=TRACE, stateChangeAppender -log4j.additivity.state.change.logger=false - diff --git a/devstack/files/kafka/server.properties b/devstack/files/kafka/server.properties deleted file mode 100644 index 15787c0..0000000 --- a/devstack/files/kafka/server.properties +++ /dev/null @@ -1,119 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################# Server Basics ############################# - -# The id of the broker. This must be set to a unique integer for each broker. -broker.id=0 - -############################# Socket Server Settings ############################# - -# The port the socket server listens on -port=9092 - -# Hostname the broker will bind to. If not set, the server will bind to all interfaces -host.name=127.0.0.1 - -# Hostname the broker will advertise to producers and consumers. If not set, it uses the -# value for "host.name" if configured. Otherwise, it will use the value returned from -# java.net.InetAddress.getCanonicalHostName(). -#advertised.host.name= - -# The port to publish to ZooKeeper for clients to use. If this is not set, -# it will publish the same port that the broker binds to. -#advertised.port= - -# The number of threads handling network requests -num.network.threads=2 - -# The number of threads doing disk I/O -num.io.threads=2 - -# The send buffer (SO_SNDBUF) used by the socket server -socket.send.buffer.bytes=1048576 - -# The receive buffer (SO_RCVBUF) used by the socket server -socket.receive.buffer.bytes=1048576 - -# The maximum size of a request that the socket server will accept (protection against OOM) -socket.request.max.bytes=104857600 - - -############################# Log Basics ############################# - -# A comma separated list of directories under which to store log files -log.dirs=/var/kafka - -auto.create.topics.enable=false -# The number of logical partitions per topic per server. More partitions allow greater parallelism -# for consumption, but also mean more files. -num.partitions=2 - -############################# Log Flush Policy ############################# - -# Messages are immediately written to the filesystem but by default we only fsync() to sync -# the OS cache lazily. The following configurations control the flush of data to disk. -# There are a few important trade-offs here: -# 1. Durability: Unflushed data may be lost if you are not using replication. -# 2. Latency: Very large flush intervals may lead to latency spikes when the flush does occur as there will be a lot of data to flush. -# 3. Throughput: The flush is generally the most expensive operation, and a small flush interval may lead to exceessive seeks. -# The settings below allow one to configure the flush policy to flush data after a period of time or -# every N messages (or both). This can be done globally and overridden on a per-topic basis. - -# The number of messages to accept before forcing a flush of data to disk -log.flush.interval.messages=10000 - -# The maximum amount of time a message can sit in a log before we force a flush -log.flush.interval.ms=1000 - -############################# Log Retention Policy ############################# - -# The following configurations control the disposal of log segments. The policy can -# be set to delete segments after a period of time, or after a given size has accumulated. -# A segment will be deleted whenever *either* of these criteria are met. Deletion always happens -# from the end of the log. - -# The minimum age of a log file to be eligible for deletion -log.retention.hours=24 - -# A size-based retention policy for logs. Segments are pruned from the log as long as the remaining -# segments don't drop below log.retention.bytes. -log.retention.bytes=104857600 - -# The maximum size of a log segment file. When this size is reached a new log segment will be created. -log.segment.bytes=104857600 - -# The interval at which log segments are checked to see if they can be deleted according -# to the retention policies -log.retention.check.interval.ms=60000 - -# By default the log cleaner is disabled and the log retention policy will default to just delete segments after their retention expires. -# If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction. -log.cleaner.enable=false - -############################# Zookeeper ############################# - -# Zookeeper connection string (see zookeeper docs for details). -# This is a comma separated host:port pairs, each corresponding to a zk -# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002". -# You can also append an optional chroot string to the urls to specify the -# root directory for all kafka znodes. -zookeeper.connect=127.0.0.1:2181 - -# Timeout in ms for connecting to zookeeper -zookeeper.connection.timeout.ms=1000000 - diff --git a/devstack/files/maven/settings.xml b/devstack/files/maven/settings.xml deleted file mode 100644 index d65b036..0000000 --- a/devstack/files/maven/settings.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - true - http - - - - 8080 - localhost - - - diff --git a/devstack/files/zookeeper/environment b/devstack/files/zookeeper/environment deleted file mode 100644 index 3d5cde7..0000000 --- a/devstack/files/zookeeper/environment +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Modified from http://packages.ubuntu.com/saucy/zookeeperd -NAME=zookeeper -ZOOCFGDIR=/etc/zookeeper/conf - -# seems, that log4j requires the log4j.properties file to be in the classpath -CLASSPATH="$ZOOCFGDIR:/usr/share/java/jline.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/netty.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-log4j12.jar:/usr/share/java/zookeeper.jar" - -ZOOCFG="$ZOOCFGDIR/zoo.cfg" -ZOO_LOG_DIR=/var/log/zookeeper -USER=$NAME -GROUP=$NAME -PIDDIR=/var/run/$NAME -PIDFILE=$PIDDIR/$NAME.pid -SCRIPTNAME=/etc/init.d/$NAME -JAVA=/usr/bin/java -ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" -ZOO_LOG4J_PROP="INFO,ROLLINGFILE" -JMXLOCALONLY=false -JAVA_OPTS="" diff --git a/devstack/files/zookeeper/log4j.properties b/devstack/files/zookeeper/log4j.properties deleted file mode 100644 index 3fe8ae0..0000000 --- a/devstack/files/zookeeper/log4j.properties +++ /dev/null @@ -1,69 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# From http://packages.ubuntu.com/saucy/zookeeperd - -# ZooKeeper Logging Configuration -# - -# Format is " (, )+ - -log4j.rootLogger=${zookeeper.root.logger} - -# Example: console appender only -# log4j.rootLogger=INFO, CONSOLE - -# Example with rolling log file -#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE - -# Example with rolling log file and tracing -#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE - -# -# Log INFO level and above messages to the console -# -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.Threshold=INFO -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - -# -# Add ROLLINGFILE to rootLogger to get log file output -# Log DEBUG level and above messages to a log file -log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender -log4j.appender.ROLLINGFILE.Threshold=WARN -log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/zookeeper.log - -# Max log file size of 10MB -log4j.appender.ROLLINGFILE.MaxFileSize=10MB -# uncomment the next line to limit number of backup files -#log4j.appender.ROLLINGFILE.MaxBackupIndex=10 - -log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout -log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n - - -# -# Add TRACEFILE to rootLogger to get log file output -# Log DEBUG level and above messages to a log file -log4j.appender.TRACEFILE=org.apache.log4j.FileAppender -log4j.appender.TRACEFILE.Threshold=TRACE -log4j.appender.TRACEFILE.File=${zookeeper.log.dir}/zookeeper_trace.log - -log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout -### Notice we are including log4j's NDC here (%x) -log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n diff --git a/devstack/files/zookeeper/myid b/devstack/files/zookeeper/myid deleted file mode 100644 index c227083..0000000 --- a/devstack/files/zookeeper/myid +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/devstack/files/zookeeper/zoo.cfg b/devstack/files/zookeeper/zoo.cfg deleted file mode 100644 index 079bc33..0000000 --- a/devstack/files/zookeeper/zoo.cfg +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#    http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# http://hadoop.apache.org/zookeeper/docs/current/zookeeperAdmin.html - -# The number of milliseconds of each tick -tickTime=2000 -# The number of ticks that the initial -# synchronization phase can take -initLimit=10 -# The number of ticks that can pass between -# sending a request and getting an acknowledgement -syncLimit=5 -# the directory where the snapshot is stored. -dataDir=/var/lib/zookeeper -# Place the dataLogDir to a separate physical disc for better performance -# dataLogDir=/disk2/zookeeper - -# the port at which the clients will connect -clientPort=2181 - -# Maximum number of clients that can connect from one client -maxClientCnxns=60 - -# specify all zookeeper servers -# The fist port is used by followers to connect to the leader -# The second one is used for leader election - -server.0=127.0.0.1:2888:3888 - -# To avoid seeks ZooKeeper allocates space in the transaction log file in -# blocks of preAllocSize kilobytes. The default block size is 64M. One reason -# for changing the size of the blocks is to reduce the block size if snapshots -# are taken more often. (Also, see snapCount). -#preAllocSize=65536 - -# Clients can submit requests faster than ZooKeeper can process them, -# especially if there are a lot of clients. To prevent ZooKeeper from running -# out of memory due to queued requests, ZooKeeper will throttle clients so that -# there is no more than globalOutstandingLimit outstanding requests in the -# system. The default limit is 1,000.ZooKeeper logs transactions to a -# transaction log. After snapCount transactions are written to a log file a -# snapshot is started and a new transaction log file is started. The default -# snapCount is 10,000. -#snapCount=1000 - -# If this option is defined, requests will be will logged to a trace file named -# traceFile.year.month.day. -#traceFile= - -# Leader accepts client connections. Default value is "yes". The leader machine -# coordinates updates. For higher update throughput at thes slight expense of -# read throughput the leader can be configured to not accept clients and focus -# on coordination. -#leaderServes=yes - -# Autopurge every hour to avoid using lots of disk in bursts -# Order of the next 2 properties matters. -# autopurge.snapRetainCount must be before autopurge.purgeInterval. -autopurge.snapRetainCount=3 -autopurge.purgeInterval=1 diff --git a/devstack/plugin.sh b/devstack/plugin.sh deleted file mode 100755 index 93dfe8c..0000000 --- a/devstack/plugin.sh +++ /dev/null @@ -1,362 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Monasca-analytics DevStack plugin -# -# Install and start Monasca-analytics service in devstack -# -# To enable Monasca-analytics in devstack add an entry to local.conf that -# looks like -# -# [[local|localrc]] -# enable_plugin monasca-analytics https://git.openstack.org/openstack/monasca-analytics -# -# By default all Monasca services are started (see -# devstack/settings). To disable a specific service use the -# disable_service function. For example to turn off notification: -# -# disable_service monasca-notification -# -# Several variables set in the localrc section adjust common behaviors -# of Monasca (see within for additional settings): -# -# EXAMPLE VARS HERE - -# Save trace setting -XTRACE=$(set +o | grep xtrace) -set -o xtrace - -ERREXIT=$(set +o | grep errexit) -set -o errexit - -# Determine if we are running in devstack-gate or devstack. -if [[ $DEST ]]; then - # We are running in devstack-gate. - export MONASCA_BASE=${MONASCA_BASE:-"${DEST}"} - -else - # We are running in devstack. - export MONASCA_BASE=${MONASCA_BASE:-"/opt/stack"} - -fi -export MONASCA_ANALYTICS_BASE=${MONASCA_ANALYTICS_BASE:-"${MONASCA_BASE}/monasca-analytics"} - -### -function pre_install_spark { -: -} - -### -function pre_install_monasca_analytics { -: -} - -### -function unstack_monasca_analytics { - echo_summary "Unstack Monasca-analytics" - - delete_monasca_analytics_files - - sudo userdel monasca-analytics || true - sudo groupdel monasca-analytics || true - - unstack_spark -} - -### -function delete_monasca_analytics_files { - sudo rm -rf /opt/monasca/analytics || true - sudo rm -rf /etc/monasca/analytics || true - sudo rm /etc/init/monasca-analytics.conf || true - - MONASCA_ANALYTICS_DIRECTORIES=("/var/log/monasca/analytics" "/var/run/monasca/analytics" "/etc/monasca/analytics/init") - - for MONASCA_ANALYTICS_DIRECTORY in "${MONASCA_ANALYTICS_DIRECTORIES[@]}" - do - sudo rm -rf ${MONASCA_ANALYTICS_DIRECTORY} || true - done -} - -### -function unstack_spark { - echo_summary "Unstack Spark" - - delete_spark_directories - sudo rm -rf /opt/spark/download || true -} - -### -function clean_monasca_analytics { - set +o errexit - unstack_monasca_analytics - unistall_pkgs - set -o errexit -} - -### -function delete_spark_directories { - for SPARK_DIRECTORY in "${SPARK_DIRECTORIES[@]}" - do - sudo rm -rf ${SPARK_DIRECTORY} || true - done - - sudo rm -rf /var/log/spark-events || true -} - -### -function unistall_pkgs { - sudo apt-get -y purge ipython python-scipy python-numpy - sudo apt-get -y purge python-setuptools - - sudo apt-get -y purge sbt - sudo apt-key del $KEYID - sudo sed -i -e '/deb https\:\/\/dl.bintray.com\/sbt\/debian \//d' /etc/apt/sources.list.d/sbt.list - sudo dpkg -r scala - - sudo apt-get -y purge $JDK_PKG - - sudo rm -rf ~/.m2 - - sudo rm -rf $SPARK_DIR -} - -### -function install_pkg { - ## JDK - sudo -E apt-get -y install $JDK_PKG - - ## SCALA - download_through_cache $SCALA_URL $SCALA $SPARK_DOWNLOAD - sudo -E dpkg -i $SPARK_DOWNLOAD/$SCALA - echo "deb https://dl.bintray.com/sbt/debian /" | sudo -E tee -a /etc/apt/sources.list.d/sbt.list - sudo -E apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv $KEYID - sudo -E apt-get update - sudo -E apt-get -y install sbt - - ## other pkg - sudo -E apt-get -y install python-setuptools - sudo -E apt-get -y install python-numpy python-scipy ipython -} - -### -function build_spark { - ## install maven - download_through_cache $MAVEN_URL $MAVEN_TARBALL $SPARK_DOWNLOAD - sudo chown stack:stack $SPARK_DOWNLOAD/$MAVEN_TARBALL - sudo -u stack -g stack tar -xzf $SPARK_DOWNLOAD/$MAVEN_TARBALL -C $SPARK_DIR - - if [ ${http_proxy} ];then - read HTTP_PROXY_USER_NAME HTTP_PROXY_PASSWORD HTTP_PROXY_HOST<< END -`echo ${http_proxy:7} | awk -F: '{sub("@", ":");print $1, $2, $3}'` -END - if [ -z $HTTP_PROXY_HOST ];then - LENGTH_FOR_HOST=`expr match "$http_proxy" 'http://[\.A-Za-z\-]*'`-7 - sed -e '7,8d' \ - -e "s/<\/host>/${http_proxy:7:$LENGTH_FOR_HOST}<\/host>/g" \ - ${MONASCA_ANALYTICS_BASE}/devstack/files/maven/settings.xml > ~/.m2/settings.xml - else - sed -e "s/<\/username>/${HTTP_PROXY_USER_NAME}<\/username>/g" \ - -e "s/<\/password>/${HTTP_PROXY_PASSWORD}<\/password>/g" \ - -e "s/<\/host>/${HTTP_PROXY_HOST}<\/host>/g" \ - ${MONASCA_ANALYTICS_BASE}/devstack/files/maven/settings.xml > ~/.m2/settings.xml - fi - fi - - ## Build Spark - download_through_cache $SPARK_URL ${SPARK_TARBALL_NAME} $SPARK_DOWNLOAD - sudo chown stack:stack $SPARK_DOWNLOAD/${SPARK_TARBALL_NAME} - sudo -u stack -g stack tar -xzf $SPARK_DOWNLOAD/${SPARK_TARBALL_NAME} -C $SPARK_DIR - - DEVSTACK_DIR=`pwd` - cd $SPARK_DIR/spark-${SPARK_VERSION} - $SPARK_DIR/$MAVEN/bin/mvn -DskipTests clean package - sudo cp -pf ./conf/log4j.properties.template ./conf/log4j.properties - sudo sed -i 's/log4j.rootCategory=INFO/log4j.rootCategory=ERROR/g' ./conf/log4j.properties - cd $DEVSTACK_DIR -} - -### -function install_zookeeper { - if [ ! -e /etc/init.d/zookeeper ]; then - echo_summary "Install Monasca Zookeeper" - - sudo apt-get -y install zookeeperd - - sudo cp "${MONASCA_ANALYTICS_BASE}"/devstack/files/zookeeper/myid /etc/zookeeper/conf/myid - sudo cp "${MONASCA_ANALYTICS_BASE}"/devstack/files/zookeeper/environment /etc/zookeeper/conf/environment - sudo cp "${MONASCA_ANALYTICS_BASE}"/devstack/files/zookeeper/log4j.properties /etc/zookeeper/conf/log4j.properties - sudo cp "${MONASCA_ANALYTICS_BASE}"/devstack/files/zookeeper/zoo.cfg /etc/zookeeper/conf/zoo.cfg - if [[ ${SERVICE_HOST} ]]; then - sudo sed -i "s/server\.0=127\.0\.0\.1/server.0=${SERVICE_HOST}/g" /etc/zookeeper/conf/zoo.cfg - fi - - sudo mkdir -p /var/log/zookeeper || true - sudo chmod 755 /var/log/zookeeper - - sudo systemctl start zookeeper || sudo systemctl restart zookeeper - else - echo_summary "SKIP:Install Monasca Zookeeper" - fi -} - -### -function install_kafka { - if [ ! -e /etc/init/kafka.conf ];then - echo_summary "Install Monasca Kafka" - - sudo groupadd --system kafka || true - sudo useradd --system -g kafka kafka || true - - download_through_cache $KAFKA_URL $KAFKA_TARBALL $SPARK_DOWNLOAD - sudo tar -xzf $SPARK_DOWNLOAD/$KAFKA_TARBALL -C /opt - sudo ln -sf /opt/kafka_${KAFKA_VERSION} /opt/kafka - - sudo cp -f "${MONASCA_ANALYTICS_BASE}"/devstack/files/kafka/kafka-server-start.sh /opt/kafka_${KAFKA_VERSION}/bin/kafka-server-start.sh - sudo cp -f "${MONASCA_ANALYTICS_BASE}"/devstack/files/kafka/kafka.conf /etc/init/kafka.conf - - sudo chown root:root /etc/init/kafka.conf - sudo chmod 644 /etc/init/kafka.conf - - sudo mkdir -p /var/kafka || true - sudo chown kafka:kafka /var/kafka - sudo chmod 755 /var/kafka - sudo rm -rf /var/kafka/lost+found - - sudo mkdir -p /var/log/kafka || true - sudo chown kafka:kafka /var/log/kafka - sudo chmod 755 /var/log/kafka - - sudo ln -sf /opt/kafka/config /etc/kafka - sudo cp -f "${MONASCA_ANALYTICS_BASE}"/devstack/files/kafka/log4j.properties /etc/kafka/log4j.properties - sudo chown kafka:kafka /etc/kafka/log4j.properties - - sudo chmod 644 /etc/kafka/log4j.properties - sudo cp -f "${MONASCA_ANALYTICS_BASE}"/devstack/files/kafka/server.properties /etc/kafka/server.properties - sudo chown kafka:kafka /etc/kafka/server.properties - sudo chmod 644 /etc/kafka/server.properties - - if [[ ${SERVICE_HOST} ]]; then - sudo sed -i "s/host\.name=127\.0\.0\.1/host.name=${SERVICE_HOST}/g" /etc/kafka/server.properties - sudo sed -i "s/zookeeper\.connect=127\.0\.0\.1:2181/zookeeper.connect=${SERVICE_HOST}:2181/g" /etc/kafka/server.properties - fi - - sudo cp -f "${MONASCA_ANALYTICS_BASE}"/devstack/files/kafka/kafka.service /etc/systemd/system/kafka.service - sudo chmod 644 /etc/systemd/system/kafka.service - - sudo systemctl enable kafka - sudo systemctl start kafka || sudo systemctl restart kafka - else - echo_summary "SKIP:Install Monasca Kafka" - fi -} - -### -function install_spark { - echo_summary "Install Spark" - - sudo mkdir -p $SPARK_DOWNLOAD - sudo chown -R stack:stack $SPARK_DIR - sudo chmod -R 755 $SPARK_DIR - mkdir -p ~/.m2 - - sudo -E apt-get update - - install_pkg - - build_spark - - install_zookeeper - - install_kafka -} - -### -function post_config_monasca_analytics { -: -} - -### -function extra_monasca_analytics { -: -} - -function download_through_cache { - local resource_location=$1 - local resource_name=$2 - local download_dir=$3 - - if [[ ! -d ${download_dir} ]]; then - _safe_permission_operation mkdir -p ${download_dir} - _safe_permission_operation chown stack ${download_dir} - fi - - pushd ${download_dir} - if [[ ! -f ${resource_name} ]]; then - sudo -E curl -m ${DOWNLOAD_FILE_TIMEOUT} --retry 3 --retry-delay 5 ${resource_location} -o ${resource_name} - fi - popd -} - -# check for service enabled -echo_summary "Monasca-analytics plugin with service enabled = `is_service_enabled monasca-analytics`" - -if is_service_enabled monasca-analytics; then - - if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then - # Set up system services - echo_summary "Configuring Spark system services" - pre_install_spark - echo_summary "Configuring Monasca-analytics system services" - pre_install_monasca_analytics - - elif [[ "$1" == "stack" && "$2" == "install" ]]; then - # Perform installation of service source - echo_summary "Installing Spark" - install_spark - - elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then - # Configure after the other layer 1 and 2 services have been configured - echo_summary "Configuring Monasca-analytics" - post_config_monasca_analytics - - elif [[ "$1" == "stack" && "$2" == "extra" ]]; then - # Initialize and start the Monasca service - echo_summary "Initializing Monasca-analytics" - extra_monasca_analytics - fi - - if [[ "$1" == "unstack" ]]; then - echo_summary "Unstacking Monasca-analytics" - unstack_monasca_analytics - fi - - if [[ "$1" == "clean" ]]; then - # Remove state and transient data - # Remember clean.sh first calls unstack.sh - echo_summary "Cleaning Monasca-analytics" - clean_monasca_analytics - fi - -else - echo_summary "Monasca-analytics not enabled" -fi - -#Restore errexit -$ERREXIT - -# Restore xtrace -$XTRACE diff --git a/devstack/settings b/devstack/settings deleted file mode 100644 index f9e902f..0000000 --- a/devstack/settings +++ /dev/null @@ -1,59 +0,0 @@ -# -# Copyright 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -enable_service monasca-analytics - -# -# Monasca infrastructure services -# - -# databases -# MySQL is already enabled in devstack - -# -# Dependent Software Versions -# - -DOWNLOAD_FILE_TIMEOUT=${DOWNLOAD_FILE_TIMEOUT:-1800} - -# spark vars -SPARK_DIRECTORIES=("/var/spark" "/var/log/spark" "/var/run/spark/work" "/etc/spark/conf" "/etc/spark/init" ) - -JDK_PKG="openjdk-8-jre-headless openjdk-8-jdk" - -MAVEN="apache-maven-3.5.4" -MAVEN_TARBALL="$MAVEN-bin.tar.gz" -MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/$MAVEN_TARBALL" - -SCALA_VERSION=${SCALA_VERSION:-2.12} -SCALA_MIN_VERSION=${SCALA_MIN_VERSION:-.8} -SCALA="scala-${SCALA_VERSION}${SCALA_MIN_VERSION}.deb" -SCALA_URL="https://downloads.lightbend.com/scala/${SCALA_VERSION}${SCALA_MIN_VERSION}/$SCALA" -KEYID=642AC823 - -SPARK_DIR="/opt/spark" -SPARK_DOWNLOAD="$SPARK_DIR/download" -SPARK_VERSION=${SPARK_VERSION:-2.4.4} -SPARK_TARBALL_NAME="spark-${SPARK_VERSION}.tgz" -SPARK_URL="http://archive.apache.org/dist/spark/spark-$SPARK_VERSION/$SPARK_TARBALL_NAME" - -BASE_KAFKA_VERSION=${BASE_KAFKA_VERSION:-2.1.1} -KAFKA_DIR="/opt/kafka" -KAFKA_DOWNLOAD="$KAFKA_DIR/download" -KAFKA_VERSION=${KAFKA_VERSION:-${SCALA_VERSION}-${BASE_KAFKA_VERSION}} -KAFKA_TARBALL="kafka_$KAFKA_VERSION.tgz" -KAFKA_URL="https://archive.apache.org/dist/kafka/$BASE_KAFKA_VERSION/$KAFKA_TARBALL" diff --git a/doc/banana.md b/doc/banana.md deleted file mode 100644 index be1b0d1..0000000 --- a/doc/banana.md +++ /dev/null @@ -1,141 +0,0 @@ -# Banana: a configuration language for Monanas - -Welcome to Banana, a configuration language for Monanas. The language is the -key of "recipes" allowing users to reuse it to tailor solutions for their -use-cases. In other words, Banana allows us to write a recipe(s) that will be -ingested by Monanas. - -The language is fully typed. It uses type inference to avoid having to add any -typing annotation. It is still in its early stages, so more features will be -added to solve common problems. - -> Note: a valid `banana` recipe (or file) might still contain errors that -> can only be discovered at run-time. The type system, will remove -> most of them though. - -To get you started, we provide an example below, which would allow us to -understand most parts of the language. - -> TODO: Once we have a specified interface, we should use it instead as it will -> provide syntax highlighting, in-editor error indication as well as other -> features such as autocompletion. - -## Part 1: Creating components - -Here is how we create a component: - -```python -# Create an IPTablesSource with sleep parameter set to 0.01 -src = IPTablesSource(sleep=0.01) -``` - -We could also create a component without any parameter. In that case, each -parameter is initialized with a default value. - -In order to get something interesting we first create the following components: - -```python -src = IPTablesSource(sleep=0.01) -ing1 = IptablesIngestor() -svm = SvmOneClass() -voter = PickIndexVoter(0) -ldp1 = IptablesLDP() -stdout = StdoutSink() -sqlite = IptablesSQLiteSink() -``` - -## Part 2: Connecting components - -Connections can be placed anywhere in the file. They will always be processed -after everything else. - -We have created five components so far, but note that, some components can only -connected to certain types of components). For instance, a source can only -be connected to an ingestor or a live data processor. However, you can't -connect it to a statistical or machine learning algorithms as those need to get -curated data only. Try to add the following line: - -```py -src -> alg -``` - -You should see an error, saying that this is not possible: - -``` -Error: Can't connect src to alg, src can only be connected to Ingestor. -``` - -What we want is to have those connections: - -``` -+---------+ +---------+ +---------+ +---------+ +---------+ +------------+ -| src +-----> | ing1 +------> | alg +-----> | vot +---> | ldp +-----> | stdout | -+----+----+ +---------+ +---------+ +---------+ +----+----+ +------------+ - | ^ - | | - +----------------------------------------------------------------------+ -``` - -Here is how we can achieve that: - -``` -src -> [ing1 -> alg -> vot -> ldp, ldp] -ldp -> stdout -``` - -We could also write it like this: - -``` -src -> ing1 -> alg -> vot -> ldp -src -> ldp -> stdout -``` - -Or like this: - -``` -src -> ing1 -src -> ldp -ing1 -> alg -alg -> vot -vot -> ldp -ldp -> stdout -``` - -The main difference is readability and this is subjective. Use the version that -you think is more readable. - -Banana will treat all of them as being semantically identical. - -## Part 3: Sharing settings between components - -From what we described above, it is possible that we could end up with many -similar parameters across components. It would be great if we could share them. -In Banana we can declare a variable not only for components, but also for -`string`, `number` and json-like `object`. - -For instance, this is valid in banana: - -```python -sleep = 0.01 -# ... -``` - -You can also make use of arithmetic operators to perform any computation you -might require with previously declared variables or anything else. - -Some global variables, defined by the execution environment are also available. -For instance, you could define `sleep` like this: - -```python -sleep = 0.01 / $spark.BATCH_INTERVAL -# ... -``` - -> TODO: the above feature has not yet been implemented. - -Finally, Banana supports string interpolation to mix many types together: - -```python -port = 9645 -host = "localhost:" + port -``` diff --git a/doc/cli.md b/doc/cli.md deleted file mode 100644 index 9f19e74..0000000 --- a/doc/cli.md +++ /dev/null @@ -1,187 +0,0 @@ -# Command line interface to generate a JSON configuration - -A simple command line tool has been implemented in order to manage -configurations in an easier way. It is not expected to be maintained in the -long term. It is introduced to experiment with the creation of `banana`, the -configuration language of Monanas. - -This section explains what operations are currently available and how to use -them. - -> NOTE: Please refer to [Monasca/Configuration](configuration.md) for the -> structure of the JSON configuration. - -> NOTE: This tool is DEPRECATED, use [BANANA](banana.md) configuration language -> instead. - -## Usage - -* Start the Monanas cli -```bash -python $MONANAS_HOME/config_dsl.py -``` -After running this command, a simple empty configuration will be created. You -can then modify it by running the commands listed below: - -## Available commands - -You can run the following operations from the CLI in order to create, remove, connect, -disconnect and modify components from the configuration. - -### Create component - -Create a component and assign it to a variable: - -```python ->> A = IPTablesSource -``` - -This command adds a new source of type `IPTablesSource` to the configuration, -assigning it with a default configuration. It links the source component to -variable A and returns a unique ID. You can either use the variable or the ID -to refer to the instance of the `IPTablesSource` created. - -### Remove component - -Remove a component using an ID or a variable name: - -```python ->> rm A -``` - -This command removes the component referenced by `A` from the configuration. -The parameter can either be a variable or an ID associated to a component -in the configuration. The component will only be removed if it is not connected -to any other component. - -### Connect components - -Connect two components in the configuration: - -```python ->> A -> B -``` - -This command connects the component referenced by `A` with the component -referenced by `B`. Both `A` and `B` can be variables or IDs, and the connection -is directional from `A` to `B`. The connection is valid and considered only if -the associated components exist and allowed for connection. For example, -connecting a source with an ingestor is allowed, but connecting a source with -a voter is not. - -### Disconnect components - -Disconnect two components in the configuration: - -```python ->> A !-> B -``` - -This command disconnects the component `A` from component `B`. Both `A` and `B` -can be variables or IDs and the connection is directional from `A` to `B`. If -the connection doesn't exist, nothing will happen. - -### Modify component - -Modify values of the configuration of a component: - -```python ->> A.params.subparam1.subparam2 = value -``` - -This command modifies the value of the configuration parameter at the end of -the path defined by a dot notation. The configuration is validated before being -modified; hence, if the modification results in an invalid configuration, it -will not be executed. `A` can either be a variable or an ID. - -## Config presentation operations - -The following operations can be run using the tool in order to view the -current configuration, sub-configurations, and available components that can be -instantiated. - -### Print - -Print the full configuration: - -```python ->> print -``` - -This command displays the full configuration in JSON format on the screen. - -Print component type sub-configuration: - -```python ->> print connections -``` - -If a parameter is passed to the print command that corresponds to a component -type, or in general, a first level key of the configuration, only the relevant -sub-configuration that is selected will be displayed on the screen. - -Print a particular component sub-configuration: - -```python ->> print A -``` - -If a parameter is passed to the print command that corresponds to a variable -or an ID associated to a particular component, only its configuration will be -displayed on the screen. - -### List - -Print all available components: - -```python ->> list -``` - -This command displays all available components that can be add to the -configuration, organized by type. - -Print all available components of a particular type: - -```python ->> list smls -``` - -If a type is passed as a parameter to the list command, only the available -components of that type will be listed. - -## Config storage operations - -The following operations can be run from the tool in order to load and save -configurations from/to files. - -### Load - -Load a configuration from a file: - -```python ->> load filename -``` - -This command loads the configuration stored in the file 'filename', overriding -the configuration currently being manipulated in memory. - -### Save - -Save a configuration to a file: - -```python ->> save filename -``` - -This command saves the configuration being currently handled to the file -'filename', overriding the file if it existed previously. - -Save a configuration to the last file: - -```python ->> save -``` - -If no parameter is provided, the save operation saves the current -configuration being handled to the last file loaded from or saved to. diff --git a/doc/configuration.md b/doc/configuration.md deleted file mode 100644 index 8fe3334..0000000 --- a/doc/configuration.md +++ /dev/null @@ -1,123 +0,0 @@ -# Configurations -MoNanas consumes two configuration files, one for orchestrating data execution -and the other for logging. - -## Orchestrating Configuration -> Note: Please refer to [Monasca/Design](design.md) to understand the concept -of each component before creating or modifying a configuration. - -With the current implementation, a JSON file is used to configure how MoNanas -orchestrates the data execution pipeline. This comes in different parts as -follows. - -### ID (`id`) - -A unique identifier for the configuration. - -### Spark (`spark_config`) - -* `appName`: A string describing the Spark's application name. -* `streaming`: Attributes for data streaming. - * `batch_interval`: DStream's batch interval. - -### Server (`server`) - -* `port`: Port number to listen. -* `debug`: Debug mode. - -### Sources (`sources`) - -`sources` is a JSON object (equivalent to python dictionary in this case) where -the keys represent unique identifiers of sources. Each source has the following -attributes: -* `module`: The name of the python module used for connecting to the source. -* `params`: A JSON object representing the source's parameters (e.g. data model -used). - -### Ingestors (`ingestors`) - -`ingestors` is a JSON object (equivalent to python dictionary in this case) -where the keys represent unique identifiers of ingestors. Each ingestor has -the following attributes: -* `module`: The name of the python module implementing the ingestor. -* `params`: A JSON object representing the ingestor's parameters (e.g. -parameters for data conversion). - -### Aggregators (`aggregators`) - -`aggregators` is a JSON object (equivalent to python dictionary in this case) -where the keys represent unique identifiers of aggregators. Each aggregator -has the following attributes: -* `module`: The name of the python module implementing the aggregator. -* `params`: A JSON object representing the aggregator's parameters (e.g. how -data streams are aggregated). - -> Note: Currently, only one aggregator is supported - the python module is -`default_aggregator`. - -### SML Functions (`sml`) - -`sml` is a JSON object (equivalent to python dictionary in this case) -where the keys represent unique identifiers of SML functions. Each SML function -has the following attributes: -* `module`: The name of the python module implementing the SML function. -* `params`: A JSON object representing the SML function's parameters (e.g. -number of samples, confidence interval). - -### Voters (`voters`) - -`voters` is a JSON object (equivalent to python dictionary in this case) where -the keys represent unique identifiers of voters. Each voter has the following -attributes: -* `module`: The name of the python module implementing the voter. -* `params`: A JSON object representing the voter's parameters (e.g. weights, -topology). - -### Live Data Processors (`ldp`) - -`ldp` is a JSON object (equivalent to python dictionary in this case) where -the keys represent unique identifiers of live data processors. Each live data -processor has the following attributes: -* `module`: The name of the python module implementing the live data processor. -* `params`: A JSON object representing the live data processor's parameters -(e.g. mode). - -### Sinks (`sinks`) - -`sinks` is a JSON object (equivalent to python dictionary in this case) where -the keys represent unique identifiers of sinks. Each sink has the following -attributes: -* `module`: The name of the python module used for connecting to the sink. -* `params`: A JSON object representing the sink's parameters (e.g. server's -details, data format). - -### Connections - -`connections` is a JSON object (equivalent to python dictionary in this case) -where each key represents a unique identifier of the component acting as the -originating end of the data flow where its associated value is an list of -unique identifiers of components acting as terminating ends of the data flow. -The information described by `connections` can be used to represent the flow -of data execution end-to-end. - -## Logging Configuration - -### MoNanas - -MoNanas comes with a default logging configuration. To change the logging -properties including format, level, etc., simply override -`$MONANAS_HOME/config/logging.json`. - -### Spark - -By default, Spark's logging is at an INFO level. To avoid unnecessary console -output, change `log4j.rootCategory=INFO, console` to `log4j.rootCategory=ERROR, -console` in `$SPARK_HOME/conf/log4j.properties` or as preferred. - -> Note: Not required for a Vagrant generated VM. - -### Other Software/Tools - -For logging configuration of other software/tools, please refer to their -user guide. - diff --git a/doc/design.md b/doc/design.md deleted file mode 100644 index d2a7c88..0000000 --- a/doc/design.md +++ /dev/null @@ -1,106 +0,0 @@ -# MoNanas/Design - -## Overview - -MoNanas enables users to compose their data execution flow through -configuration. Each part of the configuration describes how MoNanas should -handle the data. - -![Tags](images/tags.png) - -The needs for processing data from heterogeneous sources and a way to describe -the execution declaratively (i.e. how data flow and get processed) are -increasing. An implicit cause is the requirement to get a better insight by -utilizing the enormous amount of data we have. By taking several concepts -required to achieve that, MoNanas aims to be an statistical/analytic framework -for processing data from arbitrary sources with Monasca being the core user -to makes sense out of alerts data generated or coming into the system. - -### Functional Requirements - -To understand the design principle of MoNanas, first we need to understand what -the functional requirements are. - -* A machine learning framework that ingests events/data from arbitrary sources -(single or multiple, homogeneous or heterogeneous), processes it and persists -into arbitrary data sinks. -* Composable components for events/data processing through configurations, -where additional machine learning algorithms can be easily integrated. For -example, a stream of events can be aggregated using a causality graph and -motif comparisons. -* An easy to use API for controlling and manipulating events/data streams as -well as querying for processed data. - -> #### Additional Requirements -> * Built on open-source technologies. - -## MoNanas Components - -![MoNanas Architecture](images/architecture.png) - -The diagram above illustrates MoNanas architecture with the following -components. - -### Data Sources -A data source in MoNanas refers to the source of information including alerts, -raw events or any other data that can be pushed or pulled into the system. -This can be a streaming source or readily available data available for -accessing. MoNanas provides a few commonly used connectors including Kafka. -Since MoNanas uses Spark, any sources provided by Spark can be easily utilized -in MoNanas as well. - -### Data Ingestors -Machine learning algorithms may not be implemented in such a way that it can -use data with arbitrary format as inputs. Therefore, an ingestor is required -for a specific type to convert the data into a common format, in this case, -numpy array, which can be understood by the SML functions. We provide each data -ingestor for each source available in MoNanas. - -### Data Aggregators -Currently, MoNanas supports only one aggregator (`default_aggregator`). Its -responsibility is to aggregate data from different streams (from ingestors). -However, the support for multiple aggregators and multilayered aggregations -can be easily developed in the future. - -### Statistical/Machine Learning (SML) Functions -An SML function may be a single machine learning algorithm or a specifically -composed sequence of algorithms that consumes numpy arrays and processes the -data to extract insights. Few SML functions are readily available for use -including LiNGAM and LibPGM for finding causality structures. - -### Voters -In case where multiple SML functions are used in the orchestration of the -SML flow, voters are used to determine which outcome(s) of the SML functions -are used to process the data streamed from sources/ingestors. MoNanas's default -voter is `pick` where the user simply indicate the index of the SML function -that finishes the learning process. - -### Live Data Processors -A live data processor is optional in the data execution pipeline. It takes the -outcome of a voted SML function and uses it to process the data coming from sources -or ingestors. - -### Data Sinks -In MoNanas, data sinks are not necessarily persistent storage. For example, we -can push processed data back to Kafka with a different topic for Monasca or -Vitrage consumption. Any type of data can be pushed to data sink including raw -data, ingested data, processed data and outcomes of the SML functions. - -## Statistical/Machine-Learning Algorithms -Statistical/Machine Learning (SML) algorithms are used to gain insights of -data ingested into MoNanas. It can be an arbitrary algorithm, a simple filter -or a composition of multiple algorithms (run in sequence, in parallel or a -combination of both) as long as it satisfies the data processing requirement. -The outputs of these algorithms are then discarded, aggregated or utilized, -usually by one or more live data processors to process the raw or ingested -data. - -## Data Flow Composition -Data flow composition is a essential concept in MoNanas. It allows users to -compose a data flow and execution arbitrarily based on available components as -long as the composition is valid i.e. the connections defined by the -composition are all valid. For example, connecting a source to a voter -directly is invalid but connecting a source to a live data processor or an -ingestor is valid. Each component used in the composition can be one of many -provided by MoNanas or one of the custom developed components. Diagrams of -example compositions can be found in [MoNanas/Examples](examples.md). diff --git a/doc/dev_guide.md b/doc/dev_guide.md deleted file mode 100644 index a0c0552..0000000 --- a/doc/dev_guide.md +++ /dev/null @@ -1,89 +0,0 @@ - - -# MoNanas/DevGuide - -## Development Environment - -MoNanas's repository comes with a Vagrantfile for a quick deployment on the -client system. To use vagrant, simple do the following. - -* Install [vagrant](https://www.vagrantup.com/) on your local machine. -* Clone the project from https://github.hpe.com/labs/monanas/. -* From `$MONANAS_HOME`, run `vagrant up && vagrant ssh`. This will set up a VM -using VMWare or VirtualBox and ssh onto it. Once you have logged into the -instance, following the guideline provided in -[MoNanas/GettingStarted](getting_started.md). - -At the root of the project there is a `Makefile` which provides common tasks: - -* `make test`: Run the test suite. -* `make style`: Check for pep8 compliance on the entire code base. -* `make testspec ` A handy way to test only a - `TestCase` subclass. -* `make all`: Run both `test` and `style`. -* `make start`: Start Monanas and send the `start_streaming` action via the - REST interface. - -## Adding Custom Components - -As illustrated in [Monasca/Design](design.md), MoNanas's architecture was -designed to be pluggable. Therefore, integrating a new component or a new -statistical/machine learning algorithm is very simple. The following shows a -step-by-step guide on how to add a new data source and a new learning -algorithm. A custom implementation of other components can be added in similar -fashion. - -### Add New Data Sources - -When creating a new data source, everything you need is located in `main/source` package, and new sources should be contained in that package in order to keep the convention. All you need to do is extend the class `BaseSource` in `main/source/base.py` module. - -#### Default configuration and Validation -The first step in the Data Source life-cycle is its creation and configuration validation. Also, a default configuration is needed by DSL in order to add a component to the configuration, and it can be very convenient for users to have a default configuration. Please, implement the following methods: - -* `validate_config` -It should validate the schema of the configuration passed as parameter, checking that expected parameters are there, and values have the expected type and/or values. Please, check other classes validate_config implementations in order to have examples on how to use the Schema library. Please, make this method static by annotating it with the @staticmethod decorator. - -* `get_default_config` -It should return a dictionary containing the default schema of this component. This method will be called by DSL when creating a component of this type. Please, make this method static by annotating it with the @staticmethod decorator. - -#### Main logic functions -The aim of a source class is to provide data which will then be consumed by ingestors. When MoNanas is ordered to start streaming data, the source classes will be asked to create a stream of data, and other components in the pipeline may be interested in the features of the data provided by the source class. - -* `create_dstream` -It should create a spark dstream using the Spark Streaming Context passed as parameter. Please, refer to spark documentation if you want more details about dstream object, and feel free to view implementations of this function by other source classes. - -* `get_feature_list` -It should return a list of strings in order representing the features provided by the dstream. - -#### Termination functions -When MoNanas is ordered to stop streaming data, it will call terminate_source in all the sources that are streaming. - -* `terminate_source` -It should do any necessary cleanup of the source when it is terminated. For example, if the source was running a TCP server generating traffic, at this point it may want to stop it. - - -### Add New Learning Algorithms -When adding a new algorithm, everything you need is located in: -`main/sml` package, and new algorithms should be contained in that package in order to keep the convention. All you need to do is extend the class `BaseSML` in `main/sml/base.py` module. - -#### Default configuration and Validation -Please, refer to the 'Add New Data Sources' section. - -#### Main logic functions -The aim of a SML class is to train a machine learning algorithm, or do statistics to learn something, using a batch of data provided by the aggregator. When data is available, it will be manipulated by the logic implemented in the learn_structure function; the data flow will be stopped by MoNanas when all the SMLs have consumed at least the number of samples provided by the number_of_samples_required function. - -* `learn_structure` -This is the function that implements the logic of the algorithm. The data is provided as a parameter, and it should return the structure learned from the data (e.g. causality matrix, or trained classifier object). - -* `number_of_samples_required` -this function should return the number of samples that the algorithm requires in order to provide reliable results. - -## Coding Standards -Python: All Python code conforms to the OpenStack standards at: -https://docs.openstack.org/hacking/latest/ - -* Developers must add unit tests for all logical components before merging to -master. -* Pull Requests are welcome and encouraged to ensure good code quality. Label -the PR as `ready for review` when all the features are completed. - diff --git a/doc/examples.md b/doc/examples.md deleted file mode 100644 index 8235c54..0000000 --- a/doc/examples.md +++ /dev/null @@ -1,556 +0,0 @@ -# Examples -This section shows a step-by-step guide for running examples using MoNanas. - -## Alert Fatigue Management -When there are too many alerts, devops become less productive due to alert -fatigue. Using MoNanas helps devops to focus on only what matters, in many -cases, "the root causes" of those alerts. This example shows how MoNanas -ingests alerts, aggregates them based on LiNGAM, a non-gaussian methods for -estimating causal structures, and pushes aggregated alerts back to a Kafka -server. - -![Alert Fatigue Pipeline](images/alert_fatigue_pipeline.png) - -The diagram above shows a simple data execution pipeline for consuming alerts -from Kafka server used by Monasca for messaging. However, to demonstrate this -scenario without integrating into a production environment, we use a Markov -Chain process to generate alerts (as illustrated in the diagram below) similar -to that would have been pushed to the queue by Monasca. - -![Alert Fatigue Pipeline with Markov Chain Process](images/alert_fatigue_pipeline_with_markov.png) - -### Running the Example -To test this example, perform the following steps. - -#### Configuration File -Before running MoNanas, we need to create a configuration file describing how -we want MoNanas to orchestrate the data execution (creating a pipeline). You can find the following configuration in `$MONANAS_HOME/config/markov_source_config.json`: - - -```json -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "CloudMarkovChainSource", - "params": { - "server_sleep_in_seconds": 0.01 - }, - "transitions": { - "web_service": { - "run=>slow": { - "0": 0.001, - "8": 0.02, - "12": 0.07, - "14": 0.07, - "22": 0.03, - "24": 0.001 - }, - "slow=>run": { - "0": 0.99, - "8": 0.7, - "12": 0.1, - "14": 0.1, - "22": 0.8, - "24": 0.99 - }, - "stop=>run": 0.7 - }, - "host": { - "on=>off": 0.005, - "off=>on": 0.5 - }, - "switch": { - "on=>off": 0.01, - "off=>on": 0.7 - } - }, - "triggers": { - "support": { - "get_called": { - "0": 0.1, - "8": 0.2, - "12": 0.8, - "14": 0.8, - "22": 0.5, - "24": 0.0 - } - } - }, - "graph": { - "h1:host": ["s1"], - "h2:host": ["s1"], - "s1:switch": [], - "w1:web_service": ["h1"], - "w2:web_service": ["h2"] - } - - } - }, - "ingestors": { - "ing1": { - "module": "CloudIngestor" - } - }, - "smls": { - "sml1": { - "module": "LiNGAM", - "params": { - "threshold": 0.5 - } - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "params": { - "index": 0 - } - } - }, - "sinks": { - "snk1": { - "module": "KafkaSink", - "params": { - "host": "localhost", - "port": 9092, - "topic": "transformed_alerts" - } - } - }, - "ldps": { - "ldp1": { - "module": "CloudCausalityLDP" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "sml1": ["vot1"], - "ing1": [], - "vot1": ["ldp1"], - "ldp1": ["snk1"], - "snk1": [] - }, - "feedback": {} -} -``` - -The flow of data execution is defined in `connections`. In this case, data -are ingested from `src1` where Monasca-like alerts are being generated -using Markov Chain process. The data are then ingested by `ing1` where -each entry is converted into a format suitable for machine learning algorithm. -MoNanas uses `numpy.array` as a standard format. Typically, an aggregator is -responsible for aggregating data from different ingestors but in this scenario, -there is only one ingestor, hence the implicit aggregator (not defined in the -configuration) simply forwards the data to `sml1`, which simply deduplicates -the data then uses LiNGAM algorithm to find a causality structure of the -aggregated data then passes the result (structure) to `vot1`. The voter is -configured to pick the output of the first SML function and forwards that to -`ldp1`. Here, the live data processor transforms data streamed from `src1` -using the causality structure and pushes it to standard output as well as the -specified Kafka server. - -#### Run MoNanas -As the sink of this orchestration is Kafka, we need to run Apache Zookeeper -and Apache Kafka first. - -```bash -$KAFKA_HOME/bin/zookeeper-server-start.sh \ - $KAFKA_HOME/config/zookeeper.properties - -$KAFKA_HOME/bin/kafka-server-start.sh \ - $KAFKA_HOME/config/server.properties -``` - -After that, start MoNanas as follows. - -```bash -python $MONANAS_HOME/run.py -p $SPARK_HOME -c $MONANAS_HOME/config/markov_source_config.json \ - -l $MONANAS_HOME/config/logging.json -``` - -A default logging configuration file is located in `$MONANAS_HOME/config`. -Users can override this option. Currently, `-l` option is mandatory as MoNanas -does not assume a default configuration. - -#### Start Data Execution -MoNanas exposes REST API for controlling the data execution. Use any HTTP -client to POST with the following request body to MoNanas server to start -data streaming. - -```json -{ - "action": "start_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "start_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Results -The sinks for the transformed (processed) alerts defined in the configuration -are via standard output and Kafka server. Therefore, the output will be -displayed in the console. Alternatively, users can subscribe to a queue -with the topic `transformed_alerts` using any Kafka client. A result example -(live data processing with aggregation mode based on causality structure) found -by LiNGAM algorithm is shown below. - -```json -{ - "alarm_id": "219e65b8-395a-4588-a792-799fdbeef455", - "id": "1452900361688", - "metrics": [ - "..." - ], - "new_state": "OK", - "old_state": "UNDETERMINED", - "reason": "The alarm threshold(s) have not been exceeded.", - "reason_data": "{}", - "sub_alarms": [ - "..." - ], - "timestamp": "2016-01-15T23:26:01.688Z", - "__monanas__": { - "causes": [ - "9b0129fa-7869-4436-8319-68bfa8bc88a1", - "3f4b2651-41f5-4f2a-8093-e9ad8cd5b7bf" - ] - } -} -``` - -The alert shown above has been annotated with MoNanas's specific metadata, -`__monanas__`. In this case where the mode of live data processing is -`aggregation`, IDs of the alerts caused by this one are added onto a list, -`causes`. - -> Note: The underlying causality structure is a directed acyclic graph. - -In contrast, if the `filter` mode is used, the result format would be identical to -the source input format. So you can typically use it anywhere in existing data -flow. In this mode, only root cause alerts are preserved. A result example -under this mode is shown below. - -## Disk Failure prediction using SMART data - -Hard disk drives (HDDs) are most fragile part of systems and consequences of disk failures can be difficult to recover, or even unrecoverable. -To ensure the reliability and stability of systems, it is crucial to monitor the working conditions of HDDs in real time and detect soon-to-fail HDDs by sensors. - -This example shows how MoNanas ingests SMART (self-monitoring and repair technology) data, trains a classification algorithm(Random forest), and then uses the trained algorithm to detect the likelihood failure of the HDDs. - -To train the model, we use publically available [SMART dataset](https://www.backblaze.com/b2/hard-drive-test-data.html), which is collected in the Backblaze data center. Backblaze run tens of thousands hard drives from 2013 and representing the largest public SMART dataset. - -### Running the Example -To test this example, perform the following steps. - -#### Configuration File -Before running MoNanas, we need to create a configuration file describing how -we want MoNanas to orchestrate the data execution (creating a pipeline). You can find the following configuration in `$MONANAS_HOME/config/smart.json`: - - - - -```json -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "SmartFile", - "params": { - "dir": "/var/tmp/source_data/" - } - } - }, - "ingestors": { - "ing1": { - "module": "SmartIngestor" - } - }, - "smls": { - "sml1": { - "module": "RandomForestClassifier", - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "index": 0 - } - }, - "sinks": { - "snk3": { - "module": "KafkaSink", - "host": "127.0.0.1", - "port": 9092, - "topic": "my_topic" - }, - "snk2": { - "module": "StdoutSink" - } - }, - "ldps": { - "ldp1": { - "module": "Smart" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "ing1": [], - "sml1": ["vot1"], - "vot1": ["ldp1"], - "ldp1": ["snk1", "snk2"], - "snk1": [], - "snk2": [], - "snk3": [] - }, - "feedback": {} -} -``` - - -The flow of data execution is defined in `connections`. In this case, data -are ingested from `src1` where smart data with csv format smart-data are being generated -using open dataxxxx. The data are then ingested by `ing1` where -each entry is converted into a format suitable for machine learning algorithm. -MoNanas uses `numpy.array` as a standard format. Typically, an aggregator is -responsible for aggregating data from different ingestors but in this scenario, -there is only one ingestor, hence the implicit aggregator (not defined in the -configuration) simply forwards the data to `sml1`, which uses Random Forest algorithm - to find the disk failures then passes the result to `vot1`. - -The voter is configured to pick the output of the first SML function and -forwards that to `ldp1`. Here, the live data processor transforms data streamed from `src1` -using prediction result and pushes it to standard output as well as thespecified Kafka server. - -#### Run MoNanas -Start MoNanas as follows: - - -```bash -python $MONANAS_HOME/run.py -p $SPARK_HOME -c $MONANAS_HOME/config/iptables_anomalies.json \ - -l $MONANAS_HOME/config/logging.json -``` -If you want to run your own configuration you will need to change the value of the -c parameter. - -#### Start Data Execution -MoNanas exposes a REST API for controlling the data execution. Use any HTTP -client to POST with the following request body to MoNanas server (running on your localhost, at port 3000 by default) to start data streaming. - - -```json -{ - "action": "start_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. - -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "start_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Stop Data Execution -When you want to stop the example, you can send another HTTP POST to order MoNanas to stop streaming data. In this case, the request body should be: - - -```json -{ - "action": "stop_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. - -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "stop_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Results - - -The sinks for the transformed (processed) alerts defined in the configuration are via standard output and Kafka server. -Therefore, if the hard drive failure is predicted, the output will be displayed in the console. Alternatively, users can subscribe to a queue with the topic "my_topic" using any Kafka client. - -A result example is shown below. The value of the `DiskFailure` is identifier specified in input, so you can change the value as you like, as long as it's constant and unique across all data. - -```json -{ -"DiskFailure": "ST3000DM001_disk001" -} -``` - - - - -## Anomalies in Rule Firing Patterns - -Some attacks can be recognized by patterns of rules being triggered in an anomalous fashion. For example, a Ping flood, a denial of service attack that consist in sending multiple pings to a system, would trigger IPTable rules handling the Ping much more often than if the system is not being attacked. - -This example shows how MoNanas ingests iptables firing data, trains an anomaly detection algorithm (SVM One Class), and then uses the trained algorithm to detect when the system is being attacked, which is detected as an anomaly. Finally the data is stored in a SQLite database via the SQLite sink. - -![IPTables Anomaly Detection Pipeline](images/iptables_arch.png) - -The diagram above shows a simple data execution pipeline for generating and consuming IPTables triggering data. The source is a TCP server that generates mock data, triggering IPTables according to the logic provided by this Markov Chain: - -![IPTables Markov Chain Source](images/iptables_src.png) - -As you can see, there are 3 states: `stopped`, `normal`, and `attack`. Each transition marked in the diagram can happen with some probability each time period: we made sure that the system stays in `normal` state most of the time. -The system triggers 12 possible IPTables, classified in four families: `ssh`, `concrete IPs`, `http`, and `ping` with different probabilities according to the state of the system, in order to model possible ping flood attacks: - -1) State `stopped`: nothing is triggered -2) State `normal`: higher probability for http traffic, but some of the other rules will be triggered. -3) State `attack`: very high probability of triggering `ping` traffic in every timestamp, keeping the rest of probabilities as they were in `normal` state. - -The ingestor consumes data from the markov chain IPTable source, and counts the number of times that an IPTable of each family has been triggered in every time window, generating a 4D array per time window (one dimension per IPTable type). - -The SML block is an anomaly detection algorithm which is based in SVM (Support Vector Machines). In the first phase of MoNanas execution, it trains the classifier, learning the border in the space of arrays generated by the ingestor between anomalies and non-anomalies. - -After the pick voter selects the only available SML, the LDP module is ready to find anomalies in real time in phase 2. It uses the feature names returned by the IPTables Markov chain source class, which are the IPTable type represented in each position of the arrays. When new data of triggered IPTables arrive to the IPTables LDP, it is classified as anomaly or non-anomaly, and the dstream is modified with this information. - -Finally the SQLite sink saves the classified data to a SQLite database. - -### Running the Example -To test this example, perform the following steps. - -#### Configuration File -Before running MoNanas, we need to create a configuration file describing how -we want MoNanas to orchestrate the data execution (creating a pipeline). You can find the following configuration in `$MONANAS_HOME/config/iptables_anomalies.json`: - -```json -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "IPTablesSource", - "params": { - "server_sleep_in_seconds": 0.01 - } - } - }, - "ingestors": { - "ing1": { - "module": "IptablesIngestor" - } - }, - "smls": { - "sml1": { - "module": "SvmOneClass" - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "params": { - "index": 0 - } - } - }, - "sinks": { - "snk1": { - "module": "IptablesSQLiteSink" - }, - "snk2": { - "module": "StdoutSink" - } - }, - "ldps": { - "ldp1": { - "module": "IptablesLDP" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "ing1": [], - "sml1": ["vot1"], - "vot1": ["ldp1"], - "ldp1": ["snk1", "snk2"], - "snk1": [], - "snk2": [] - }, - "feedback": {} -} -``` - -The flow of data execution is defined in `connections`, with the origin being the keys of the dictionary, and the destinations are each element of the list associated to each origin. -As you can see, the flow described in the previous section is mapped to the configuration, except for the ingestor, which is not explicitly connected; the reason for this is that all ingestors are connected to the aggregator, which is connected to all SMLs, so no explicit connection needs to be defined. - -#### Run MoNanas -Start MoNanas as follows: - -```bash -python $MONANAS_HOME/run.py -p $SPARK_HOME -c $MONANAS_HOME/config/iptables_anomalies.json \ - -l $MONANAS_HOME/config/logging.json -``` -If you want to run your own configuration you will need to change the value of the -c parameter. - -#### Start Data Execution -MoNanas exposes a REST API for controlling the data execution. Use any HTTP -client to POST with the following request body to MoNanas server (running on your localhost, at port 3000 by default) to start data streaming. - -```json -{ - "action": "start_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "start_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Stop Data Execution -When you want to stop the example, you can send another HTTP POST to order MoNanas to stop streaming data. In this case, the request body should be: - -```json -{ - "action": "stop_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "stop_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Results -By default, the pre-selected logging level defined in `$MONANAS_HOME/config/logging.json` lets you see relevant information in the screen during this execution of this example. -The classified data generated by the LDP module is saved in a SQLite database located by default in `sqlite_sink.db` file; please feel free to inspect the database to see what was classified as anomaly and what was classified as normal traffic. diff --git a/doc/getting_started.md b/doc/getting_started.md deleted file mode 100644 index fcfbea9..0000000 --- a/doc/getting_started.md +++ /dev/null @@ -1,68 +0,0 @@ -# MoNanas/GettingStarted - -This section serves as a user guide and helps you to get started with MoNanas. -For developer guide, see: [MoNanas/DevGuide](dev_guide.md). - -> Note: `$XXX_HOME` indicates the root directory where the corresponding -project resides. For example, `$KAFKA_HOME` refers to where Kafka's source -files have been extracted to. - -## Pre-requisites - -* Python (>= v.2.7.6) -* Apache Spark (>= v.1.6.1) -* Apache Kafka (>= v.0.8.2.1) - this comes with Apache Zookeeper. -* Vagrant (for development environment or testing MoNanas only). - -> Note: Newer versions of these software/tools should be compatible, but are -not tested so nothing is guaranteed. - -## Installation - -* Clone MoNanas repo: https://github.com/openstack/monasca-analytics - -### Everything on Host - -The easiest way to install everything on a physical host is through our -provided script, `fetch-deps.sh` located in `$MONANAS_HOME`. - -### Everything on VM - -MoNanas comes with a Vagrantfile for quick deployment. For more information, -see: [MoNanas/DevGuide](dev_guide.md). - -## Usage - -* Start Apache ZooKeeper1 -```bash -$KAFKA_HOME/bin/zookeeper-server-start.sh \ - $KAFKA_HOME/config/zookeeper.properties -``` -* Start Apache Kafka1 -```bash -$KAFKA_HOME/bin/kafka-server-start.sh \ - $KAFKA_HOME/config/server.properties -``` -* Start MoNanas with your configuration -```bash -python $MONANAS_HOME/run.py -p $SPARK_HOME -c \ - -l -``` -e.g. -```bash -python $HOME/monanas/run.py -p $HOME/spark -c $HOME/monanas/config/config.json \ - -l $HOME/monanas/config/logging.json -``` - -> Note: -1. Only when `KafkaSource` or `KafkaSink` is used in your processes. - -## Configurations -MoNanas consumes two configuration files, one for orchestrating data execution -and the other for logging. A Domain Specific Language (DSL) has been implemented in order to manipulate configurations. -Please, see [MoNanas/Configuration](configuration.md) for more details on MoNanas configuration; -and [MoNanas/Banana](banana.md) for more details on `banana` the language to write recipes. - -## Examples - -To run examples and see how MoNanas works step-by-step, see: [MoNanas/Examples](examples.md) diff --git a/doc/images/alert_fatigue_pipeline.png b/doc/images/alert_fatigue_pipeline.png deleted file mode 100644 index a9eea10d83753cfb958a127ea2dc731f32187e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31280 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 diff --git a/doc/images/architecture.png b/doc/images/architecture.png deleted file mode 100644 index 2a2746367985e86d2376c6032a2432b03ed99faf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87129 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%0D#KTc&@b)=r%YFLfL%pOpWK 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 diff --git a/doc/images/disk_failure_prediction_with_data.png b/doc/images/disk_failure_prediction_with_data.png deleted file mode 100644 index f36249c208c3acba53b8e3af21f9ca3505f7987b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123015 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 DW-Npp diff --git a/doc/images/iptables_arch.png b/doc/images/iptables_arch.png deleted file mode 100755 index 629418ff943a2965dd347c67262575a0c476cf45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15140 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 diff --git a/doc/images/iptables_src.png b/doc/images/iptables_src.png deleted file mode 100755 index 6369c836c3c831382b04c38a3f456f76dc99c6fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21478 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 DIFea? diff --git a/doc/images/monanas-logo.png b/doc/images/monanas-logo.png deleted file mode 100644 index 35c918dda8033ece592baca87ad6fd364e04248d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18016 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 Ay#N3J diff --git a/doc/images/save_long_investigation_works.png b/doc/images/save_long_investigation_works.png deleted file mode 100644 index 1c8892dba2e9e311e0983281480f2b4370c2abfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117366 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%0A?W>G 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

6xD-7F0S#?y3!XiPzEtTfd3S`9G#Q-TjNcUb`B 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 X$~3 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

HjBRAdJ{)}ZH@7gk=WW0HW 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%0D{mfkUc{4a_I44uN85DlQ&6 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

9VtnlAoX(J)Bs)wQ$d2*O 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 lMiXvfKL{DkLP-gMXic0 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�@KZp^dFP4C>%JG#%a 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 diff --git a/doc/monasca.md b/doc/monasca.md deleted file mode 100644 index ad48e51..0000000 --- a/doc/monasca.md +++ /dev/null @@ -1,213 +0,0 @@ -# Integrate with Monasca -This section shows a step-by-step guide for integration MoNanas with Monasca. - -## Alarm management - -For example, let's say you have a some cloud system built on OpenStack, -and all services have been monitored by Monasca. - -Operators got tons of alarms when a trouble happened -even if there is actual trouble in one service. - -![Got tons of alarms](images/got_tons_of_alarms.png) - -Integrating MoNanas and Monasca eliminates unnecessary alarms. -And save the operator from long investigation works! - -![Save long investigation works](images/save_long_investigation_works.png) - - -### Running the MoNanas -To manage alarms from Monasca, perform the following steps. - - -#### Alarm Definition in Monasca. - -Refer to [Monanas API](https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md). - -#### Configuration File in MoNanas - -Before running MoNanas, we need to create a configuration file describing how -we want MoNanas to orchestrate the data execution (creating a pipeline). - -You can edit configuration in `$MONANAS_HOME/config/markov_source_config.json` like the following. - -```json -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": false - }, - "sources": { - "src1": { - "module": "TextFileSource", - "params": { - "dir": "/tmp/source_data" - }, - "features": [ - "api_response.time.5sec.cinder1", - "api_response.time.5sec.cinder2", - "api_response.time.5sec.heat1", - "api_response.time.5sec.heat2", - "api_response.time.5sec.keystone1", - "api_response.time.5sec.keystone2", - "api_response.time.5sec.neutron1", - "api_response.time.5sec.neutron2", - "api_response.time.5sec.nova1", - "api_response.time.5sec.nova2" - ] - } - }, - "ingestors": { - "ing1": { - "module": "CloudIngestor" - } - }, - "smls": { - "sml1": { - "module": "LiNGAM", - "threshold": 0.5 - } - }, - "voters": { - "vot1": { - "module": "PickIndexVoter", - "index": 0 - } - }, - "sinks": { - "snk1": { - "module": "FileSink2", - "params": { - "dir": "/var/tmp/result/markov", - "file_prefix": "result" - } - }, - "snk2": { - "module": "StdoutSink" - } - }, - "ldps": { - "ldp1": { - "module": "CloudCausalityLDP" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "sml1": ["vot1"], - "ing1": [], - "vot1": ["ldp1"], - "ldp1": ["snk1"], - "snk1": [], - "snk2": [] - }, - "feedback": {} -} -``` - -The flow of data execution is defined in `connections`. In this case, data -are ingested from `src1`. The data are then ingested by `ing1` where -each entry is converted into a format suitable for machine learning algorithm. -MoNanas uses `numpy.array` as a standard format. Typically, an aggregator is -responsible for aggregating data from different ingestors but in this scenario, -there is only one ingestor, hence the implicit aggregator (not defined in the -configuration) simply forwards the data to `sml1`, which simply deduplicates -the data then uses LiNGAM algorithm to find a causality structure of the -aggregated data then passes the result (structure) to `vot1`. The voter is -configured to pick the output of the first SML function and forwards that to -`ldp1`. Here, the live data processor transforms data streamed from `src1` -using the causality structure and pushes it to standard output as well as the -specified Kafka server. - -#### Run MoNanas - -As the sink of this orchestration is Kafka, we need to run Apache Zookeeper -and Apache Kafka first. - -```bash -$KAFKA_HOME/bin/zookeeper-server-start.sh \ - $KAFKA_HOME/config/zookeeper.properties - -$KAFKA_HOME/bin/kafka-server-start.sh \ - $KAFKA_HOME/config/server.properties -``` - -After that, start MoNanas as follows. - -```bash -python $MONANAS_HOME/run.py -p $SPARK_HOME -c $MONANAS_HOME/config/markov_source_config.json \ - -l $MONANAS_HOME/config/logging.json -``` - -A default logging configuration file is located in `$MONANAS_HOME/config`. -Users can override this option. Currently, `-l` option is mandatory as MoNanas -does not assume a default configuration. - -#### Start Data Execution - -MoNanas exposes REST API for controlling the data execution. Use any HTTP -client to POST with the following request body to MoNanas server to start -data streaming. - -```json -{ - "action": "start_streaming" -} -``` -e.g. using curl from terminal to make a request assuming the server is running -locally. -```bash -curl -H "Content-Type: application/json" -X POST \ - -d '{"action": "start_streaming"}' \ - http://localhost:3000/api/v1/actions -``` - -#### Results - -The sinks for the transformed (processed) alerts defined in the configuration -are via standard output and Kafka server. Therefore, the output will be -displayed in the console. Alternatively, users can subscribe to a queue -with the topic `transformed_alerts` using any Kafka client. A result example -(live data processing with aggregation mode based on causality structure) found -by LiNGAM algorithm is shown below. - -```json -{ - "alarm": { - "state": "ALARM", - "alarm_definition": { - "name": "api_response.time.5sec.nova2" - } - }, - "__monanas__": - [ - { - "causes": [ - "api_response.time.5sec.neutron2", - "api_response.time.5sec.cinder1", - "api_response.time.5sec.nova1", - "api_response.time.5sec.keystone1", - "api_response.time.5sec.keystone2" - ] - }, - { - "results": [ - "api_response.time.5sec.cinder2", - "api_response.time.5sec.heat1", - "api_response.time.5sec.heat2", - "api_response.time.5sec.nova1", - "api_response.time.5sec.neutron1", - "api_response.time.5sec.keystone1" - ] - } - ] -} -``` - - diff --git a/doc/use_cases.md b/doc/use_cases.md deleted file mode 100644 index 6134a25..0000000 --- a/doc/use_cases.md +++ /dev/null @@ -1,20 +0,0 @@ -# Example Use Cases - -Below are few use cases that are relevant to OpenStack. However, MoNanas -enables you to add your own [data ingestors](doc/dev_guide.md#ingestors). - -| Example | Alert Fatigue Management | Anomaly Detection | -|:------------------------------|:-------------------------|:------------------| -| **Dataset** | Synthetic, but representative, set of Monasca alerts that are processed in a stream manner. This alert set represents alerts that are seen in a data center consisting of several racks, enclosures and nodes. | `iptables` rules together with the number of times they are fired in a time period. | -| **Parsing** | Monasca alert parser. | Simple parser extracting period and number of fire events per rule. | -| **SML algorithm flow** | `filter(bad_formatted) -> filter(duplicates) -> aggregate() >> aggregator` aggregation can utilize conditional independence causality, score-based causality, linear algebra causality. | `detect_anomaly() >> aggregator` anomaly detection could be based on SVM, trend, etc. | -| **Output** | Directed acyclic alert graph with potential root causes at the top. | Rule set with an anomalous number of firing times in a time period. | -| **:information_source: Note** | Even though this could be consumed directly by devops, the usage of [Vitrage MoNanas Sink](doc/getting_started.md#vitrage_sink) is recommended. The output of this module can speed up creation of a [Vitrage](https://wiki.openstack.org/wiki/Vitrage) entity graph to do further analysis on it. | None. | - -`->` indicates a sequential operation in the flow. - -`//` indicates beginning of group of operations running in parallel. - -`-` indicates operations running in parallel. - -`>>` indicates end of group of operations running in parallel. diff --git a/fetch-deps.sh b/fetch-deps.sh deleted file mode 100644 index 300e123..0000000 --- a/fetch-deps.sh +++ /dev/null @@ -1,92 +0,0 @@ -# This file is intended to be used by vagrant only. -if [ "$VAGRANT_ENV" ]; then - - # Create a temporary folder - mkdir ~/tmp - cd ~/tmp - - # Java 8 - sudo -E apt-get update - sudo -E apt-get -y install openjdk-7-jre-headless openjdk-7-jdk - - # Maven - curl ftp://mirror.reverse.net/pub/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz > mvn.tar.gz - tar -xzf mvn.tar.gz - sudo mv apache-maven-3.3.9 /usr/local/apache-maven-3.3.9 - echo 'export PATH=/usr/local/apache-maven-3.3.9/bin:$PATH' >> $HOME/.profile - source $HOME/.profile - mkdir ~/.m2 - LENGTH_FOR_HOST=`expr match "$HTTP_PROXY" 'http://[\.A-Za-z\-]*'`-7 - echo ' - - - '" - true - http - ${HTTP_PROXY:7:$LENGTH_FOR_HOST} - 8080 - localhost - - " > ~/.m2/settings.xml - - - # Scala - curl https://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.deb > scala.deb - sudo dpkg -i scala.deb - - # Scala build tool - echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list - sudo -E apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823 - sudo -E apt-get update - sudo -E apt-get -y install sbt - - # Spark - curl http://apache.claz.org/spark/spark-1.6.1/spark-1.6.1.tgz > spark.tgz - echo "-------------------------" - echo "unzip spark to ~/spark" - mkdir ~/spark/ - tar -xzf spark.tgz - mv spark-1.6.1/ ~/spark/spark-1.6.1 - cd ~/spark/spark-1.6.1 - mvn -DskipTests clean package - cd ~/tmp - # config for logging in spark - cp ~/spark/spark-1.6.1/conf/log4j.properties.template ~/spark/spark-1.6.1/conf/log4j.properties - sed -i 's/log4j.rootCategory=INFO/log4j.rootCategory=ERROR/g' ~/spark/spark-1.6.1/conf/log4j.properties - - # Kafka - mkdir ~/kafka - curl http://apache.arvixe.com/kafka/0.9.0.0/kafka_2.11-0.9.0.0.tgz > kafka.tgz - echo "-------------------------" - echo "unzip kafka to ~/kafka" - tar -xzf kafka.tgz -C ~/kafka - mv ~/kafka/kafka_2.11-0.9.0.0/* ~/kafka - rm -r ~/kafka/kafka_2.11-0.9.0.0 - - # Python dependencies - sudo -E apt-get -y install python-pip python-setuptools - sudo -E pip install pep8 - - # Remove temporary folder - echo "-------------------------" - echo "Removing temporary folder" - rm -r ~/tmp - - # Monanas dependencies - echo "-------------------------" - echo "Get Monanas deps" - cd /vagrant - sudo -E apt-get -y install python-numpy python-scipy ipython - sudo -E -H python setup.py develop - - # Environment setup - set -v - echo 'export SPARK_HOME=~/spark/spark-1.6.1' >> $HOME/.profile - echo 'export KAFKA_HOME=~/kafka' >> $HOME/.profile - echo 'export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH' >> $HOME/.profile - set +v - -else - echo "This file is intended to be used by a vagrant vm only." -fi diff --git a/monasca_analytics/__init__.py b/monasca_analytics/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/README.md b/monasca_analytics/banana/README.md deleted file mode 100644 index 89f2028..0000000 --- a/monasca_analytics/banana/README.md +++ /dev/null @@ -1,40 +0,0 @@ -## Banana configuration language - -This module contains everything related to Banana. In each -sub-module (sub-folder) you will find a `README.md` file -that describes: - - * Purpose of the module. - * The current status of the implementation. - * How testing is done. - -The compiler is split in passes. Each pass performs some -transformations and / or generates more data. Only the last -step has side-effects on the Monanas instance. - -Each sub-module roughly maps to one pass run by the compiler. - -### Passes - -The Banana compiler runs the following passes: - - * `parse`, parse the input and build an [AST](./grammar/README.md). - * `typeck`, type check the input. - * `deadpathck`, remove dead path in the connections. - * `eval`, evaluate the AST generated. - -Each pass makes some assumptions about the state of -the data, and in particular that the previous passes -have run successfully. While this is made obvious by -the arguments required to run some passes, it is less -so for others. - -Generally, things to remember: - - * Changing the ordering of passes is more likely to - break things. - * New passes are free to modify the AST / TypeTable. - * New passes should not break invariants. - -For more information on passes, have a look in their -specific `README.md` file. \ No newline at end of file diff --git a/monasca_analytics/banana/__init__.py b/monasca_analytics/banana/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/bytecode/__init__.py b/monasca_analytics/banana/bytecode/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/bytecode/assembler.py b/monasca_analytics/banana/bytecode/assembler.py deleted file mode 100644 index 544c4b5..0000000 --- a/monasca_analytics/banana/bytecode/assembler.py +++ /dev/null @@ -1,1030 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# This file is an adaptation of BytecodeAssembler: -# -# http://peak.telecommunity.com/DevCenter/BytecodeAssembler#toc -# -# It has been adapted to match the requirements of monasca_analytics - -import six -import sys - -from array import array -from dis import cmp_op -from dis import EXTENDED_ARG -from dis import hasfree -from dis import hasjabs -from dis import hasjrel -from dis import haslocal -from dis import hasname -from dis import HAVE_ARGUMENT -from dis import opname -from types import CodeType -from types import FunctionType - -from monasca_analytics.banana.bytecode.decorators import decorate_assignment -from monasca_analytics.banana.bytecode.symbols import Symbol - -opcode = {} -for op in range(256): - _name = opname[op] - if _name.startswith('<'): - continue - if _name.endswith('+0'): - opcode[_name[:-2]] = op - opcode[_name] = op - -# globals().update(opcode) # opcodes are now importable at will - -# Flags from code.h -CO_OPTIMIZED = 0x0001 # use LOAD/STORE_FAST instead of _NAME -CO_NEWLOCALS = 0x0002 # only cleared for module/exec code -CO_VARARGS = 0x0004 -CO_VARKEYWORDS = 0x0008 -CO_NESTED = 0x0010 # ??? -CO_GENERATOR = 0x0020 -CO_NOFREE = 0x0040 # set if no free or cell vars -CO_GENERATOR_ALLOWED = 0x1000 # unused -CO_FUTURE_DIVISION = 0x2000 -CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # Python 2.5+ only -CO_FUTURE_WITH_STATEMENT = 0x8000 # Python 2.5+ only - -# opcode -LOAD_DEREF = opcode["LOAD_DEREF"] -STORE_DEREF = opcode["STORE_DEREF"] -LOAD_FAST = opcode["LOAD_FAST"] -STORE_FAST = opcode["STORE_FAST"] -DELETE_FAST = opcode["DELETE_FAST"] -YIELD_VALUE = opcode["YIELD_VALUE"] -LOAD_CONST = opcode["LOAD_CONST"] -CALL_FUNCTION = opcode["CALL_FUNCTION"] -# CALL_FUNCTION_VAR = opcode["CALL_FUNCTION_VAR"] -CALL_FUNCTION_VAR = opcode["CALL_FUNCTION"] -CALL_FUNCTION_KW = opcode["CALL_FUNCTION_KW"] -# CALL_FUNCTION_VAR_KW = opcode["CALL_FUNCTION_VAR_KW"] -CALL_FUNCTION_VAR_KW = opcode["CALL_FUNCTION_KW"] -BUILD_TUPLE = opcode["BUILD_TUPLE"] -BUILD_LIST = opcode["BUILD_LIST"] -UNPACK_SEQUENCE = opcode["UNPACK_SEQUENCE"] -RETURN_VALUE = opcode["RETURN_VALUE"] -BUILD_SLICE = opcode["BUILD_SLICE"] -if six.PY2: - DUP_TOPX = opcode["DUP_TOPX"] -else: - # DUP_TOPX no longer in use from python3.3 - DUP_TOP_TWO = opcode["DUP_TOP_TWO"] - -RAISE_VARARGS = opcode["RAISE_VARARGS"] -MAKE_FUNCTION = opcode["MAKE_FUNCTION"] -# MAKE_CLOSURE = opcode["MAKE_CLOSURE"] -MAKE_CLOSURE = opcode["MAKE_FUNCTION"] -FOR_ITER = opcode["FOR_ITER"] -JUMP_IF_TRUE_OR_POP = opcode["JUMP_IF_TRUE_OR_POP"] -JUMP_IF_FALSE_OR_POP = opcode["JUMP_IF_FALSE_OR_POP"] -JUMP_FORWARD = opcode["JUMP_FORWARD"] -JUMP_ABSOLUTE = opcode["JUMP_ABSOLUTE"] -SETUP_EXCEPT = opcode["SETUP_EXCEPT"] -SETUP_FINALLY = opcode["SETUP_FINALLY"] -SETUP_LOOP = opcode["SETUP_LOOP"] -BREAK_LOOP = opcode["BREAK_LOOP"] -CONTINUE_LOOP = opcode["CONTINUE_LOOP"] -POP_BLOCK = opcode["POP_BLOCK"] -LIST_APPEND = opcode["LIST_APPEND"] -COMPARE_OP = opcode["COMPARE_OP"] -LOAD_NAME = opcode["LOAD_NAME"] -STORE_NAME = opcode["STORE_NAME"] -DELETE_NAME = opcode["DELETE_NAME"] - -fast_to_deref = { - LOAD_FAST: LOAD_DEREF, - STORE_FAST: STORE_DEREF, -} - -deref_to_deref = dict([(k, k) for k in hasfree]) - - -def with_name(f, name): - try: - f.__name__ = name - return f - except (TypeError, AttributeError): - return FunctionType( - f.func_code, f.func_globals, name, f.func_defaults, f.func_closure - ) - - -class Const(object): - """Wrapper to ensure constants are hashable even if mutable""" - - __slots__ = 'value', 'hash', 'hashable' - - def __init__(self, value_): - self.value = value_ - try: - self.hash = hash(value_) - except TypeError: - self.hash = hash(id(value_)) - self.hashable = False - else: - self.hashable = True - - def __repr__(self): - return "Const(%s)" % repr(self.value) - - def __hash__(self): - return self.hash - - def __eq__(self, other): - if type(other) is not Const: - return False - if self.hashable: - return self.value == other.value - else: - return self.value is other.value - - def __ne__(self, other): - return not self == other - - def __call__(self, code): - code.LOAD_CONST(self.value) - - -class Node(tuple): - """Base class for AST nodes""" - __slots__ = [] - - -def nodetype(*mixins, **kw): - - def callback(frame, name, func, old_locals): - def __new__(cls, *args, **kw): - result = func(*args, **kw) - if type(result) is tuple: - return tuple.__new__(cls, (cls,) + result) - else: - return result - - def __repr__(self): - r = self.__class__.__name__ + tuple.__repr__(self[1:]) - if len(self) == 2: - return r[:-2] + ')' # nix trailing ',' - return r - - def __call__(self, code): - return func(*(self[1:] + (code,))) - - import inspect - args = inspect.getargspec(func)[0] - - d = dict( - __new__=__new__, __repr__=__repr__, __doc__=func.__doc__, - __module__=func.__module__, __args__=args, __slots__=[], - __call__=__call__ - ) - for p, a in enumerate(args[:-1]): # skip 'code' argument - if isinstance(a, str): - d[a] = property(lambda self, p=p + 1: self[p]) - - d.update(kw) - return type(name, mixins + (Node,), d) - - return decorate_assignment(callback) - - -@nodetype() -def Local(name, code=None): - if code is None: - return name, - if name in code.co_cellvars or name in code.co_freevars: - return code.LOAD_DEREF(name) - elif code.co_flags & CO_OPTIMIZED: - return code.LOAD_FAST(name) - else: - return code.LOAD_NAME(name) - - -@nodetype() -def Getattr(ob, name, code=None): - try: - name = const_value(name) - except NotAConstant: - return Call(Const(getattr), [ob, name]) - if code is None: - return fold_args(Getattr, ob, name) - code(ob) - code.LOAD_ATTR(name) - - -@nodetype() -def Call(fn, args=(), kwargs=(), star=None, dstar=None, fold=True, code=None): - if code is None: - data = ( - fn, tuple(args), tuple(kwargs), star or (), dstar or (), fold - ) - if fold and (args or kwargs or star or dstar): - return fold_args(Call, *data) - else: - return data - - code(fn, *args) - for k, v in kwargs: - code(k, v) - - argc = len(args) - kwargc = len(kwargs) - - if star: - if dstar: - code(star, dstar) - return code.CALL_FUNCTION_VAR_KW(argc, kwargc) - else: - code(star) - return code.CALL_FUNCTION_VAR(argc, kwargc) - else: - if dstar: - code(dstar) - return code.CALL_FUNCTION_KW(argc, kwargc) - else: - return code.CALL_FUNCTION(argc, kwargc) - - -class _Pass(Symbol): - def __call__(self, code=None): - pass - - def __nonzero__(self): - return False -Pass = _Pass('Pass', __name__) - - -class NotAConstant(Exception): - """The supplied value is not a constant expression tree""" - - -def const_value(value_): - """Return the constant value -- if any -- of an expression tree - - Raises NotAConstant if the value or any child of the value are - not constants. - """ - t = type(value_) - if t is Const: - value_ = value_.value - elif t is tuple: - t = tuple(map(const_value, value_)) - if t == value_: - return value_ - return t - elif generate_types.get(t) != Code.LOAD_CONST: - raise NotAConstant(value_) - return value_ - - -def fold_args(f, *args): - """Return a folded ``Const`` or an argument tuple""" - - try: - for arg in args: - if arg is not Pass and arg is not None: - const_value(arg) - except NotAConstant: - return args - else: - c = Code() - f(*args + (c,)) - c.RETURN_VALUE() - return Const(eval(c.code())) - - -@nodetype() -def LocalAssign(name, code=None): - if code is None: - return name, - if name in code.co_cellvars or name in code.co_freevars: - return code.STORE_DEREF(name) - elif code.co_flags & CO_OPTIMIZED: - return code.STORE_FAST(name) - else: - return code.STORE_NAME(name) - - -class Code(object): - co_argcount = 0 - co_stacksize = 0 - co_flags = CO_OPTIMIZED | CO_NEWLOCALS # typical usage - co_filename = '' - co_name = '' - co_firstlineno = 0 - co_freevars = () - co_cellvars = () - _last_lineofs = 0 - _ss = 0 - _tmp_level = 0 - - def __init__(self): - self.co_code = array('B') - self.co_consts = [None] - self.co_names = [] - self.co_varnames = [] - self.co_lnotab = array('B') - self.emit = self.co_code.append - self.blocks = [] - self.stack_history = [] - - def emit_arg(self, op, arg): - emit = self.emit - if arg > 0xFFFF: - emit(EXTENDED_ARG) - emit((arg >> 16) & 255) - emit((arg >> 24) & 255) - emit(op) - emit(arg & 255) - emit((arg >> 8) & 255) - - def locals_written(self): - vn = self.co_varnames - hl = dict.fromkeys([STORE_FAST, DELETE_FAST]) - return dict.fromkeys([vn[arg] for ofs, op, arg in self if op in hl]) - - def set_lineno(self, lno): - if not self.co_firstlineno: - self.co_firstlineno = self._last_line = lno - return - - append = self.co_lnotab.append - incr_line = lno - self._last_line - incr_addr = len(self.co_code) - self._last_lineofs - if not incr_line: - return - - assert incr_addr >= 0 and incr_line >= 0 - - while incr_addr > 255: - append(255) - append(0) - incr_addr -= 255 - - while incr_line > 255: - append(incr_addr) - append(255) - incr_line -= 255 - incr_addr = 0 - - if incr_addr or incr_line: - append(incr_addr) - append(incr_line) - - self._last_line = lno - self._last_lineofs = len(self.co_code) - - def YIELD_VALUE(self): - self.stackchange(stack_effects[YIELD_VALUE]) - self.co_flags |= CO_GENERATOR - return self.emit(YIELD_VALUE) - - def LOAD_CONST(self, const): - self.stackchange(0, 1) - pos = 0 - hashable = True - try: - hash(const) - except TypeError: - hashable = False - while 1: - try: - arg = self.co_consts.index(const, pos) - it = self.co_consts[arg] - except ValueError: - arg = len(self.co_consts) - self.co_consts.append(const) - break - else: - if type(it) is type(const) and (hashable or it is const): - break - pos = arg + 1 - continue - return self.emit_arg(LOAD_CONST, arg) - - def CALL_FUNCTION(self, argc=0, kwargc=0, op=CALL_FUNCTION, extra=0): - self.stackchange(1 + argc + 2 * kwargc + extra, 1) - emit = self.emit - emit(op) - emit(argc) - emit(kwargc) - - def CALL_FUNCTION_VAR(self, argc=0, kwargc=0): - self.CALL_FUNCTION( - argc, - kwargc, - CALL_FUNCTION_VAR, - 1) # 1 for *args - - def CALL_FUNCTION_KW(self, argc=0, kwargc=0): - self.CALL_FUNCTION( - argc, - kwargc, - CALL_FUNCTION_KW, - 1) # 1 for **kw - - def CALL_FUNCTION_VAR_KW(self, argc=0, kwargc=0): - self.CALL_FUNCTION( - argc, - kwargc, - CALL_FUNCTION_VAR_KW, - 2) # 2 *args,**kw - - def BUILD_TUPLE(self, count): - self.stackchange(count, 1) - self.emit_arg(BUILD_TUPLE, count) - - def BUILD_LIST(self, count): - self.stackchange(count, 1) - self.emit_arg(BUILD_LIST, count) - - def UNPACK_SEQUENCE(self, count): - self.stackchange(1, count) - self.emit_arg(UNPACK_SEQUENCE, count) - - def RETURN_VALUE(self): - self.stackchange(1, 0) - self.emit(RETURN_VALUE) - self.stack_unknown() - - def BUILD_SLICE(self, count): - assert count in (2, 3), "Invalid number of arguments for BUILD_SLICE" - self.stackchange(count, 1) - self.emit_arg(BUILD_SLICE, count) - - if six.PY2: - def DUP_TOPX(self, count): - self.stackchange(count, count * 2) - self.emit_arg(DUP_TOPX, count) - else: - def DUP_TOP_TWO(self, count): - self.stackchange(count, count * 2) - self.emit_arg(DUP_TOP_TWO, count) - - def RAISE_VARARGS(self, argc): - assert 0 <= argc <= 3, "Invalid number of arguments for RAISE_VARARGS" - self.stackchange(argc, 0) - self.emit_arg(RAISE_VARARGS, argc) - - def MAKE_FUNCTION(self, ndefaults): - self.stackchange(1 + ndefaults, 1) - self.emit_arg(MAKE_FUNCTION, ndefaults) - - def MAKE_CLOSURE(self, ndefaults, freevars): - if sys.version >= '2.5': - freevars = 1 - self.stackchange(1 + freevars + ndefaults, 1) - self.emit_arg(MAKE_CLOSURE, ndefaults) - - def here(self): - return len(self.co_code) - - def set_stack_size(self, size): - if size < 0: - raise AssertionError("Stack underflow") - if size > self.co_stacksize: - self.co_stacksize = size - bytes = len(self.co_code) - len(self.stack_history) + 1 - if bytes > 0: - self.stack_history.extend([self._ss] * bytes) - self._ss = size - - def get_stack_size(self): - return self._ss - - stack_size = property(get_stack_size, set_stack_size) - - def stackchange(self, inputs, outputs): - if self._ss is None: - raise AssertionError("Unknown stack size at this location") - self.stack_size -= inputs # check underflow - self.stack_size += outputs # update maximum height - - def stack_unknown(self): - self._ss = None - - def branch_stack(self, location, expected): - if location >= len(self.stack_history): - if location > len(self.co_code): - raise AssertionError("Forward-looking stack prediction!", - location, len(self.co_code) - ) - actual = self.stack_size - if actual is None: - self.stack_size = actual = expected - self.stack_history[location] = actual - else: - actual = self.stack_history[location] - if actual is None: - self.stack_history[location] = actual = expected - - if actual != expected: - raise AssertionError( - "Stack level mismatch: actual=%s expected=%s" - % (actual, expected) - ) - - def jump(self, op, arg=None): - def jump_target(offset): - target = offset - if op not in hasjabs: - target = target - (posn + 3) - if target < 0: - raise AssertionError("Relative jumps can't go backwards") - if target > 0xFFFF: - target = offset - (posn + 6) - return target - - def backpatch(offset): - target = jump_target(offset) - if target > 0xFFFF: - raise AssertionError("Forward jump span must be <64K bytes") - self.patch_arg(posn, 0, target) - self.branch_stack(offset, old_level) - - if op == FOR_ITER: - old_level = self.stack_size = self.stack_size - 1 - self.stack_size += 2 - else: - old_level = self.stack_size - self.stack_size -= (op in (JUMP_IF_TRUE_OR_POP, JUMP_IF_FALSE_OR_POP)) - posn = self.here() - if arg is not None: - self.emit_arg(op, jump_target(arg)) - self.branch_stack(arg, old_level) - lbl = None - else: - self.emit_arg(op, 0) - - def lbl(code=None): - backpatch(self.here()) - if op in (JUMP_FORWARD, JUMP_ABSOLUTE, CONTINUE_LOOP): - self.stack_unknown() - return lbl - - def COMPARE_OP(self, op): - self.stackchange(2, 1) - self.emit_arg(COMPARE_OP, compares[op]) - - def setup_block(self, op): - jmp = self.jump(op) - self.blocks.append((op, self.stack_size, jmp)) - return jmp - - def SETUP_EXCEPT(self): - ss = self.stack_size - self.stack_size = ss + 3 # simulate the level at "except:" time - self.setup_block(SETUP_EXCEPT) - self.stack_size = ss # restore the current level - - def SETUP_FINALLY(self): - ss = self.stack_size - self.stack_size = ss + 3 # allow for exceptions - self.stack_size = ss + 1 # simulate the level after the None is pushed - self.setup_block(SETUP_FINALLY) - self.stack_size = ss # restore original level - - def SETUP_LOOP(self): - self.setup_block(SETUP_LOOP) - - def POP_BLOCK(self): - if not self.blocks: - raise AssertionError("Not currently in a block") - - why, level, fwd = self.blocks.pop() - self.emit(POP_BLOCK) - - if why != SETUP_LOOP: - if why == SETUP_FINALLY: - self.LOAD_CONST(None) - fwd() - else: - self.stack_size = level - 3 # stack level resets here - else_ = self.JUMP_FORWARD() - fwd() - return else_ - else: - return fwd - - if 'JUMP_IF_TRUE_OR_POP' not in opcode: - def JUMP_IF_TRUE_OR_POP(self, address=None): - lbl = self.JUMP_IF_TRUE(address) - self.POP_TOP() - return lbl - - globals()['JUMP_IF_TRUE_OR_POP'] = -1 - - if 'JUMP_IF_FALSE_OR_POP' not in opcode: - def JUMP_IF_FALSE_OR_POP(self, address=None): - lbl = self.JUMP_IF_FALSE(address) - self.POP_TOP() - return lbl - - globals()['JUMP_IF_FALSE_OR_POP'] = -1 - - if 'JUMP_IF_TRUE' not in opcode: - def JUMP_IF_TRUE(self, address=None): - self.DUP_TOP() - return self.POP_JUMP_IF_TRUE(address) - else: - globals()['POP_JUMP_IF_TRUE'] = -1 - - if 'JUMP_IF_FALSE' not in opcode: - def JUMP_IF_FALSE(self, address=None): - self.DUP_TOP() - return self.POP_JUMP_IF_FALSE(address) - else: - globals()['POP_JUMP_IF_FALSE'] = -1 - - if 'LIST_APPEND' in opcode and LIST_APPEND >= HAVE_ARGUMENT: - def LIST_APPEND(self, depth): - self.stackchange(depth + 1, depth) - self.emit_arg(LIST_APPEND, depth) - - def assert_loop(self): - for why, level, fwd in self.blocks: - if why == SETUP_LOOP: - return - raise AssertionError("Not inside a loop") - - def BREAK_LOOP(self): - self.assert_loop() - self.emit(BREAK_LOOP) - self.stack_unknown() - - def CONTINUE_LOOP(self, label): - self.assert_loop() - if self.blocks[-1][0] == SETUP_LOOP: - op = JUMP_ABSOLUTE # more efficient if not in a nested block - else: - op = CONTINUE_LOOP - return self.jump(op, label) - - def __call__(self, *args): - last = None - for ob in args: - if callable(ob): - last = ob(self) - else: - try: - f = generate_types[type(ob)] - except KeyError: - raise TypeError("Can't generate", ob) - else: - last = f(self, ob) - return last - - def return_(self, ob=None): - return self(ob, Code.RETURN_VALUE) - - @classmethod - def from_function(cls, function, copy_lineno=False): - code = cls.from_code(function.func_code, copy_lineno) - return code - - @classmethod - def from_code(cls, code, copy_lineno=False): - import inspect - self = cls.from_spec(code.co_name, *inspect.getargs(code)) - if copy_lineno: - self.set_lineno(code.co_firstlineno) - self.co_filename = code.co_filename - self.co_freevars = code.co_freevars # XXX untested! - return self - - @classmethod - def from_spec(cls, name='', args=(), var=None, kw=None): - self = cls() - self.co_name = name - self.co_argcount = len(args) - self.co_varnames.extend(args) - if var: - self.co_varnames.append(var) - self.co_flags |= CO_VARARGS - if kw: - self.co_varnames.append(kw) - self.co_flags |= CO_VARKEYWORDS - - def tuple_arg(args): - self.UNPACK_SEQUENCE(len(args)) - for arg in args: - if not isinstance(arg, six.string_types): - tuple_arg(arg) - else: - self.STORE_FAST(arg) - - for narg, arg in enumerate(args): - if not isinstance(arg, six.string_types): - dummy_name = '.' + str(narg) - self.co_varnames[narg] = dummy_name - self.LOAD_FAST(dummy_name) - tuple_arg(arg) - - return self - - def patch_arg(self, offset, oldarg, newarg): - code = self.co_code - if (oldarg > 0xFFFF) != (newarg > 0xFFFF): - raise AssertionError("Can't change argument size", oldarg, newarg) - code[offset + 1] = newarg & 255 - code[offset + 2] = (newarg >> 8) & 255 - if newarg > 0xFFFF: - newarg >>= 16 - code[offset - 2] = newarg & 255 - code[offset - 1] = (newarg >> 8) & 255 - - def nested(self, name='', args=(), var=None, kw=None, cls=None): - if cls is None: - cls = Code - code = cls.from_spec(name, args, var, kw) - code.co_filename = self.co_filename - return code - - def __iter__(self): - i = 0 - extended_arg = 0 - code = self.co_code - n = len(code) - while i < n: - op = code[i] - if op >= HAVE_ARGUMENT: - oparg = code[i + 1] + code[i + 2] * 256 + extended_arg - extended_arg = 0 - if op == EXTENDED_ARG: - extended_arg = oparg * 65536 - i += 3 - continue - yield i, op, oparg - i += 3 - else: - yield i, op, None - i += 1 - - def makefree(self, names): - nowfree = dict.fromkeys(self.co_freevars) - newfree = [n for n in names if n not in nowfree] - if newfree: - self.co_freevars += tuple(newfree) - self._locals_to_cells() - - def makecells(self, names): - nowcells = dict.fromkeys(self.co_cellvars + self.co_freevars) - newcells = [n for n in names if n not in nowcells] - if newcells: - if not (self.co_flags & CO_OPTIMIZED): - raise AssertionError("Can't use cellvars in unoptimized scope") - cc = len(self.co_cellvars) - nc = len(newcells) - self.co_cellvars += tuple(newcells) - if self.co_freevars: - self._patch( - deref_to_deref, - dict([(n + cc, n + cc + nc) for n in range( - len(self.co_freevars))]) - ) - self._locals_to_cells() - - def _locals_to_cells(self): - freemap = dict( - [(n, p) for p, n in enumerate(self.co_cellvars + self.co_freevars)] - ) - argmap = dict( - [(p, freemap[n]) for p, n in enumerate(self.co_varnames) - if n in freemap] - ) - if argmap: - for ofs, op, arg in self: - if op == DELETE_FAST and arg in argmap: - raise AssertionError( - "Can't delete local %r used in nested scope" - % self.co_varnames[arg] - ) - self._patch(fast_to_deref, argmap) - - def _patch(self, opmap, argmap=None): - if argmap is None: - argmap = {} - code = self.co_code - for ofs, op, arg in self: - if op in opmap: - if arg in argmap: - self.patch_arg(ofs, arg, argmap[arg]) - elif arg is not None: - continue - code[ofs] = opmap[op] - - def code(self, parent=None): - if self.blocks: - raise AssertionError("%d unclosed block(s)" % len(self.blocks)) - - flags = self.co_flags & ~CO_NOFREE - if parent is not None: - locals_written = self.locals_written() - self.makefree([ - n for n in self.co_varnames[ - self.co_argcount + - ((self.co_flags & CO_VARARGS) == CO_VARARGS) + - ((self.co_flags & CO_VARKEYWORDS) == CO_VARKEYWORDS): - ] if n not in locals_written - ]) - - if not self.co_freevars and not self.co_cellvars: - flags |= CO_NOFREE - elif parent is not None and self.co_freevars: - parent.makecells(self.co_freevars) - - if six.PY2: - return CodeType( - self.co_argcount, len(self.co_varnames), - self.co_stacksize, flags, self.co_code.tostring(), - tuple(self.co_consts), tuple(self.co_names), - tuple(self.co_varnames), - self.co_filename, self.co_name, self.co_firstlineno, - self.co_lnotab.tostring(), self.co_freevars, self.co_cellvars - ) - else: - kwonlyargcount = 0 - return CodeType( - self.co_argcount, kwonlyargcount, len(self.co_varnames), - self.co_stacksize, flags, self.co_code.tobytes(), - tuple(self.co_consts), tuple(self.co_names), - tuple(self.co_varnames), - self.co_filename, self.co_name, self.co_firstlineno, - self.co_lnotab.tobytes(), self.co_freevars, self.co_cellvars - ) - -for op in hasfree: - if not hasattr(Code, opname[op]): - def do_free(self, varname, op=op): - self.stackchange(stack_effects[op][0], stack_effects[op][1]) - try: - arg = list(self.co_cellvars + self.co_freevars).index(varname) - except ValueError: - raise NameError("Undefined free or cell var", varname) - self.emit_arg(op, arg) - setattr(Code, opname[op], with_name(do_free, opname[op])) - -compares = {} -for value, cmp_name in enumerate(cmp_op): - compares[value] = value - compares[cmp_name] = value -compares['<>'] = compares['!='] - -for op in hasname: - if not hasattr(Code, opname[op]): - def do_name(self, name, op=op): - self.stackchange(stack_effects[op][0], stack_effects[op][1]) - try: - arg = self.co_names.index(name) - except ValueError: - arg = len(self.co_names) - self.co_names.append(name) - self.emit_arg(op, arg) - if op in (LOAD_NAME, STORE_NAME, DELETE_NAME): - # Can't use optimized local vars, so reset flags - self.co_flags &= ~CO_OPTIMIZED - setattr(Code, opname[op], with_name(do_name, opname[op])) - -for op in haslocal: - if not hasattr(Code, opname[op]): - def do_local(self, varname, op=op): - if not self.co_flags & CO_OPTIMIZED: - raise AssertionError( - "co_flags must include CO_OPTIMIZED to use fast locals" - ) - self.stackchange(stack_effects[op][0], stack_effects[op][1]) - try: - arg = self.co_varnames.index(varname) - except ValueError: - arg = len(self.co_varnames) - self.co_varnames.append(varname) - self.emit_arg(op, arg) - setattr(Code, opname[op], with_name(do_local, opname[op])) - -for op in hasjrel + hasjabs: - if not hasattr(Code, opname[op]): - def do_jump(self, address=None, op=op): - self.stackchange(stack_effects[op][0], stack_effects[op][1]) - return self.jump(op, address) - setattr(Code, opname[op], with_name(do_jump, opname[op])) - - -def gen_map(code, ob): - code.BUILD_MAP(0) - for k, v in ob.items(): - code.DUP_TOP() - code(k, v) - code.ROT_THREE() - code.STORE_SUBSCR() - - -def gen_tuple(code, ob): - code(*ob) - return code.BUILD_TUPLE(len(ob)) - - -def gen_list(code, ob): - code(*ob) - return code.BUILD_LIST(len(ob)) - -generate_types = { - int: Code.LOAD_CONST, - bool: Code.LOAD_CONST, - CodeType: Code.LOAD_CONST, - str: Code.LOAD_CONST, - six.text_type: Code.LOAD_CONST, - complex: Code.LOAD_CONST, - float: Code.LOAD_CONST, - type(None): Code.LOAD_CONST, - tuple: gen_tuple, - list: gen_list, - dict: gen_map, -} -if six.PY2: - generate_types[long] = Code.LOAD_CONST - - -class _se(object): - """Quick way of defining static stack effects of opcodes""" - POP_TOP = END_FINALLY = POP_JUMP_IF_FALSE = POP_JUMP_IF_TRUE = 1, 0 - ROT_TWO = 2, 2 - ROT_THREE = 3, 3 - ROT_FOUR = 4, 4 - DUP_TOP = 1, 2 - UNARY_POSITIVE = UNARY_NEGATIVE = UNARY_NOT = UNARY_CONVERT = \ - UNARY_INVERT = GET_ITER = LOAD_ATTR = IMPORT_FROM = 1, 1 - - BINARY_POWER = BINARY_MULTIPLY = BINARY_DIVIDE = BINARY_FLOOR_DIVIDE = \ - BINARY_TRUE_DIVIDE = BINARY_MODULO = BINARY_ADD = BINARY_SUBTRACT = \ - BINARY_SUBSCR = BINARY_LSHIFT = BINARY_RSHIFT = BINARY_AND = \ - BINARY_XOR = BINARY_OR = COMPARE_OP = 2, 1 - - INPLACE_POWER = INPLACE_MULTIPLY = INPLACE_DIVIDE = \ - INPLACE_FLOOR_DIVIDE = INPLACE_TRUE_DIVIDE = INPLACE_MODULO = \ - INPLACE_ADD = INPLACE_SUBTRACT = INPLACE_LSHIFT = INPLACE_RSHIFT = \ - INPLACE_AND = INPLACE_XOR = INPLACE_OR = 2, 1 - - SLICE_0, SLICE_1, SLICE_2, SLICE_3 = \ - (1, 1), (2, 1), (2, 1), (3, 1) - STORE_SLICE_0, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3 = \ - (2, 0), (3, 0), (3, 0), (4, 0) - DELETE_SLICE_0, DELETE_SLICE_1, DELETE_SLICE_2, DELETE_SLICE_3 = \ - (1, 0), (2, 0), (2, 0), (3, 0) - - STORE_SUBSCR = 3, 0 - DELETE_SUBSCR = STORE_ATTR = 2, 0 - DELETE_ATTR = STORE_DEREF = 1, 0 - PRINT_EXPR = PRINT_ITEM = PRINT_NEWLINE_TO = IMPORT_STAR = 1, 0 - RETURN_VALUE = YIELD_VALUE = STORE_NAME = STORE_GLOBAL = STORE_FAST = 1, 0 - PRINT_ITEM_TO = LIST_APPEND = 2, 0 - - LOAD_LOCALS = LOAD_CONST = LOAD_NAME = LOAD_GLOBAL = LOAD_FAST = \ - LOAD_CLOSURE = LOAD_DEREF = IMPORT_NAME = BUILD_MAP = 0, 1 - - EXEC_STMT = BUILD_CLASS = 3, 0 - JUMP_IF_TRUE = JUMP_IF_FALSE = \ - JUMP_IF_TRUE_OR_POP = JUMP_IF_FALSE_OR_POP = 1, 1 - - -if sys.version >= "2.5": - _se.YIELD_VALUE = 1, 1 - -stack_effects = [(0, 0)] * 256 - -for opcode_name in opcode: - op = opcode[opcode_name] - opcode_name = opcode_name.replace('+', '_') - - if hasattr(_se, opcode_name): - # update stack effects table from the _se class - stack_effects[op] = getattr(_se, opcode_name) - - if not hasattr(Code, opcode_name): - # Create default method for Code class - if op >= HAVE_ARGUMENT: - def do_op(self, arg, op=op, se=stack_effects[op]): - self.stackchange(se[0], se[1]) - self.emit_arg(op, arg) - else: - def do_op(self, op=op, se=stack_effects[op]): - self.stackchange(se[0], se[1]) - self.emit(op) - - setattr(Code, opcode_name, with_name(do_op, opcode_name)) diff --git a/monasca_analytics/banana/bytecode/decorators.py b/monasca_analytics/banana/bytecode/decorators.py deleted file mode 100644 index b5a3475..0000000 --- a/monasca_analytics/banana/bytecode/decorators.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# This file is an adaptation of BytecodeAssembler: -# -# http://peak.telecommunity.com/DevCenter/BytecodeAssembler#toc -# -# It has been adapted to match the requirements of monasca_analytics - -import sys - - -def enclosing_frame(frame=None, level=3): - """Get an enclosing frame that skips DecoratorTools callback code""" - frame = frame or sys._getframe(level) - while frame.f_globals.get('__name__') == __name__: - frame = frame.f_back - return frame - - -def decorate_assignment(callback, depth=2, frame=None): - """Invoke 'callback(frame,name,value,old_locals)' on next assign in 'frame' - - The frame monitored is determined by the 'depth' argument, which gets - passed to 'sys._getframe()'. When 'callback' is invoked, 'old_locals' - contains a copy of the frame's local variables as they were before the - assignment took place, allowing the callback to access the previous value - of the assigned variable, if any. The callback's return value will become - the new value of the variable. 'name' is the name of the variable being - created or modified, and 'value' is its value (the same as - 'frame.f_locals[name]'). - - This function also returns a decorator function for forward-compatibility - with Python 2.4 '@' syntax. Note, however, that if the returned decorator - is used with Python 2.4 '@' syntax, the callback 'name' argument may be - 'None' or incorrect, if the 'value' is not the original function (e.g. - when multiple decorators are used). - """ - frame = enclosing_frame(frame, depth + 1) - oldtrace = [frame.f_trace] - old_locals = frame.f_locals.copy() - - def tracer(frm, event, arg): - if event == 'call': - # We don't want to trace into any calls - if oldtrace[0]: - # ...but give the previous tracer a chance to, if it wants - return oldtrace[0](frm, event, arg) - else: - return None - - try: - if frm is frame and event != 'exception': - # Aha, time to check for an assignment... - for k, v in frm.f_locals.items(): - if k not in old_locals or old_locals[k] is not v: - break - else: - # No luck, keep tracing - return tracer - - # Got it, fire the callback, then get the heck outta here... - frm.f_locals[k] = callback(frm, k, v, old_locals) - - finally: - # Give the previous tracer a chance to run before we return - if oldtrace[0]: - # And allow it to replace our idea of the "previous" tracer - oldtrace[0] = oldtrace[0](frm, event, arg) - - uninstall() - return oldtrace[0] - - def uninstall(): - # Unlink ourselves from the trace chain. - frame.f_trace = oldtrace[0] - sys.settrace(oldtrace[0]) - - # Install the trace function - frame.f_trace = tracer - sys.settrace(tracer) - - def do_decorate(f): - # Python 2.4 '@' compatibility; call the callback - uninstall() - frame = sys._getframe(1) - return callback( - frame, getattr(f, '__name__', None), f, frame.f_locals - ) - - return do_decorate diff --git a/monasca_analytics/banana/bytecode/symbols.py b/monasca_analytics/banana/bytecode/symbols.py deleted file mode 100644 index d3df7f6..0000000 --- a/monasca_analytics/banana/bytecode/symbols.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# This file is an adaptation of BytecodeAssembler: -# -# http://peak.telecommunity.com/DevCenter/BytecodeAssembler#toc -# -# It has been adapted to match the requirements of monasca_analytics - -"""Symbolic global constants, like 'None', 'NOT_FOUND', etc.""" - - -class Symbol(object): - - """Symbolic global constant""" - - __slots__ = ['_name', '_module'] - __name__ = property(lambda self: self._name) - __module__ = property(lambda self: self._module) - - def __init__(self, symbol, module_name): - self.__class__._name.__set__(self, symbol) - self.__class__._module.__set__(self, module_name) - - def __reduce__(self): - return self._name - - def __setattr__(self, attr, val): - raise TypeError("Symbols are immutable") - - def __repr__(self): - return self.__name__ - - __str__ = __repr__ - - -NOT_GIVEN = Symbol("NOT_GIVEN", __name__) -NOT_FOUND = Symbol("NOT_FOUND", __name__) diff --git a/monasca_analytics/banana/cli/__init__.py b/monasca_analytics/banana/cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/cli/const.py b/monasca_analytics/banana/cli/const.py deleted file mode 100644 index ccf2286..0000000 --- a/monasca_analytics/banana/cli/const.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -CREATE = "create" -CONNECT = "connect" -DISCONNECT = "disconnect" -LOAD = "load" -SAVE_AS = "save_as" -SAVE = "save" -REMOVE = "remove" -MODIFY = "modify" -PRINT = "print" -LIST = "list" -HELP = "help" diff --git a/monasca_analytics/banana/cli/dsl.py b/monasca_analytics/banana/cli/dsl.py deleted file mode 100644 index a58f84d..0000000 --- a/monasca_analytics/banana/cli/dsl.py +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import json -import logging -import os - -import six -import voluptuous - -from monasca_analytics.config import const -from monasca_analytics.config import validation -from monasca_analytics.exception import dsl as err -import monasca_analytics.util.common_util as cu - - -logger = logging.getLogger(__name__) - -MODULE = "module" - -""" -DEPRECATED: Preferred way is to now use the Banana language instead. -""" - - -class MonanasDSL(object): - - def __init__(self, config_file_path=None): - """Constructor with an optional configuration file path - - If the configuration file is provided, it will be loaded at - MonanasDLS creation time. - If no configuration file path is provided, the default base - configuration defined in config.const will be used. - - :type config_file_path: str - :param config_file_path: path to the file containing the configuration - that will be loaded at MonansDSL creation - """ - if config_file_path: - self.load_configuration(config_file_path) - else: - self._config = const.get_default_base_config() - self._init_ids_dictionary() - - def add_component(self, _component_config): - """Add the component configuration passed as parameter - - Add it to MonanasDSL configuration, and return a new unique ID - generated for it. - The configuration passed as parameter is validated, raising exceptions - if the module does not exist or the configuration is invalid. - - :type _component_config: dict - :param _component_config: configuration of the component to be added - :rtype: str - :returns: Component ID for the added component - :raises: MonanasNoSuchClassError -- if the defined class doesn't - exist or is not of a valid type - :raises: SchemaError -- if the configuration is not valid for - the class. - """ - if type(_component_config) == str: - _component_config = json.loads(_component_config) - clz = cu.get_class_by_name(_component_config[MODULE]) - clz.validate_config(_component_config) - comp_type = cu.get_component_type(_component_config[MODULE]) - comp_id = self._generate_id(comp_type) - self._config[comp_type][comp_id] = _component_config - self._config[const.CONNECTIONS][comp_id] = [] - return comp_id - - def modify_component(self, comp_id, params_path, value): - """Overrides the value of the configuration path of a component - - Modifies the configuration of the component defined by comp_id, - following the path in the dictionary defined by params_path, and - assigning the value value. - - :type comp_id: str - :param comp_id: ID of the component to be modified - :type params_path: list - :param params_path: parameters path to modify in the config - :type value: str | int | float - :param value: new value to be assigned, will be parsed - according to the expected configuration - :rtype: bool - :returns: True if the component was modified (or if the modification - result was the same as the existing configuration), - False otherwise - :raises: SchemaError -- if the new configuration would not be valid - """ - comp_type = self._get_type_by_id(comp_id) - if not comp_type: - return False - new_conf = copy.deepcopy(self._config[comp_type][comp_id]) - logger.debug("Modifying " + comp_id + ", existing config = " + - str(new_conf)) - clz = cu.get_class_by_name(new_conf[MODULE]) - for var_type in [str, int, float]: - try: - parsed_value = var_type(value) - except ValueError as e: - logger.debug(str(e)) - continue - new_conf = self._modify_dictionary(new_conf, params_path, - parsed_value) - try: - clz.validate_config(new_conf) - logger.debug("New validated config = " + str(new_conf)) - self._config[comp_type][comp_id] = new_conf - return True - except voluptuous.Invalid as e: - logger.debug(str(e)) - continue - return False - - def remove_component(self, component_id): - """Remove a component from the configuration. - - Removes from the configuration the component whose ID matches the - one passed as parameter. - - :type component_id: str - :param: component_id: ID of the component to be removed - :rtype: bool - :returns: True if the component was removed, False otherwise - :raises: DSLExistingConnection -- if at least a connection exists with - the component as origin or destination. - """ - if self._is_connected(component_id): - raise err.DSLExistingConnection("Cannot remove component " + - component_id + - " because it is still connected") - for comp_type in const.components_types: - if component_id in self._config[comp_type].keys(): - del self._config[comp_type][component_id] - del self._config[const.CONNECTIONS][component_id] - return True - return False - - def connect_components(self, origin_id, dest_id): - """Connect the two components passed as parameter. - - Being the origin the first one and the destination the second one. - If the connection already existed, False is returned. If we created a - new connection, True is returned. - If any of the components is not defined, a DSLInexistentComponent - exception is raised. - - :type origin_id: str - :param origin_id: ID of the component at the origin of the connection - :type dest_id: str - :param dest_id: ID of the component at the destination of the - connection - :rtype: bool - :returns: True if the components were connected, False if - the connection already existed - :raises: DSLInexistentComponent -- if either the origin or the - destination are not defined in the configuration - """ - if not self._component_defined(origin_id): - raise err.DSLInexistentComponent(origin_id) - if not self._component_defined(dest_id): - raise err.DSLInexistentComponent(dest_id) - if dest_id in self._config[const.CONNECTIONS][origin_id]: - return False - if not self._validate_connection_by_ids(origin_id, dest_id): - raise err.DSLInvalidConnection("Connection from " + origin_id + - " to " + dest_id + - " is not allowed") - self._config[const.CONNECTIONS][origin_id].append(dest_id) - return True - - def disconnect_components(self, origin_id, dest_id): - """Disconnect the component dest_id from origin_id - - If the connection from origin_id to dest_id exists, it is removed, - and the function returns true. - If it didn't exist, the function returns false and nothing happens - - :type origin_id: str - :param origin_id: ID of the component at the origin of the connection - :type dest_id: str - :param dest_id: ID of the component at the destination of the - connection - :rtype: bool - :returns: True if the components were already disconnected, - False if the connection didn't exist in the first place - """ - if origin_id in self._config[const.CONNECTIONS]: - if dest_id in self._config[const.CONNECTIONS][origin_id]: - self._config[const.CONNECTIONS][origin_id].remove(dest_id) - return True - return False - - def load_configuration(self, config_file_path): - """Load a configuration from the file passed as parameter - - :type config_file_path: str - :param config_file_path: file path containing the - configuration that will be loaded - """ - self._config = cu.parse_json_file(config_file_path) - self._init_ids_dictionary() - - def _init_ids_dictionary(self): - self.ids_by_type = { - const.SOURCES: ("src", 0), - const.INGESTORS: ("ing", 0), - const.SMLS: ("sml", 0), - const.VOTERS: ("vot", 0), - const.SINKS: ("snk", 0), - const.LDPS: ("ldp", 0), - const.CONNECTIONS: ("connections", 0)} - - def save_configuration(self, config_file_path, overwrite_file=True): - """Save the configuration to the file passed as parameter - - :type config_file_path: str - :param config_file_path: file path where the configuration - will be saved - :type overwrite_file: bool - :param overwrite_file: True will overwrite the file if it exists, - False will make the function return without - saving. - :rtype: bool - :returns: True if the configuration was saved, - False otherwise - """ - if os.path.exists(config_file_path) and\ - os.stat(config_file_path).st_size > 0 and\ - overwrite_file is False: - return False - with open(config_file_path, "w") as f: - str_config = json.dumps(self._config) - f.write(str_config) - return True - - def _generate_id(self, comp_type): - """Generate a new ID for the component type passed as parameter - - After the ID is generated, the last max checked number is stored - in the ids_by_type dictionary - - :type comp_type: str - :param comp_type: type of component for which the ID will - be created - :raises: KeyError -- if the comp_type does not correspond to a - component type of the configuration - """ - typ, num = self.ids_by_type[comp_type] - num += 1 - while(typ + str(num) in self._config[comp_type].keys()): - num += 1 - self.ids_by_type[comp_type] = (typ, num) - return typ + str(num) - - def _get_type_by_id(self, component_id): - """Gets the type of a copmonent from its ID - - :type component_id: str - :param component_id: ID of a component - :rtype: str - :returns: type of component for the ID passed as parameter - """ - for comp_type in const.components_types: - if component_id in self._config[comp_type]: - return comp_type - - def _component_defined(self, component_id): - """Check if a component is defined in the configuration - - :type component_id: str - :param component_id: ID of a component - :rtype: bool - :returns: True if the component is defined in the configuration - """ - comp_type = self._get_type_by_id(component_id) - if not comp_type: - return False - return True - - def _is_connected(self, component_id): - """Check if a component is connected - - Both in and out connections will be considered: if there is any - connection with component_id as either source or destination, this - function will return true. Empty connections lists are ignored. - - :type component_id: str - :param component_id: ID of a component - :rtype: bool - :returns: True if the component is connected to another component - according to the configuration, False otherwise - """ - cons = self._config[const.CONNECTIONS] - for origin_id, dest_ids in six.iteritems(cons): - if dest_ids == []: - continue - if origin_id == component_id: - return True - for dest_id in dest_ids: - if dest_id == component_id: - return True - return False - - def _validate_connection_by_ids(self, origin_id, dest_id): - """Validate the connection from origin_id to dest_id - - The connection from the component with ID = origin_id - to the component with ID = dest_id is validated according to the - valid connections dictionary defined in the validation module. - - :type origin_id: str - :param origin_id: ID of the origin component - :type dest_id: str - :param dest_id: ID of the destination component - :rtype: bool - :returns: True if the connection is allowed, False otherwise - """ - origin_type = self._get_type_by_id(origin_id) - dest_type = self._get_type_by_id(dest_id) - if dest_type in validation.valid_connection_types[origin_type]: - return True - return False - - def _modify_dictionary(self, target_dict, params_path, value): - """Override the value at the end of a path in the target_dictionary - - Modify the dictionary passed as first parameter, assigning the value - passed as last parameter to the key path defined by params_path - - :type target_dict: dict - :param target_dict: target to be modified - :type params_path: list[str] - :param params_path: hierarchy of keys to navigate in - the dictionary, pointing the leave to modify - :type value: object - :param value: Value that will be assigned to the path defined - by params_path in the dictionary - :rtype dict - :returns: Modified dictionary - """ - aux = target_dict - for i, param in enumerate(params_path): - if param not in aux.keys(): - aux[param] = {} - if i == len(params_path) - 1: - aux[param] = value - else: - aux = aux[param] - return target_dict diff --git a/monasca_analytics/banana/cli/interpreter.py b/monasca_analytics/banana/cli/interpreter.py deleted file mode 100644 index d1027b9..0000000 --- a/monasca_analytics/banana/cli/interpreter.py +++ /dev/null @@ -1,275 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import json -import logging - -from monasca_analytics.banana.cli import const as dsl_const -from monasca_analytics.banana.cli import dsl -from monasca_analytics.banana.cli import parser -from monasca_analytics.config import const as config_const -from monasca_analytics.exception import dsl as err -import monasca_analytics.util.common_util as cu - -logger = logging.getLogger(__name__) - - -class DSLInterpreter(object): - - def __init__(self): - self.file_in_use = None - self.dsl = dsl.MonanasDSL() - self.mappings = {} - - def execute_string(self, str_program): - """Parse and execute the command/s in the string passed as parameter - - :type str_program: str - :param str_program: command to be executed - :rtype: str - :returns: execution result - """ - info = parser.get_parser().parseString(str_program) - return self.execute(info) - - def execute_file(self, file_program): - """Parse and execute the command/s in the file passed as parameter - - :type file_program: str - :param file_program: path to the file containing the - command to be executed - :rtype: str - :returns: execution result - """ - info = parser.get_parser().parseFile(file_program) - return self.execute(info) - - def execute(self, info): - """Execute parsed command/s - - :type info: dict - :param info: containing the parsed instructions - :rtype: str - :returns: execution result - """ - for cmd in info: - for key in cmd.keys(): - if key == dsl_const.CREATE: - return self.create(cmd[key][0], cmd[key][1]) - elif key == dsl_const.CONNECT: - return self.connect(cmd[key][0], cmd[key][1]) - elif key == dsl_const.DISCONNECT: - return self.disconnect(cmd[key][0], cmd[key][1]) - elif key == dsl_const.LOAD: - return self.load(cmd[key][0]) - elif key == dsl_const.SAVE_AS: - return self.save(cmd[key][0]) - elif key == dsl_const.SAVE: - return self.save() - elif key == dsl_const.REMOVE: - return self.remove(cmd[key][0]) - elif key == dsl_const.MODIFY: - return self.modify( - cmd[key][0], cmd[key][1:-1], cmd[key][-1]) - elif key == dsl_const.PRINT: - if len(cmd[key]) > 0: - return self.prnt(cmd[key][0]) - else: - return self.prnt_all() - elif key == dsl_const.LIST: - if len(cmd[key]) > 0: - return self.list(cmd[key][0]) - else: - return self.list_all() - elif key == dsl_const.HELP: - return self.help() - else: - return logger.warn("Wrong command" + str(cmd)) - - def create(self, varname, modulename): - """Add a module defined by modulename in the configuration - - :type varname: str - :param varname: name of the variable representing - the new component - :rtype: str - :returns: new component ID - """ - clz = cu.get_class_by_name(modulename) - conf = copy.deepcopy(clz.get_default_config()) - comp_id = self.dsl.add_component(conf) - self.mappings[varname] = comp_id - return comp_id - - def connect(self, origin_varname, dest_varname): - """Connect two components - - :type origin_varname: str - :param origin_varname: variable name or ID of the source - component of the connection - :type dest_varname: str - :param dest_varname: variable name or ID of the destination - component of the connection - :rtype: bool - :returns: True if the connection was performed, - False otherwise - """ - origin_id = self._get_id(origin_varname) - dest_id = self._get_id(dest_varname) - return self.dsl.connect_components(origin_id, dest_id) - - def _get_id(self, name_or_id): - """Get the ID from a name or ID - - :type name_or_id: str - :param name_or_id: variable name or ID - :rtype: str - :returns: ID - """ - if name_or_id in self.mappings.keys(): - return self.mappings[name_or_id] - for comp_type in config_const.components_types: - if name_or_id in self.dsl._config[comp_type]: - return name_or_id - raise err.DSLInterpreterException("undefined variable: " + name_or_id) - - def disconnect(self, origin_varname, dest_varname): - """Disconnect two components - - :type origin_varname: str - :param origin_varname: variable name or ID of the source - component of the connection - :type dest_varname: str - :param dest_varname: variable name or ID of the destination - component of the connection - :rtype: bool - :returns: True if the components were disconnected, - False otherwise - """ - origin_id = self._get_id(origin_varname) - dest_id = self._get_id(dest_varname) - return self.dsl.disconnect_components(origin_id, dest_id) - - def load(self, filepath): - """Load configuration from a file - - :type filepath: str - :param filepath: path to the file to be loaded - """ - self.dsl.load_configuration(filepath) - self.file_in_use = filepath - - def save(self, filepath=None): - """Save configuration to a file - - :type filepath: str - :param filepath: (Optional) path to the file where the configuration - will be saved. If the path is not provided, the last - file used for saving or loading will be used. - """ - if not filepath: - filepath = self.file_in_use - saved = self.dsl.save_configuration(filepath, overwrite_file=True) - if saved: - self.file_in_use = filepath - return saved - - def remove(self, varname): - """Remove a variable or ID from the configuration - - :type varname: str - :param varname: variable name or ID mapped to the component - that will be removed from the configuration - """ - remove_id = self._get_id(varname) - return self.dsl.remove_component(remove_id) - - def modify(self, varname, params, value): - """Override the value of the configuration path of a component - - :type varname: str - :param varname: variable name or ID mapped to the component - :type params: list - :param params: path to be modified in the configuration - :type value: float | int | str - :param value: value to assign - """ - modify_id = self._get_id(varname) - return self.dsl.modify_component(modify_id, params, value) - - def prnt(self, varname): - """Print the configuration of the module/s defined by varname - - If varname is a variable or ID associated to a particular component, - the configuration of that component will be printed. If it is a type - of components, the configurations of all components of that type - will be printed. - - :type varname: str - :param varname: variable, ID or type to be printed - :rtype: str - :returns: requested configuration in string format - """ - if varname in self.dsl._config.keys(): - return self._json_print(self.dsl._config[varname]) - itemId = self._get_id(varname) - for k in config_const.components_types: - if itemId in self.dsl._config[k]: - return self._json_print(self.dsl._config[k][itemId]) - - def prnt_all(self): - """Print the the whole configuration - - :rtype: str - :returns: whole configuration in string format - """ - return self._json_print(self.dsl._config) - - def _json_print(self, jstr): - """Format Json as a clean string""" - return json.dumps(jstr, indent=4, separators=(',', ': ')) - - def list(self, key): - """List the available components of the type passed as parameter""" - ret = "" - if key in config_const.components_types: - for name in cu.get_available_class_names(key): - ret += "- " + name + "\n" - return ret - - def list_all(self): - """List all available components grouped by type""" - ret = "" - for key in config_const.components_types: - ret += "- " + key + "\n" - for name in cu.get_available_class_names(key): - ret += " - " + name + "\n" - return ret - - def help(self): - return """ -Available commands - - print: prints current configuration - - list: shows available modules - - load: loads a config from a file - - save: saves a config to a file - - = : instantiates module , referenced by - - ->: connects the module to the module - - !->: disconnects the module from the module - - rm : removes the module corresponding to - - exit: finishes the execution of monanas command line -""" diff --git a/monasca_analytics/banana/cli/parser.py b/monasca_analytics/banana/cli/parser.py deleted file mode 100644 index 50f50ad..0000000 --- a/monasca_analytics/banana/cli/parser.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import pyparsing as p - -from monasca_analytics.banana.cli import const - -EQUALS = p.Literal("=").suppress() -CONNECT = p.Literal("->").suppress() -DISCONNECT = p.Literal("!->").suppress() -LPAREN = p.Literal("(").suppress() -RPAREN = p.Literal(")").suppress() -LOAD = p.CaselessKeyword("load").suppress() -SAVE = p.CaselessKeyword("save").suppress() -REMOVE = p.CaselessKeyword("rm").suppress() -PRINT = p.CaselessKeyword("print").suppress() -LIST = p.CaselessKeyword("list").suppress() -HELP = p.CaselessKeyword("help").suppress() -DOT = p.Literal(".").suppress() -VARNAME = p.Word(p.alphas + "_", p.alphanums + "_") -PARAMETER = p.Word(p.alphanums + "_-") -MODULE_NAME = p.Word(p.alphanums + "_-") -VALUE = p.Word(p.alphanums + "_-.") -PATH = p.Word(p.alphanums + "_-/\.") - -cmd_create = (VARNAME + EQUALS + MODULE_NAME) -cmd_connect = (VARNAME + CONNECT + VARNAME) -cmd_disconnect = (VARNAME + DISCONNECT + VARNAME) -cmd_modify = (VARNAME + p.OneOrMore(DOT + PARAMETER) + EQUALS + VALUE) -cmd_load = (LOAD + p.Optional(LPAREN) + PATH + p.Optional(RPAREN)) -cmd_save = (SAVE + p.Optional(LPAREN) + p.Optional(RPAREN)) -cmd_save_as = (SAVE + p.Optional(LPAREN) + PATH + p.Optional(RPAREN)) -cmd_remove = (REMOVE + p.Optional(LPAREN) + VARNAME + p.Optional(RPAREN)) -cmd_print = (PRINT + p.Optional(LPAREN) + p.Optional(VARNAME) + - p.Optional(RPAREN)) -cmd_list = (LIST + p.Optional(LPAREN) + p.Optional(VARNAME) + - p.Optional(RPAREN)) -cmd_help = (HELP + p.Optional(LPAREN) + p.Optional(RPAREN)) - -bnfLine = cmd_create(const.CREATE) | cmd_connect(const.CONNECT) | \ - cmd_disconnect(const.DISCONNECT) | cmd_load(const.LOAD) | \ - cmd_save_as(const.SAVE_AS) | cmd_save(const.SAVE) | \ - cmd_remove(const.REMOVE) | cmd_modify(const.MODIFY) | \ - cmd_print(const.PRINT) | cmd_list(const.LIST) | cmd_help(const.HELP) - -bnfComment = "#" + p.restOfLine - -bnf = p.OneOrMore(p.Group(bnfLine)) -bnf.ignore(bnfComment) - - -def get_parser(): - return bnf diff --git a/monasca_analytics/banana/deadpathck/README.md b/monasca_analytics/banana/deadpathck/README.md deleted file mode 100644 index 0326592..0000000 --- a/monasca_analytics/banana/deadpathck/README.md +++ /dev/null @@ -1,22 +0,0 @@ -## Dead path checker - -Dead path checking is about removing paths in the pipeline that -lead to nothing. For instance, if there's no source or no sink -in a path. This pass is the only one that modifies the AST. - -This is the third step of the pipeline: -``` - +---------------------+ +---------------------+ - | | | | - ---> | AST & TypeTable | ---- deadpathck ---> | AST' & TypeTable' | ---> - | | | | - +---------------------+ +---------------------+ -``` - -### Current status: - -* [x] Remove branches that are dead from the list of connections. -* [x] Remove the components from the collected list of components. -* [ ] Remove statements that are dead code: - - [ ] Do not instantiate components. - - [ ] Do not compute expressions for unused variables. diff --git a/monasca_analytics/banana/deadpathck/__init__.py b/monasca_analytics/banana/deadpathck/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/deadpathck/config.py b/monasca_analytics/banana/deadpathck/config.py deleted file mode 100644 index 3f97728..0000000 --- a/monasca_analytics/banana/deadpathck/config.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.banana.deadpathck.dag as dag -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.exception.banana as exception - - -import six - - -def deadpathck(banana_file, type_table, emitter=emit.PrintEmitter()): - """ - Perform dead path elimination on the provided AST. - This allow to remove branches and components that - are not connected to a Sink. - :type banana_file: ast.BananaFile - :param banana_file: The AST tree we will clean. - :type type_table monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: The TypeTable of the provided AST. - :type emitter: emit.Emitter - :param emitter: Emitter for reporting warnings. - """ - # Check that first argument is a banana file. Mainly - # an excuse to remove the F401 warning. - if not isinstance(banana_file, ast.BananaFile): - raise Exception("Expected BananaFile as first argument.") - - # Look first for all branch that are "dead" - connections = banana_file.connections # type: ast.Connection - - # If there are no connections everything is considered - # as dead. - if connections is None: - class EmptyConnections(object): - connections = [] - connections = EmptyConnections() - - # Collect the nodes and connect them. - dag_nodes = {} - # Create all the nodes - for ident in banana_file.components.keys(): - dag_nodes[ident] = dag.DagNode(type_table.get_type(ident)) - # Connect them - for ident_from, ident_to in connections.connections: - dag_from = dag_nodes[ident_from] - dag_to = dag_nodes[ident_to] - dag_from.children.append(dag_to) - dag_to.parents.append(dag_from) - - # Start from every sources and for each, check if the path is dead - for node in dag_nodes.values(): - if isinstance(node.typec, type_util.Source): - node.visit() - - # We can now remove all the components that are "dead" - # from the list of connections - for ident, node in six.iteritems(dag_nodes): - if not node.is_alive(): - emitter.emit_warning( - ident.span, - "Dead code found, this component is not in a path " - "starting from a 'Source' and ending with a 'Sink'." - ) - banana_file.components.pop(ident) - connections.connections = [edge for edge in connections.connections - if edge[0] != ident and - edge[1] != ident] - - # TODO(Joan): We could also remove them from the statements. - # TODO(Joan): But for this we need a dependency graph between - # TODO(Joan): statements to make sure we don't break the code. - - -def contains_at_least_one_path_to_a_sink(banana_file, type_table): - """ - Check that there's at least one path to a sink in the list - of components. - To run this pass, you need to make sure you - have eliminated all dead path first. - - :type banana_file: ast.BananaFile - :param banana_file: The AST to check. - :type type_table monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: The TypeTable of the provided AST. - :raise: Raise an exception if there's no Sink. - """ - def is_sink(comp): - type_comp = type_table.get_type(comp) - return isinstance(type_comp, type_util.Sink) - - def is_src(comp): - type_comp = type_table.get_type(comp) - return isinstance(type_comp, type_util.Source) - - comp_vars = banana_file.components.keys() - at_least_one_sink = len(list(filter(is_sink, comp_vars))) > 0 - at_least_one_source = len(list(filter(is_src, comp_vars))) > 0 - - if not at_least_one_sink: - raise exception.BananaNoFullPath("Sink") - if not at_least_one_source: - raise exception.BananaNoFullPath("Source") diff --git a/monasca_analytics/banana/deadpathck/dag.py b/monasca_analytics/banana/deadpathck/dag.py deleted file mode 100644 index 6df8dd0..0000000 --- a/monasca_analytics/banana/deadpathck/dag.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.banana.typeck.type_util as type_util - - -class DagNode(object): - - def __init__(self, typec): - """ - Create a DAGNode. - - :param typec: The type of the node. - """ - self.parents = [] - self.children = [] - self.typec = typec - self._visited = False - self._seen_sink = False - - def visit(self): - """ - Visit this nodes and all of its connections. - """ - if not self._visited: - self._visited = True - if isinstance(self.typec, type_util.Sink): - self.visit_parents() - return - for child in self.children: - child.visit() - - def visit_parents(self): - """ - Visit the parent to tell them that we've seen a Sink. - """ - if not self._seen_sink: - self._seen_sink = True - for parent in self.parents: - parent.visit_parents() - - def is_alive(self): - return self._visited and self._seen_sink diff --git a/monasca_analytics/banana/emitter.py b/monasca_analytics/banana/emitter.py deleted file mode 100644 index 4b81954..0000000 --- a/monasca_analytics/banana/emitter.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import six - - -@six.add_metaclass(abc.ABCMeta) -class Emitter(object): - """ - Emitter base class to emit errors and warnings. - Typically errors will be collected and then send - over the network as an http response but for tests - and debugging, a `PrintEmitter` can be used instead. - """ - - @abc.abstractmethod - def emit_warning(self, span, message): - """ - Emit a warning. - :type span: monasca_analytics.banana.grammar.base_ast.Span - :param span: Span associated with the message. - :type message: str - :param message: message to emit with the warning level. - """ - pass - - @abc.abstractmethod - def emit_error(self, span, message): - """ - Emit an error - :type span: monasca_analytics.banana.grammar.base_ast.Span - :param span: Span associated with the message. - :type message: str - :param message: message to emit with the error level. - """ - pass - - -class PrintEmitter(Emitter): - """ - Print warnings and errors to the console. - """ - def emit_warning(self, span, message): - print("WARNING at line:{}".format(span.get_lineno())) - print("WARNING: {}".format(message)) - - def emit_error(self, span, message): - print("ERROR at line:{}".format(span.get_lineno())) - print("ERROR: {}".format(message)) - - -class JsonEmitter(Emitter): - """ - Print warnings and errors in a Json object. - """ - def __init__(self): - self.result = { - "errors": [], - "warnings": [], - } - - def emit_error(self, span, message): - error = JsonEmitter._gen_message_structure(span, message) - self.result["errors"].append(error) - - def emit_warning(self, span, message): - warning = JsonEmitter._gen_message_structure(span, message) - self.result["warnings"].append(warning) - - @staticmethod - def _gen_message_structure(span, message): - spanrange = span.get_range() - return { - "startLineNumber": spanrange[0][0], - "startColumn": spanrange[0][1], - "endLineNumber": spanrange[1][0], - "endColumn": spanrange[1][1], - "byteRange": [span.lo, span.hi], - "message": message - } diff --git a/monasca_analytics/banana/eval/README.md b/monasca_analytics/banana/eval/README.md deleted file mode 100644 index fc5c25e..0000000 --- a/monasca_analytics/banana/eval/README.md +++ /dev/null @@ -1,50 +0,0 @@ -## Interpreter / Evaluator - -This folder contains everything related to the evaluation -of banana files. - -This pass makes some assumptions: it is valid to create -all the components and connecting them won't throw any errors. - -Some components might need to be created in order to -check if they are valid. For instance, when a DNS lookup is -involved. In such cases, an error will be thrown during -the interpretation. However, the general intention is to move -the checks out of the evaluation as much as possible. We want to -avoid at all cost an half-working pipeline as it could have -side-effects on external data sources by corrupting them or -feeding them with incorrect data. - -The execution environment (e.g Spark) might also reject the -pipeline during an evaluation for some reason. However, this is -less likely to happen as the `deadpathck` pass removes -components and paths that would lead to errors. - -This is the last step of the pipeline: -``` - +---------------------+ - | | - ---> | AST & TypeTable | ---- interpret ---> Done - | | - +---------------------+ -``` - -### Current status - -* [x] Evaluate expressions -* [x] Create components -* [x] Connect components -* [x] Restart the pipeline - -### Tests - -All tests are located in `test/banana/eval`. We only try -to evaluate valid files, so for this pass there's only a -`should_pass` directory. - -#### Available instruction - -* `# LHS_EQ `: This instruction - compares the evaluation of the left hand side of the previous - expression with the provided string. If they are not equal, - the test will fail. \ No newline at end of file diff --git a/monasca_analytics/banana/eval/__init__.py b/monasca_analytics/banana/eval/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/eval/config.py b/monasca_analytics/banana/eval/config.py deleted file mode 100644 index 1e4b278..0000000 --- a/monasca_analytics/banana/eval/config.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import operator - -import monasca_analytics.banana.eval.ctx as ctx -import monasca_analytics.banana.eval.old_style as into -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.config.connection as connection -import monasca_analytics.config.const as conf_const -import monasca_analytics.exception.banana as exception -import monasca_analytics.util.common_util as introspect - -import six - - -logger = logging.getLogger(__name__) - - -def eval_ast(ast_root, type_table, driver): - """ - Evaluate the provided AST by instantiating - the appropriate components and connecting them - together using the Driver interface. - :type ast_root: ast.BananaFile - :param ast_root: AST to evaluate. - :type type_table: monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: the TypeTable (used to create configurations) - :type driver: monasca_analytics.spark.driver.DriverExecutor - :param driver: Driver that will manage the created - components and connect them together. - """ - logger.debug("Creating the config dictionary from the AST...") - _config = conf_const.get_default_base_config() - - try: - logger.debug("Creating components according to banana config...") - components = eval_create_components(ast_root.statements, type_table) - convert_connections(ast_root.connections, _config) - logger.debug("Done creating components. Creating link data...") - # Pre-process to convert to old style components - components_old_style = into.into_old_conf_dict(components) - links = connection.connect_components(components_old_style, _config) - logger.debug("Done connecting components. Successful instantiation") - except Exception as ex: - logger.error("Failed to instantiate components") - logger.error("Reason : " + str(ex)) - return - - # Restart Spark using the new config - logger.debug("Stop pipeline") - driver.stop_pipeline() - logger.debug("Set new links") - driver.set_links(links) - logger.debug("Start pipeline") - driver.start_pipeline() - - -def convert_connections(connections, output_config): - """ - Augment the output_config object with the list of - connections - :type connections: ast.Connection - :param connections: The list of connections. - :type output_config: dict - :param output_config: Config where the links will be written. - """ - output_config[conf_const.CONNECTIONS] = connections.connections_cache - - -def eval_create_components(statements, type_table): - """ - Convert the provided AST into the old dict configuration. - :type statements: list[(ast.ASTNode, ast.ASTNode)] - :param statements: The AST to process - :type type_table: monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: the type table. - :rtype: dict[str, Component] - :return: Returns the component keyed by name. - """ - context = ctx.EvaluationContext() - - eval_statements_generic( - statements, - type_table, - context - ) - return context.get_components() - - -def eval_statements_generic( - statements, - type_table, - context, - cb=lambda *a, **k: None): - """ - Eval the list of statements, and call the cb after evaluating - each statement providing it with the type of the value, the - left hand side ast node, and the computed value. - :type statements: list[(ast.ASTNode, ast.ASTNode)] - :param statements: The AST to process - :type type_table: monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: the type table. - :type context: ctx.EvaluationContext - :param context: evaluation context that will collect - all intermediary results. - :type cb: (type_util.IsType, ast.ASTNode, object) -> None - :param cb: Callback called after each statement evaluation. - """ - stmt_index = 0 - for stmt in statements: - lhs, rhs = stmt - expected_type = type_table.get_type(lhs, stmt_index + 1) - stmt_index += 1 - # Provide the expected type - value = eval_rhs(context, rhs, expected_type) - # Call the cb with the expected_type of the value - # The lhs node and the value - cb(expected_type, lhs, value) - # Store result if referenced later. - context.set_variable(lhs, value) - - -def eval_rhs(context, ast_node, expected_type): - """ - Eval the right hand side node. - :type context: ctx.EvaluationContext - :param context: Evaluation context. - :type ast_node: ast.ASTNode - :param ast_node: the node to evaluate. - :type expected_type: type_util.IsType - :param expected_type: The expected type of this computation. - :return: Returns the result of this evaluation. - """ - if isinstance(ast_node, ast.StringLit): - return ast_node.inner_val() - if isinstance(ast_node, ast.Ident): - return context.get_variable(ast_node.inner_val()) - if isinstance(ast_node, ast.JsonObj): - return eval_object(context, ast_node, expected_type) - if isinstance(ast_node, ast.Number): - return ast_node.val - if isinstance(ast_node, ast.DotPath): - variable_name = ast_node.varname.inner_val() - prop = map(lambda x: x.inner_val(), ast_node.properties) - return context.get_prop_of_variable(variable_name, prop) - if isinstance(ast_node, ast.Expr): - return eval_expr(context, ast_node, expected_type) - if isinstance(ast_node, ast.Component): - return eval_comp(context, ast_node, expected_type) - raise Exception("Unhandled ast value type {}!!".format(ast_node)) - - -def eval_comp(context, comp, expected_type): - """ - Instantiate the given component, computing - the required config. - :type context: ctx.EvaluationContext - :param context: Evaluation context. - :type comp: ast.Component - :param comp: the node to evaluate. - :type expected_type: type_util.IsType - :param expected_type: The expected type of this computation. - :return: Returns the instantiated component. - """ - arguments = {} - # Compute arguments - for arg in comp.args: - arg_name = ast.DotPath(arg.arg_name.span, arg.arg_name, []) - arg_value = eval_rhs(context, arg.value, expected_type[arg_name]) - arguments[arg.arg_name.inner_val()] = arg_value - # Lookup component - component_type = introspect.get_class_by_name(comp.type_name.val) - # Get default config for the component - conf = component_type.get_default_config() - # Update modified params - for k, val in six.iteritems(arguments): - conf[k] = val - # Delay evaluation until we do the assign - return component_type, conf - - -def eval_object(context, obj, expected_type): - """ - Evaluate the provided object - :type context: ctx.EvaluationContext - :param context: Evaluation context. - :type obj: ast.JsonObj - :param obj: The expression to evaluate - :type expected_type: type_util.IsType - :param expected_type: The expected type of this computation. - :return: Returns the computed value - """ - result = expected_type.default_value() - for name, val in six.iteritems(obj.props): - subtype = expected_type[name] - ctx.set_property(result, name, eval_rhs(context, val, subtype)) - return result - - -def eval_expr(context, expr, expected_type): - """ - Eval the provided expression - :type context: ctx.EvaluationContext - :param context: Evaluation context. - :type expr: ast.Expr - :param expr: The expression to evaluate - :type expected_type: type_util.IsType - :param expected_type: The expected type of this computation. - :rtype: str | float - :return: Returns the computed value - """ - if len(expr.expr_tree) == 1: - return eval_rhs(context, expr.expr_tree[0], expected_type) - - if isinstance(expected_type, type_util.Number): - result = 0 - cast_func = float - elif isinstance(expected_type, type_util.String): - result = "" - cast_func = str - else: - raise exception.BananaEvalBug( - "Expected type for an expression can only be " - "'TypeNumber' or 'TypeString', got '{}'".format( - str(expected_type)) - ) - current_operator = operator.add - for el in expr.expr_tree: - if isinstance(el, six.string_types) and el in ['+', '-', '*', '/']: - current_operator = get_op_func(el) - else: - value = eval_rhs(context, el, expected_type) - value = cast_func(value) - result = current_operator(result, value) - return result - - -def get_op_func(op_str): - if op_str == '+': - return operator.add - if op_str == '-': - return operator.sub - if op_str == '*': - return operator.mul - if op_str == '/': - return operator.div - raise exception.BananaEvalBug( - "Unknown operator '{}'".format(op_str) - ) diff --git a/monasca_analytics/banana/eval/ctx.py b/monasca_analytics/banana/eval/ctx.py deleted file mode 100644 index b6bff2e..0000000 --- a/monasca_analytics/banana/eval/ctx.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.exception.banana as exception - - -class EvaluationContext(object): - """Evalutation context for an AST evaluation""" - - def __init__(self): - """ - Construct an evaluation context using the type table - as based for the variable needed to be created. - """ - self._variables = {} - self._components = {} - - def set_variable(self, name, value): - """Set the variable value.""" - if isinstance(value, tuple) and len(value) == 2: - comp_type, config = value - comp_name = name.varname.inner_val() - self._components[comp_name] = comp_type( - comp_name, - config - ) - self._variables[comp_name] = config - elif not set_property(self._variables, name, value): - raise exception.BananaEvalBug( - "set_variable can only be used with DotPath or Ident." - ) - - def get_components(self): - return self._components - - def get_variable(self, name): - """Returns the variable value.""" - return self._variables[name] - - def get_prop_of_variable(self, name, prop): - """Returns the sub property of the given variable name.""" - variable = self._variables[name] - for el in prop: - variable = variable[el] - return variable - - -def set_property(root_object, name, value): - """ - Set the property name of the root_object to value. - :type root_object: dict - :param root_object: The root object - :type name: ast.DotPath | ast.Ident | ast.StringLit - :param name: Name of - :param value: - :return: Returns true if succeeded. - """ - if isinstance(name, ast.Ident) or isinstance(name, ast.StringLit): - root_object[name.inner_val()] = value - return True - elif isinstance(name, ast.DotPath): - _create_as_many_object_as_needed(root_object, name, value) - return True - return False - - -def _create_as_many_object_as_needed(root_object, dot_path, value): - """ - Create as many object as needed to be able to access the - nested property. - - :type root_object: dict - :param root_object: The root object - :type dot_path: ast.DotPath - :param dot_path: Dot Path to use. - :type value: object - :param value: Any value to set. - """ - name = dot_path.varname.inner_val() - - if len(dot_path.properties) == 0: - root_object[name] = value - return - - if name in root_object: - variable = root_object[name] - else: - variable = {} - - current_var = variable - last_index = len(dot_path.properties) - 1 - - for index, subpath in enumerate(dot_path.properties): - subpath_name = subpath.inner_val() - if index != last_index: - if subpath_name in current_var: - current_var = current_var[subpath_name] - else: - new_object = {} - current_var[subpath_name] = new_object - current_var = new_object - else: - current_var[subpath_name] = value - - root_object[name] = variable diff --git a/monasca_analytics/banana/eval/old_style.py b/monasca_analytics/banana/eval/old_style.py deleted file mode 100644 index 74526d8..0000000 --- a/monasca_analytics/banana/eval/old_style.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.config.const as conf_const -import monasca_analytics.ingestor.base as ingestor -import monasca_analytics.ldp.base as ldp -import monasca_analytics.sink.base as sink -import monasca_analytics.sml.base as sml -import monasca_analytics.source.base as source -import monasca_analytics.voter.base as voter - - -import six - - -def into_old_conf_dict(components): - """ - Convert the provided dict of components - keyed by ids into a dict keyed by component - type. This is the data structure used to do - the validation of JSON configuration (the old format). - - :type components: dict[str, object] - :param components: The dictionary of components. - :return: Returns the old conf dictionary. - """ - return { - conf_const.INGESTORS: - dict(filter(lambda x: isinstance(x[1], ingestor.BaseIngestor), - six.iteritems(components))), - conf_const.VOTERS: - dict(filter(lambda x: isinstance(x[1], voter.BaseVoter), - six.iteritems(components))), - conf_const.SINKS: - dict(filter(lambda x: isinstance(x[1], sink.BaseSink), - six.iteritems(components))), - conf_const.LDPS: - dict(filter(lambda x: isinstance(x[1], ldp.BaseLDP), - six.iteritems(components))), - conf_const.SOURCES: - dict(filter(lambda x: isinstance(x[1], source.BaseSource), - six.iteritems(components))), - conf_const.SMLS: - dict(filter(lambda x: isinstance(x[1], sml.BaseSML), - six.iteritems(components))), - } diff --git a/monasca_analytics/banana/grammar/README.md b/monasca_analytics/banana/grammar/README.md deleted file mode 100644 index deeff47..0000000 --- a/monasca_analytics/banana/grammar/README.md +++ /dev/null @@ -1,63 +0,0 @@ -## Grammar - -This folder is all about the definition of the `banana` grammar. -The grammar purpose is to convert the input, text, into an -abstract syntax tree (AST). - -This is the first step of the pipeline: -``` - +--------+ +---------+ - | | | | - | Text | --- grammar ---> | AST | ---> - | | | | - +--------+ +---------+ -``` - -The module `ast.py` contains all the possible `ASTNode` which -itself is defined in `base_ast.py`. - -### Current status - -* [x] Parsing connections such as `a -> b`, `a -> [b, c]`, - `[a, b] -> [c, d]` -* [x] Parsing numbers -* [x] Parsing string literals -* [ ] Parsing booleans -* [x] Parsing assignments where the left hand side can be a property - or an identifier. -* [x] Parsing assignments where the right hand side is a number, a - string literal, a property or an identifier. -* [x] Parsing components arguments using a constructor-like syntax. -* [ ] Parsing ingestors generators (for JSON dialect) -* [ ] Parsing imports such as `from ldp.monasca import *` -* [ ] Parsing disconnections such as `a !-> b` *(requires imports)* - -### Tests - -All test regarding the grammar (i.e. the syntax and the way -the AST is built) is defined in `test/banana/grammar`. - -This folder looks like this: - -``` -test/banana/grammar -├── should_fail -│   ├── ... -│   └── file.banana -├── should_pass -│   ├── ... -│   └── file.banana -└── test_config.py -``` - -The `test_config` generates one test for each file in the -`should_pass` and `should_fail` directories. - -Test can assert various things using instructions below. - -#### Available instruction - -* `# RAISE `: Check that `exception-name` is raised. -* `# STMT_EQ ` Check the AST of statements. -* `# AST_EQ ` Check the full AST. -* `# CONN_EQ ` Check the AST of connections. \ No newline at end of file diff --git a/monasca_analytics/banana/grammar/__init__.py b/monasca_analytics/banana/grammar/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/grammar/ast.py b/monasca_analytics/banana/grammar/ast.py deleted file mode 100644 index d9920ec..0000000 --- a/monasca_analytics/banana/grammar/ast.py +++ /dev/null @@ -1,704 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.grammar.base_ast as base -import monasca_analytics.exception.banana as exception -import monasca_analytics.util.string_util as strut -import pyparsing as p - - -import six - - -ASTNode = base.ASTNode -Span = base.Span - - -class BananaFile(object): - - def __init__(self, emitter=emit.PrintEmitter()): - self.imports = [] - self._emitter = emitter - # Components is a dict where keys - # are the name of the var and - # values are of type Component - self.components = dict() - # Statement are component - # creation or variable creation - self.statements = [] - self.connections = None - - def add_component_ctor(self, dot_path, component): - """ - Add a component if the component - does not already exists. If it does exists, - then this raises an Error. - :type dot_path: DotPath - :param dot_path: Name of the variable or property path - :type component: Component - :param component: AST part that will contains all properties - """ - if not isinstance(dot_path, DotPath): - raise exception.BananaAssignmentError( - dot_path.span, component.span) - if not len(dot_path.properties) == 0: - raise exception.BananaAssignmentError( - dot_path.span, component.span) - if dot_path.varname in self.components: - other_dot_path = filter( - lambda x: x == dot_path, - self.components.keys())[0] - no_effect_str = dot_path.span.str_from_to(component.span) - collision_str = other_dot_path.span.str_from_to( - self.components[other_dot_path].span) - self._emitter.emit_warning( - dot_path.span, - "Statement has no effect: '{}'".format(no_effect_str) - ) - self._emitter.emit_warning( - other_dot_path.span, - "It collides with: '{}'".format(collision_str) - ) - else: - self.components[dot_path.varname] = component - self.statements.append((dot_path, component)) - - def add_assignment(self, dot_path, ast_value): - """ - Add an assignment to a property or a variable. - We don't check at this point whether or not the variable - has collision with a component. - This will be done during the name resolution pass. - :type dot_path: DotPath - :param dot_path: Name of the variable or property - :type ast_value: Ident | JsonObj | StringLit | Number | DotPath - :param ast_value: Ast node this variable is assigned to. - """ - if not isinstance(dot_path, DotPath): - raise exception.BananaAssignmentError( - dot_path.span, - ast_value.span - ) - self.statements.append((dot_path, ast_value)) - - def add_connections(self, connections): - """ - Add a new set of connections between components - This function performs the same checks as the one - performs when components are connected. It warns - on redundant connections. - :type connections: Connection - :param connections: AST node that contains the collected connections. - """ - if self.connections is None: - self.connections = connections - else: - self.connections.merge_and_reset_inputs_outputs( - connections, - self._emitter - ) - - def statements_to_str(self): - return "{ " + ', '.join( - ['{} = {}'.format(x[0], x[1]) for x in self.statements] - ) + ' }' - - def __str__(self): - res = "BananaFile { " - res += 'components: { ' - res += strut.dict_to_str(self.components) - res += ' }, ' - res += 'statements: ' + self.statements_to_str() - res += 'connections: { ' - res += str(self.connections) - res += " } }" - return res - - -def make_span(s, l, t): - - def compute_hi(init_loc, tokens): - hi = init_loc - for tok in tokens: - if isinstance(tok, ASTNode): - hi = max(hi, tok.span.hi) - elif isinstance(tok, six.string_types): - hi += len(tok) - elif isinstance(tok, p.ParseResults): - hi = max(hi, compute_hi(init_loc, tok)) - else: - raise exception.BananaGrammarBug( - "Couldn't create span for: {}".format(tok) - ) - return hi - - if len(t) > 0: - span_hi = compute_hi(l, t) - return Span(s, l, span_hi) - else: - return Span(s, l, 2) - - -class Number(ASTNode): - def __init__(self, span, val): - """ - Construct a Number ast node. - :type span: Span - :param span: Span for this number - :type val: str - :param val: Value for this number - """ - super(Number, self).__init__(span) - self.val = float(val) - - def __str__(self): - return "Number< {} >".format(self.val) - - def into_unmodified_str(self): - return str(self.val) - - -class StringLit(ASTNode): - def __init__(self, span, val): - """ - Construct a StringLit ast node. - :type span: Span - :param span: Span for this string - :type val: str - :param val: Value for this string - """ - super(StringLit, self).__init__(span) - self.val = val - - def __hash__(self): - return hash(self.inner_val()) - - def __eq__(self, other): - return (isinstance(other, StringLit) or isinstance(other, Ident))\ - and self.inner_val() == other.inner_val() - - def __ne__(self, other): - return not self.__eq__(other) - - def __str__(self): - return "StringLit< {} >".format(self.val) - - def into_unmodified_str(self): - return self.val - - def inner_val(self): - return self.val.strip()[1:-1] - - -class Ident(ASTNode): - def __init__(self, span, val): - """ - Construct an Ident ast node. - :type span: Span - :param span: Span for this identifier - :type val: str - :param val: Value of this identifier - """ - super(Ident, self).__init__(span) - self.val = val - - def __hash__(self): - return hash(self.val) - - def __eq__(self, other): - return (isinstance(other, StringLit) or isinstance(other, Ident))\ - and self.val == other.inner_val() - - def __ne__(self, other): - return not self.__eq__(other) - - def __str__(self): - return "Ident< {} >".format(self.val) - - def into_unmodified_str(self): - return self.val - - def inner_val(self): - return self.val - - -class DotPath(ASTNode): - def __init__(self, span, varname, properties): - """ - :type span: Span - :param span: Span for this dotpath. - :type varname: Ident | StringLit - :param varname: Name of the variable being changed. - :type properties: list[StringLit | Ident] - :param properties: Properties being accessed. - """ - super(DotPath, self).__init__(span) - self.varname = varname - self.properties = properties - - def next_dot_path(self): - """ - Assuming the properties length is more than zero. - This returns the dot path where the varname has been - dropped. So given 'a.b.c' the returned dot path will - be 'b.c'. - - :rtype: DotPath - :return: Returns the next dot path. - """ - return DotPath( - self.span.new_with_lo(self.properties[0].span.lo), - self.properties[0], - self.properties[1:] - ) - - def into_unmodified_str(self): - arr = [self.varname.into_unmodified_str()] - arr.extend([x.into_unmodified_str() for x in self.properties]) - return '.'.join(arr) - - def __str__(self): - arr = [str(self.varname)] - arr.extend([str(x) for x in self.properties]) - return 'DotPath< {} >'.format('.'.join(arr)) - - def __key(self): - return self.into_unmodified_str().replace('"', '') - - def __eq__(self, other): - return self.__key() == other.__key() - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.__key()) - - -class Expr(ASTNode): - def __init__(self, span, expr_tree): - """ - Construct an expression - :type span: Span - :param span: Span for the expression. - :type expr_tree: p.ParseResults - ;:param expr_tree: The tree generated by pyparsing.infixNotation - """ - super(Expr, self).__init__(span) - # We don't use this tree at this point. - # During typecheck we will make sure - # that the expression can evaluate - # Finally during evaluation, we will evaluate - # the final result. - if isinstance(expr_tree, p.ParseResults): - expr_tree = expr_tree.asList() - if isinstance(expr_tree, list): - for i in range(0, len(expr_tree)): - if isinstance(expr_tree[i], list): - expr_tree[i] = Expr(span, expr_tree[i]) - self.expr_tree = expr_tree - else: - self.expr_tree = [expr_tree] - - def into_unmodified_str(self): - # TODO(Joan): reconstruct the original expression - return 'expression' - - def __str__(self): - return "Expr< {} >".format(strut.array_to_str(self.expr_tree)) - - -class JsonObj(ASTNode): - def __init__(self, span, tokens): - super(JsonObj, self).__init__(span) - self.props = {} - last_prop = None - if len(tokens) > 0: - for toks in tokens: - for tok in toks: - if isinstance(tok, DotPath): - if last_prop is None: - last_prop = tok - else: - self._set_new_prop(last_prop, tok) - last_prop = None - elif isinstance(tok, StringLit): - if last_prop is None: - last_prop = tok - else: - self._set_new_prop(last_prop, tok) - last_prop = None - elif isinstance(tok, list): - if last_prop is None: - raise p.ParseFatalException( - "Bug Found in JsonObj!" - ) - self._set_new_prop( - last_prop, - JsonObj.dictify_array(tok) - ) - last_prop = None - else: - if last_prop is None: - raise p.ParseFatalException( - "Bug Found in JsonObj!" - ) - self._set_new_prop(last_prop, tok) - last_prop = None - - def _set_new_prop(self, prop, token): - if prop in self.props: - raise exception.BananaJsonObjShadowingError(self.span, prop.span) - else: - self.props[prop] = token - - def into_unmodified_str(self): - # TODO(Joan): improve this for error reporting - return str(self.props) - - def __str__(self): - return "JsonObj< {} >".format(strut.dict_to_str(self.props)) - - @staticmethod - def dictify_array(tok): - new_array = [] - for el in tok: - if isinstance(el, list): - new_array.append(JsonObj.dictify_array(el)) - else: - new_array.append(el) - return new_array - - -def into_connection(ast_node): - """ - Convert an ast node into a Connection node. - :type ast_node: Connection | Ident - :param ast_node: The ast node to convert. - :rtype: Connection - :return: Returns a Connection node - """ - if isinstance(ast_node, Connection): - return ast_node - elif isinstance(ast_node, Ident): - return Connection( - ast_node.span, - [ast_node], - [ast_node] - ) - else: - raise p.ParseFatalException("Bug found!") - - -class Connection(ASTNode): - - def __init__(self, span, inputs=None, outputs=None, connections=None): - """ - Create a connection object. - :type span: Span - :param span: Span for this connection - :type inputs: list[Ident] - :param inputs: Input ast nodes of the connection - :type outputs: list[Ident] - :param outputs: Outputs nodes - :type connections: list[(Ident, Ident)] - :param connections: The list of connections aggregated so far. - """ - super(Connection, self).__init__(span) - if inputs is None: - inputs = [] - if outputs is None: - outputs = [] - if connections is None: - connections = [] - self.inputs = inputs - self.outputs = outputs - self.connections = connections - self.connections_cache = {} - self._build_connection_cache() - - def connect_to(self, other_con, emitter): - """ - Connect this connection to the other one. - After this function has been executed, the other_con - object can be dropped. - :type other_con: Connection - :param other_con: Other connection to connect to. - :type emitter: emit.Emitter - :param emitter: Emitter. - """ - self.span.hi = max(other_con.span.hi, self.span.hi) - self.span.lo = min(other_con.span.lo, self.span.lo) - old_outputs = self.outputs - self.outputs = other_con.outputs - - # Generate new connections - for old_output in old_outputs: - for other_input in other_con.inputs: - self._check_and_connect(old_output, other_input, emitter) - - # Preserve old connections - self._merge_connections(other_con, emitter) - - def merge_all(self, tokens, emitter): - """ - Merge all the tokens with this class - :type tokens: list[list[Connection | Ident]] - :param tokens: List of list of tokens - :type emitter: emit.Emitter - :param emitter: Emitter to report errors - """ - if len(tokens) == 1: - if len(tokens[0]) > 0: - for tok in tokens[0]: - other_con = into_connection(tok) - self.merge_with(other_con, emitter) - - def merge_and_reset_inputs_outputs(self, other_con, emitter): - """ - Merge this connection with other_con and reset inputs / outputs - as they're no longer necessary. - :type other_con: Connection - :param other_con: the other connection we are gonna merge with. - :type emitter: emit.Emitter - :param emitter: Emitter to report errors - """ - self.inputs = [] - self.outputs = [] - self._merge_connections(other_con, emitter) - - def merge_with(self, other_con, emitter): - """ - Merge the provided connection with this one. - :type other_con: Connection - :param other_con: Connection to merge with self. - :type emitter: emit.Emitter - :param emitter: Emitter to report errors - """ - def extend(into, iterable, what): - for other_thing in iterable: - if len(list(filter(lambda x: x.val == other_thing.val, - into))) > 0: - emitter.emit_warning( - other_thing.span, - "{} {} already present".format( - what, other_thing.val - ) - ) - else: - into.append(other_thing) - extend(self.inputs, other_con.inputs, 'Input') - extend(self.outputs, other_con.outputs, 'Output') - self._merge_connections(other_con, emitter) - - def _merge_connections(self, other_con, emitter): - """ - Merge only the connections field from other_con into self. - :type other_con: Connection - :param other_con: Connection to merge with self. - :type emitter: emit.Emitter - :param emitter: Emitter to report errors - """ - for ident_from, ident_to in other_con.connections: - self._check_and_connect(ident_from, ident_to, emitter) - - def _check_and_connect(self, ident_from, ident_to, emitter): - """ - Check if the connection does not already exists and if it does not, - add it to the list of connections. Otherwise report a warning and - do nothing. - - :type ident_from: Ident - :param ident_from: The 'From' node of the directed edge. - :type ident_to: Ident - :param ident_to: The 'To' node of the directed edge we are creating. - :type emitter: emit.Emitter - :param emitter: Emitter to report errors. - """ - if ident_from.val in self.connections_cache: - if ident_to.val in self.connections_cache[ident_from.val]: - emitter.emit_warning( - ident_to.span, - "Connection from '{}' to '{}'" - " is already present" - .format(ident_from.val, ident_to.val) - ) - return - self.connections_cache[ident_from.val].append(ident_to.val) - else: - self.connections_cache[ident_from.val] = [ident_to.val] - self.connections.append((ident_from, ident_to)) - - def _build_connection_cache(self): - """ - Build a cache of connections keyed by where they start from. - """ - for ident_from, ident_to in self.connections: - if ident_from.val not in self.connections_cache: - self.connections_cache[ident_from.val] = [] - if ident_to.val not in self.connections_cache: - self.connections_cache[ident_to.val] = [] - self.connections_cache[ident_from.val].append(ident_to.val) - # Sanity check - for _, vals in self.connections_cache: - if len(set(vals)) != len(vals): - raise p.ParseFatalException("Bug found in Connection!!") - - def into_unmodified_str(self): - # TODO(Joan): improve this - return "connection" - - def __str__(self): - res = "Connection<" - res += " {} ".format([(str(x[0]), str(x[1])) - for x in self.connections]) - res += ">" - return res - - -class Assignment(ASTNode): - - def __init__(self, span, dot_path, value): - """ - Construct an assignment AST node. - :type span: Span - :param span: the span of the assignment. - :type dot_path: DotPath - :param dot_path: the left hand side of the assignment. - :type value: Component | Number | StringLit | JsonObj | DotPath | Expr - :param value: the right hand side of the assignment. - """ - super(Assignment, self).__init__(span) - if (isinstance(value, Component) or - isinstance(value, JsonObj) or - isinstance(value, Number) or - isinstance(value, StringLit) or - isinstance(value, Ident) or - isinstance(value, DotPath) or - isinstance(value, Expr)) and\ - isinstance(dot_path, DotPath): - self.lhs = dot_path - self.rhs = value - else: - raise exception.BananaGrammarBug( - 'Impossible assignment found with' - ' left hand side: {} and' - ' right hand side: {}' - .format(type(dot_path), type(value)) - ) - - def into_unmodified_str(self): - return "{} = {}".format(self.lhs.into_unmodified_str(), - self.rhs.into_unmodified_str()) - - def __str__(self): - return "{} = {}".format(str(self.lhs), str(self.rhs)) - - -class ComponentCtorArg(ASTNode): - - def __init__(self, span, value, arg_name=None): - """ - Construct an argument for a component ctor - :type span: Span - :param span: Span of the argument. - :type value: Number | StringLit | JsonObj | DotPath | Expr - :param value: Value for the argument - :type arg_name: Ident - :param arg_name: Name of the argument - """ - super(ComponentCtorArg, self).__init__(span) - if (isinstance(value, JsonObj) or - isinstance(value, Number) or - isinstance(value, StringLit) or - isinstance(value, Ident) or - isinstance(value, DotPath) or - isinstance(value, Expr)) and ( - isinstance(arg_name, Ident) or - arg_name is None): - self.arg_name = arg_name - self.value = value - else: - # This code should be unreachable. - # The grammar as defined should prevent us from - # seeing an arg value or a value of the incorrect type - raise exception.BananaGrammarBug( - 'Impossible constructor argument found with' - ' left hand side: {} and' - ' right hand side: {}' - .format(type(arg_name), type(value)) - ) - - def into_unmodified_str(self): - return "{} = {}".format(self.arg_name.into_unmodified_str(), - self.value.into_unmodified_str()) - - def __str__(self): - if self.arg_name is not None: - return "{} = {}".format(self.arg_name, self.value) - else: - return "{}".format(self.value) - - -class Component(ASTNode): - - def __init__(self, span, type_name=None, args=None): - """ - Construct a component - :type span: Span - :param span: Span of this component - :type type_name: Ident - :param type_name: Name of this component - :type args: list[ComponentCtorArg] - :param args: List of arguments - """ - super(Component, self).__init__(span) - if args is None: - args = [] - self.type_name = type_name - self.args = args - - def set_ctor(self, type_name): - """ - Set the constructor name of that component - :type type_name: Ident - :param type_name: Name of that constructor - """ - self.type_name = type_name - - def add_arg(self, arg): - """ - Add an argument to that component constructor. - :type arg: ComponentCtorArg - :param arg: Argument to add to that component. - """ - self.args.append(arg) - - def into_unmodified_str(self): - return self.type_name.into_unmodified_str() + "(" + \ - ', '.join(map(lambda x: x.into_unmodified_str(), self.args)) +\ - ")" - - def __str__(self): - res = "" - res += "Component {" - res += " type_name: {},".format(self.type_name) - arr = ', '.join(map(lambda x: str(x), self.args)) - res += " args: {}".format("[" + arr + "]") - res += "}" - return res diff --git a/monasca_analytics/banana/grammar/base_ast.py b/monasca_analytics/banana/grammar/base_ast.py deleted file mode 100644 index 6310888..0000000 --- a/monasca_analytics/banana/grammar/base_ast.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import six - - -@six.add_metaclass(abc.ABCMeta) -class ASTNode(object): - """ - Base class of all ast nodes - """ - def __init__(self, span): - """ - Construct an ASTNode - :type span: Span - :param span: span for this AST node. - """ - self.span = span - - @abc.abstractmethod - def into_unmodified_str(self): - """ - Returns a simple name for this ASTNode. It should be minimalist - and user oriented. No span info, no debug info. - :rtype: str - :returns: A simple name for that ast node. - """ - pass - - def __ne__(self, other): - return not self.__eq__(other) - - -class Span(object): - """ - Represent a region of code, used for error reporting. - Position are absolute within the file. - """ - - def __init__(self, text, lo, hi): - """ - :type text: str | None - :param text: Full text of the file - :type lo: int - :param lo: position of the beginning of the region - :type hi: int - :param hi: position of the end of the region - """ - self._text = text - self.lo = lo - self.hi = hi - - def __str__(self): - if self._text is not None: - return self._text[self.lo:self.hi] - else: - return '?SPAN?' - - def new_with_lo(self, lo_val): - """ - Construct a new Span with an new value for - lo. - - :type lo_val: int - :param lo_val: New value for lo. - :rtype: Span - :return: Returns a new span - """ - return Span(self._text, lo_val, self.hi) - - def str_from_to(self, to_span): - """ - Returns a string that start at self and stops at to_span. - :type to_span: Span - :param to_span: Span to stop at. - :rtype: six.string_types - :return: Returns the string encapsulating both - """ - return self._text[self.lo:to_span.hi] - - def get_line(self): - """ - Returns the line for associated with this span. - """ - if self._text is not None: - splitted = self._text.splitlines() - current_pos = 0 - for line in splitted: - if current_pos < self.lo < len(line) + current_pos: - return line.strip() - else: - current_pos += len(line) - else: - return '?LINE?' - - def get_range(self): - """ - Returns the start and end (line number, column number) of this span. - """ - if self._text is not None: - splitted = self._text.splitlines() - current_pos = 0 - startlineno = 0 - startcolno = 0 - endlineno = 0 - endcolno = 0 - for lineno in range(0, len(splitted)): - line = splitted[lineno] - if current_pos <= self.lo <= len(line) + current_pos: - startlineno = lineno + 1 - startcolno = self.lo - current_pos + 1 - if current_pos <= self.hi <= len(line) + current_pos: - endlineno = lineno + 1 - endcolno = self.hi - current_pos + 1 - current_pos += len(line) + 1 - return (startlineno, startcolno), (endlineno, endcolno) - else: - return (0, 0), (0, 0) - - def get_lineno(self): - """ - Returns the line number of this span. - """ - if self._text is not None: - splitted = self._text.splitlines() - current_pos = 0 - lineno = 0 - for _ in range(0, len(splitted)): - line = splitted[lineno] - if current_pos < self.lo < len(line) + current_pos: - return lineno + 1 - else: - current_pos += len(line) - lineno += 1 - return lineno - else: - return -1 - -DUMMY_SPAN = Span(None, 0, 0) - - -def from_pyparsing_exception(parse_fatal_exception): - """ - Convert the provided ParseFatalException into a Span. - - :type parse_fatal_exception: pyparsing.ParseBaseException - :param parse_fatal_exception: Exception to convert. - :rtype: Span - :return: Returns the span mapping to that fatal exception. - """ - return Span( - parse_fatal_exception.pstr, - parse_fatal_exception.loc, - parse_fatal_exception.loc + 1 - ) diff --git a/monasca_analytics/banana/grammar/config.py b/monasca_analytics/banana/grammar/config.py deleted file mode 100644 index 9dc468c..0000000 --- a/monasca_analytics/banana/grammar/config.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import pyparsing as p - -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.banana.grammar.const as const -import monasca_analytics.exception.banana as exception - - -# This file describe the grammar for the banana config file. -# It make use of one sub grammar for certain configuration -# that requires expressions (see expression.py file) - - -def banana_grammar(emitter=emit.PrintEmitter()): - """ - Generate a banana parser that can be then used to - parse a banana content. It build an AST on which - operation can then be applied. - :return: Return a banana parser - :rtype: BananaScopeParser - """ - # Should debug - debug_grammar = False - - # Actions - def action_str_lit(s, l, t): - return ast.StringLit(ast.make_span(s, l, t), t[0]) - - def action_num_lit(s, l, t): - return ast.Number(ast.make_span(s, l, t), t[0]) - - def action_ident(s, l, t): - return ast.Ident(ast.make_span(s, l, t), t[0]) - - def action_expr(s, l, t): - if len(t) != 1: - raise exception.BananaGrammarBug( - 'Bug found in the grammar for expression,' - ' Please report this bug.' - ) - if isinstance(t[0], ast.Expr): - return t[0] - return ast.Expr(ast.make_span(s, l, t), t[0]) - - def action_dot_path(s, l, t): - # First token is the name of the variable - # The rest is the property path - if isinstance(t[0], ast.StringLit) and len(t[1:]) == 0: - return t[0] - return ast.DotPath(ast.make_span(s, l, t), t[0], t[1:]) - - def action_json_obj(s, l, t): - return ast.JsonObj(ast.make_span(s, l, t), t) - - def action_parse_ctor_arg(s, l, t): - if len(t) > 1: - return ast.ComponentCtorArg(ast.make_span(s, l, t), t[1], t[0]) - else: - return ast.ComponentCtorArg(ast.make_span(s, l, t), t[0]) - - def action_parse_comp_ctor(s, l, tokens): - comp = ast.Component(ast.make_span(s, l, tokens)) - for tok in tokens: - if isinstance(tok, ast.Ident): - comp.set_ctor(tok) - elif isinstance(tok, ast.ComponentCtorArg): - comp.add_arg(tok) - else: - raise exception.BananaGrammarBug( - 'Bug found in the grammar, Please report this bug' - ) - return comp - - def action_assignment(s, l, t): - return ast.Assignment(ast.make_span(s, l, t), t[0], t[1]) - - def action_create_connections(s, l, t): - ast_conn = ast.into_connection(t[0]) - ast_conn.span = ast.make_span(s, l, t) - for i in range(1, len(t)): - next_conn = ast.into_connection(t[i]) - ast_conn.connect_to(next_conn, emitter) - return ast_conn - - def action_merge_connections(s, l, t): - ast_conn = ast.Connection(ast.make_span(s, l, t)) - ast_conn.merge_all(t, emitter) - return ast_conn - - def action_root_ast(s, l, tokens): - root = ast.BananaFile(emitter) - for tok in tokens: - if isinstance(tok, ast.Assignment): - if isinstance(tok.rhs, ast.Component): - root.add_component_ctor(tok.lhs, tok.rhs) - else: - root.add_assignment(tok.lhs, tok.rhs) - elif isinstance(tok, ast.Connection): - root.add_connections(tok) - else: - raise exception.BananaGrammarBug( - 'Bug found in the grammar, Please report this bug.' - ) - return root - - # TODO(Joan): Remove once it is no longer needed - def print_stmt(s, l, t): - print("\nPRINT AST") - print((l, [str(x) for x in t])) - print("END PRINT AST\n") - - def action_unimplemented(s, l, t): - raise exception.BananaGrammarBug("unimplemented code reached") - - # Tokens - equals = p.Literal("=").suppress().setName('"="').setDebug(debug_grammar) - arrow = p.Literal("->").suppress().setName('"->"').setDebug(debug_grammar) - lbra = p.Literal("[").suppress().setName('"["').setDebug(debug_grammar) - rbra = p.Literal("]").suppress().setName('"]"').setDebug(debug_grammar) - colon = p.Literal(":").suppress().setName('":"') - comma = p.Literal(",").suppress().setName(",") - less = p.Literal("<").suppress().setName('"<"') - greater = p.Literal(">").suppress().setName('">"') - lbrace = p.Literal("{").suppress().setName('"{"').setDebug(debug_grammar) - rbrace = p.Literal("}").suppress().setName('"}"').setDebug(debug_grammar) - lpar = p.Literal("(").suppress().setName('"("') - rpar = p.Literal(")").suppress().setName('")"') - - # Keywords - ing = p.Literal("ing").suppress() - imp = p.Literal("import").suppress() - fro = p.Literal("from").suppress() - - # String Literal, Numbers, Identifiers - string_lit = p.quotedString()\ - .setParseAction(action_str_lit)\ - .setName(const.STRING_LIT) - number_lit = p.Regex(r'\d+(\.\d*)?([eE]\d+)?')\ - .setParseAction(action_num_lit)\ - .setName(const.NUMBER) - ident = p.Word(p.alphas + "_", p.alphanums + "_")\ - .setParseAction(action_ident)\ - .setName(const.IDENT) - - # Path for properties - dot_prop = ident | string_lit - dot_path = p.delimitedList(dot_prop, ".")\ - .setParseAction(action_dot_path)\ - .setName(const.DOT_PATH)\ - .setDebug(debug_grammar) - - # Expressions - - # Here to simplify the logic, we can match directly - # against ident and string_lit to avoid having to deal - # only with dot_path. It also allow to remove the confusion - # where '"a"' could be interpreted as a dot_path and would thus - # be the same as 'a'. With the following, the first we - # always be type-checked as a String whereas the latter will - # be as the type of the variable. - expr = p.infixNotation(number_lit | dot_path, [ - (p.oneOf('* /'), 2, p.opAssoc.LEFT), - (p.oneOf('+ -'), 2, p.opAssoc.LEFT), - ], lpar=lpar, rpar=rpar) - expr.setParseAction(action_expr)\ - .setName(const.EXPR)\ - .setDebug(debug_grammar) - - # Json-like object (value are much more) - json_obj = p.Forward() - json_value = p.Forward() - json_array = p.Group( - lbra + p.Optional(p.delimitedList(json_value)) + rbra - ) - json_array.setDebug(debug_grammar) - json_array.setName(const.JSON_ARRAY) - json_value <<= expr | json_obj | json_array - json_value.setDebug(debug_grammar)\ - .setName(const.JSON_VALUE) - json_members = p.delimitedList(p.Group(dot_path + colon - json_value)) +\ - p.Optional(comma) - json_members.setDebug(debug_grammar)\ - .setName(const.JSON_MEMBERS) - json_obj <<= p.Dict(lbrace + p.Optional(json_members) - rbrace) - json_obj.setParseAction(action_json_obj)\ - .setName(const.JSON_OBJ)\ - .setDebug(debug_grammar) - - # Component constructor - arg = (ident + equals - (expr | json_obj)) | expr | json_obj - arg.setParseAction(action_parse_ctor_arg) - params = p.delimitedList(arg) - comp_ctor = ident + lpar - p.Optional(params) + rpar - comp_ctor.setParseAction(action_parse_comp_ctor)\ - .setName(const.COMP_CTOR)\ - .setDebug(debug_grammar) - - # Assignments - assignment = dot_path + equals - (comp_ctor | expr | json_obj) - assignment.setParseAction(action_assignment) - - # Connections - connection = p.Forward() - array_of_connection = p.Group( - lbra + p.Optional(p.delimitedList(connection)) + rbra - ) - array_of_connection.setParseAction(action_merge_connections) - last_expr = ident | array_of_connection - this_expr = p.Forward() - match_expr = p.FollowedBy(last_expr + arrow - last_expr) + \ - (last_expr + p.OneOrMore(arrow - last_expr)) - this_expr <<= match_expr | last_expr - connection <<= this_expr - - match_expr.setDebug(debug_grammar)\ - .setName(const.CONNECTION) \ - .setParseAction(action_create_connections) - - # Definitions - definition = ing - less - string_lit - greater - ident - lbrace - rbrace - definition.setDebug(debug_grammar)\ - .setName(const.DEFINITION)\ - .setParseAction(action_unimplemented) - - # Import directive - module_def = (imp - ident) | fro - ident - imp - ident - module_def.setDebug(debug_grammar)\ - .setName(const.MOD_IMPORT)\ - .setParseAction(action_unimplemented) - - # Comments - comments = "#" + p.restOfLine - - statement = assignment | \ - match_expr | \ - definition | \ - module_def - - statement.setName(const.STATEMENT) - statement.setDebug(debug_grammar) - statement.setParseAction(print_stmt) - - # Grammar - grammar = p.OneOrMore(statement).ignore(comments) - grammar.setParseAction(action_root_ast) - - return BananaScopeParser(grammar) - - -class BananaScopeParser(object): - """ - Aggregate and resolve conflicts as everything was define - within the same scope. Usefull for have cpp "include"-like - functionality when importing another file. - """ - - def __init__(self, grammar): - self._grammar = grammar - - def parse(self, string): - """ - Parse the given input string. - :type string: str - :param string: Input string. - :rtype: ast.BananaFile - :return: Returns the ast root. - """ - tree = self._grammar.parseString(string, parseAll=True)[0] - return tree diff --git a/monasca_analytics/banana/grammar/const.py b/monasca_analytics/banana/grammar/const.py deleted file mode 100644 index 167196a..0000000 --- a/monasca_analytics/banana/grammar/const.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -ASSIGNMENT = "assignment" -CONNECTION = "connection" -DEFINITION = "definition" -MOD_IMPORT = "mod_import" -DOT_PATH = "path" -NUMBER = "number" -STRING_LIT = "string_lit" -IDENT = "ident" -EXPR = "expression" -JSON_OBJ = "jsonlike_obj" -STATEMENT = "statement" -JSON_ARRAY = "jsonlike_array" -JSON_VALUE = "jsonlike_value" -JSON_MEMBERS = "jsonlike_members" -COMP_CTOR = "component_ctor" diff --git a/monasca_analytics/banana/pass_manager.py b/monasca_analytics/banana/pass_manager.py deleted file mode 100644 index 36a4ca5..0000000 --- a/monasca_analytics/banana/pass_manager.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import pyparsing as p - -import monasca_analytics.banana.deadpathck.config as deadpathck -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.eval.config as ev -import monasca_analytics.banana.eval.ctx as ctx -import monasca_analytics.banana.grammar.base_ast as span_util -import monasca_analytics.banana.grammar.config as grammar -import monasca_analytics.banana.typeck.config as typeck -import monasca_analytics.exception.banana as exception - - -def execute_banana_string(banana, driver=None, emitter=emit.PrintEmitter()): - """ - Execute the provided banana string. - It will run the parse phase, and the typechecker. - :type banana: str - :param banana: The string to parse and type check. - :type driver: monasca_analytics.spark.driver.DriverExecutor | None - :param driver: Driver that will manage the created - components and connect them together. - :type emitter: emit.Emitter - :param emitter: Emitter for reporting errors/warning. - """ - try: - # Convert the grammar into an AST - parser = grammar.banana_grammar(emitter) - ast = parser.parse(banana) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table, emitter) - # Check that there's at least one path to be executed - deadpathck.contains_at_least_one_path_to_a_sink(ast, type_table) - # Evaluate the script - if driver is not None: - ev.eval_ast(ast, type_table, driver) - except exception.BananaException as err: - emitter.emit_error(err.get_span(), str(err)) - except p.ParseSyntaxException as err: - emitter.emit_error(span_util.from_pyparsing_exception(err), err.msg) - except p.ParseFatalException as err: - emitter.emit_error(span_util.from_pyparsing_exception(err), err.msg) - except p.ParseException as err: - emitter.emit_error(span_util.from_pyparsing_exception(err), err.msg) - - -def try_compute_type_table(banana): - """ - Compute the type table for the provided banana string - if possible. Does not throw any exception if it fails. - :type banana: str - :param banana: The string to parse and type check. - """ - try: - # Convert the grammar into an AST - parser = grammar.banana_grammar() - ast = parser.parse(banana) - # Compute the type table for the given AST - return typeck.typeck(ast) - except exception.BananaException: - return None - except p.ParseSyntaxException: - return None - except p.ParseFatalException: - return None - except p.ParseException: - return None - - -def compute_type_table(banana): - """ - Compute the type table for the provided banana string - if possible. - :type banana: str - :param banana: The string to parse and type check. - """ - # Convert the grammar into an AST - parser = grammar.banana_grammar() - ast = parser.parse(banana) - # Compute the type table for the given AST - return typeck.typeck(ast) - - -def compute_evaluation_context(banana, cb=lambda *a, **k: None): - """ - Compute the evaluation context for the provided - banana string. - :type banana_str: str - :param banana_str: The string to parse and type check. - :param cb: Callback called after each statement - """ - parser = grammar.banana_grammar() - ast = parser.parse(banana) - type_table = typeck.typeck(ast) - context = ctx.EvaluationContext() - - def custom_cb(_type, lhs, value): - cb(context, _type, lhs, value) - - ev.eval_statements_generic(ast.statements, type_table, context, custom_cb) diff --git a/monasca_analytics/banana/typeck/README.md b/monasca_analytics/banana/typeck/README.md deleted file mode 100644 index 226b1ed..0000000 --- a/monasca_analytics/banana/typeck/README.md +++ /dev/null @@ -1,85 +0,0 @@ -## Type-checker - -This folder is all about the type checking of `banana` files. -The type checker purpose is to verify that components exist, -the type of local variable matches the requirements of components -parameters and assignments between them are correct. It also -checks that connections between components are valid. - -The biggest difference between the old `validation` of the JSON -format is that we have more information available. We can warn -users when they make mistakes and point at the exact locations -using `Span`. Also, the type table generated is used by other passes -to perform other static analyses. - -This is the second step of the pipeline: -``` - +-------+ +---------------------+ - | | | | - ---> | AST | ---- typeck ---> | AST & TypeTable | ---> - | | | | - +-------+ +---------------------+ -``` - -The module `type_util.py` contains all the possible types that are -known by the type checker. The `TypeTable` built lives in the -`type_table.py` module. - -### Current status - -* [x] Type check numbers -* [x] Type check string literals -* [x] Type check variable assignments -* [x] Type check component assignments -* [x] Type check component parameters -* [x] Type check connections -* [x] Resolve variable names -* [ ] Resolve imports -* [ ] Type check disconnections - -### Tests - -All tests for the type checker (i.e. making sure that -inferred types are correct and that errors are raised in -appropriate situation) lives in `test/banana/typeck`. - -This folder looks like this: - -``` -test/banana/typeck -├── should_fail -│   ├── ... -│   └── file.banana -├── should_pass -│   ├── ... -│   └── file.banana -└── test_typeck_config.py -``` - -The `test_typeck_config`, generates one test for each file -in the `should_pass` and `should_fail` directories. - -For each generated test, we basically run the following passes: - -* `grammar`: convert the input text into an AST. -* `typeck`: run the type checker. - -Tests can assert various things in `banana` comments: - - - In the `should_fail` directory, a test is expected to use - the `RAISE` instruction to specify a type of exceptions - that should be raised by the test. - - In the `should_pass` directory, a test is expected to not - raised any exception **and** to specify the state of the - `TypeTable` when the type checker has type checked everything - in the file. This is done with the `TYPE_TABLE_EQ` instruction. - - -#### Available instruction - -* `# RAISE `: Check that `exception-name` is raised. -* `# TYPE_TABLE_EQ ` -* `# NEW_TEST`: This instruction splits the file into two tests. However, - the expected exception or type table should still be the same. It - allows us to verify what should be semantically equivalent in the - grammar. \ No newline at end of file diff --git a/monasca_analytics/banana/typeck/__init__.py b/monasca_analytics/banana/typeck/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/banana/typeck/config.py b/monasca_analytics/banana/typeck/config.py deleted file mode 100644 index 2af0d78..0000000 --- a/monasca_analytics/banana/typeck/config.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.ingestor.base as ingestor -import monasca_analytics.ldp.base as ldp -import monasca_analytics.sink.base as sink -import monasca_analytics.sml.base as sml -import monasca_analytics.source.base as source -import monasca_analytics.voter.base as voter - -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.banana.typeck.connections as conn -import monasca_analytics.banana.typeck.type_table as typetbl -import monasca_analytics.banana.typeck.type_util as u -import monasca_analytics.exception.banana as exception -import monasca_analytics.exception.monanas as exception_monanas -import monasca_analytics.util.common_util as introspect - - -import six - - -def typeck(banana_file): - """ - Type-check the provided BananaFile instance. - If it type check, it returns the associated TypeTable. - :type banana_file: ast.BananaFile - :param banana_file: The file to typecheck. - :rtype: typetbl.TypeTable - :return: Returns the TypeTable for this BananaFile - """ - type_table = typetbl.TypeTable() - statement_index = 0 - for stmt in banana_file.statements: - lhs, rhs = stmt - type_computed = typeck_rhs(rhs, type_table) - type_table.set_type(lhs, type_computed, statement_index) - statement_index += 1 - conn.typeck_connections(banana_file.connections, type_table) - return type_table - - -def typeck_rhs(ast_value, type_table): - """ - Type-check the provided ast value. And returns its type. - This function does not support assignment, - :type ast_value: ast.ASTNode - :param ast_value: The ast_value to type check. - :type type_table: typetbl.TypeTable - :param type_table: The type table. Used for type lookup. - :rtype: u.Component | u.Object | u.Number | u.String - :return: Returns the computed type. - """ - if isinstance(ast_value, ast.Number): - return u.Number() - if isinstance(ast_value, ast.StringLit): - return u.String() - if isinstance(ast_value, ast.Ident): - return type_table.get_type(ast_value) - if isinstance(ast_value, ast.DotPath): - return type_table.get_type(ast_value) - if isinstance(ast_value, ast.Expr): - return typeck_expr(ast_value, type_table) - if isinstance(ast_value, ast.JsonObj): - return typeck_jsonobj(ast_value, type_table) - if isinstance(ast_value, ast.Component): - return typeck_component(ast_value, type_table) - raise Exception("Unhandled ast value type {}!!".format(ast_value)) - - -def typeck_jsonobj(json_obj, type_table): - """ - Type-check a json-like object. If it succeeds - it return the appropriate type describing this - json like object. Raise an exception otherwise. - :type json_obj: ast.JsonObj - :param json_obj: The JsonObj ast node. - :type type_table: typetbl.TypeTable - :param type_table: The type table. - :rtype: u.Object - :return: Returns an instance of util.Object describing - the full type of this json object. - """ - root_type = u.Object(strict_checking=False) - - for k, v in six.iteritems(json_obj.props): - sub_type = u.create_object_tree(k, typeck_rhs(v, type_table)) - u.attach_to_root(root_type, sub_type, json_obj.span) - - return root_type - - -def typeck_expr(expr, type_table): - """ - Type-check the given expression. If the typecheck - pass, the resulting type will be used for the strategy - to use when evaluating this expression. - :type expr: ast.Expr - :param expr: The expression to typecheck. - :type type_table: typetbl.TypeTable - :param type_table: Type of the table - :rtype: u.Number | u.String - :return: Returns the type of the expression if possible - :raise: Raise an exception - """ - # In the case where we are just wrapping around - # only one expression, the logic below - # needs to be skipped. - if len(expr.expr_tree) == 1: - return typeck_rhs(expr.expr_tree[0], type_table) - - _type = None - must_be_number = False - - def check_type(old_type, new_type): - if new_type == old_type: - return old_type - elif new_type == u.String(): - if must_be_number: - raise exception.BananaTypeError( - expected_type=u.Number, - found_type=new_type - ) - if old_type is None: - return new_type - elif u.can_to_str(old_type): - return new_type - else: - raise exception.BananaTypeError( - expected_type=old_type, - found_type=new_type - ) - elif new_type == u.Number(): - if old_type is None: - return new_type - elif old_type == u.String(): - return old_type - elif not old_type == u.Number(): - raise exception.BananaTypeError( - expected_type=old_type, - found_type=new_type - ) - else: - raise exception.BananaTypeError( - expected_type=old_type, - found_type=new_type - ) - - def allowed_symbol(current_type): - if current_type == u.String(): - return ['+'] - else: - return ['+', '-', '*', '/'] - - for el in expr.expr_tree: - if isinstance(el, ast.StringLit): - _type = check_type(_type, u.String()) - elif isinstance(el, ast.Number): - _type = check_type(_type, u.Number()) - elif isinstance(el, ast.Ident): - ident_type = type_table.get_type(el) - _type = check_type(_type, ident_type) - elif isinstance(el, ast.DotPath): - dotpath_type = type_table.get_type(el) - _type = check_type(_type, dotpath_type) - elif isinstance(el, ast.Expr): - _type = check_type(_type, typeck_expr(el, type_table)) - elif isinstance(el, six.string_types): - if el not in allowed_symbol(_type): - raise exception.BananaUnknownOperator(expr.span, el, _type) - if el in ['-', '*', '/']: - must_be_number = True - else: - raise exception.BananaTypeError( - expected_type=[u.Number.__name__, u.String.__name__, - u.Object.__name__], - ) - - # The final type if we made until here! - return _type - - -def typeck_component(component, type_table): - """ - Type-check the provided component. Returns - the appropriate subclass of util.Component if - successful, or raise an exception if there's - an error. - :type component: ast.Component - :param component: The component ast node. - :type type_table: typetbl.TypeTable - :param type_table: the type table. - :rtype: u.Source | u.Sink | u.Voter | u.Ldp | u.Sml | u.Ingestor - :return: Returns the appropriate type for the component. - """ - # TODO(Joan): This wont't work for type that are defined - # TODO(Joan): at the language level. We need a registration service - # TODO(Joan): to manage the Types of component that we can create - # TODO(Joan): instead of this hacky function call. - try: - component_type = introspect.get_class_by_name(component.type_name.val) - comp_params = component_type.get_params() - except exception_monanas.MonanasNoSuchClassError: - raise exception.BananaUnknown( - component - ) - - # Compute the type of the component - if issubclass(component_type, source.BaseSource): - comp_type = u.Source(component_type.__name__, comp_params) - elif issubclass(component_type, sink.BaseSink): - comp_type = u.Sink(component_type.__name__, comp_params) - elif issubclass(component_type, sml.BaseSML): - comp_type = u.Sml(component_type.__name__, comp_params) - elif issubclass(component_type, voter.BaseVoter): - comp_type = u.Voter(component_type.__name__, comp_params) - elif issubclass(component_type, ldp.BaseLDP): - comp_type = u.Ldp(component_type.__name__, comp_params) - elif issubclass(component_type, ingestor.BaseIngestor): - comp_type = u.Ingestor(component_type.__name__, comp_params) - else: - raise exception.BananaTypeCheckerBug("Couldn't find a type for '{}'" - .format(component.type_name.val)) - - # Type check the parameters - if len(component.args) > len(comp_params): - raise exception.BananaComponentTooManyParams(component.span) - - # Does saying that parameter should either all have a name - # or non at all satisfying? -> Yes - # Are parameter all named? - all_named = -1 - for arg in component.args: - if arg.arg_name is not None: - if all_named == 0: - raise exception.BananaComponentMixingParams(arg.span, False) - all_named = 1 - else: - if all_named == 1: - raise exception.BananaComponentMixingParams(arg.span, True) - all_named = 0 - - if all_named == 1: - for arg in component.args: - param = list(filter(lambda x: - x.param_name == arg.arg_name.inner_val(), - comp_params)) - if len(param) != 1: - raise exception.BananaComponentIncorrectParamName( - component=component.type_name, - found=arg.arg_name - ) - param = param[0] - expr_type = typeck_rhs(arg.value, type_table) - if not u.can_be_cast_to(expr_type, param.param_type): - raise exception.BananaArgumentTypeError( - where=arg, - expected_type=param.param_type, - received_type=expr_type - ) - else: - for arg, param in zip(component.args, comp_params): - arg.arg_name = ast.Ident(arg.span, param.param_name) - expr_type = typeck_rhs(arg.value, type_table) - if not u.can_be_cast_to(expr_type, param.param_type): - raise exception.BananaArgumentTypeError( - where=arg, - expected_type=param.param_type, - received_type=expr_type - ) - - return comp_type diff --git a/monasca_analytics/banana/typeck/connections.py b/monasca_analytics/banana/typeck/connections.py deleted file mode 100644 index ff78fe6..0000000 --- a/monasca_analytics/banana/typeck/connections.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.banana.typeck.type_util as util -import monasca_analytics.exception.banana as exception - -valid_connections_types = { - util.Source: [util.Ingestor, util.Ldp], - util.Ingestor: [util.Sml, util.Sink], - util.Sml: [util.Voter, util.Sink], - util.Voter: [util.Ldp, util.Sink], - util.Ldp: [util.Sink], - util.Sink: [] -} - - -def typeck_connections(connection, type_table): - """ - Once all variable have been type-checked, we can - try to type-check connections. - :type connection: monasca_analytics.banana.grammar.ast.Connection - :param connection: The connection to type-check - :type type_table: monasca_analytics.banana.typeck.type_table.TypeTable - :param type_table: The table with all variable already type-checked. - :raise Raise an exception if there's a type error in connections. - """ - if connection is not None: - for ident_from, ident_to in connection.connections: - type_from = type_table.get_type(ident_from) - type_to = type_table.get_type(ident_to) - if not util.is_comp(type_from): - raise exception.BananaTypeError( - expected_type=util.Component(), - found_type=type_from - ) - if not util.is_comp(type_to): - raise exception.BananaTypeError( - expected_type=util.Component(), - found_type=type_to - ) - if type(type_to) not in valid_connections_types[type(type_from)]: - possible_types = map(lambda x: x.__name__, - valid_connections_types[type(type_from)]) - raise exception.BananaConnectionError( - connection.span, - ident_from, ident_to, type_from, possible_types - ) diff --git a/monasca_analytics/banana/typeck/type_table.py b/monasca_analytics/banana/typeck/type_table.py deleted file mode 100644 index 2db387f..0000000 --- a/monasca_analytics/banana/typeck/type_table.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy - -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.banana.typeck.type_util as util -import monasca_analytics.exception.banana as exception -import monasca_analytics.util.string_util as strut - - -import six - - -class TypeTable(object): - """ - Type table. Support lookup for JsonLike object. - Json-like object have properties that needs to be - type-checked. The TypeTable allows to store - that information as well. All type values are - rooted by their variable name. - - Every-time a variable type is erased, we create a new - snapshot of the variables types. This allow to have - variable where the type change as the statement are - being executed. - """ - def __init__(self): - self._variables_snapshots = [(0, {})] - self._variables = self._variables_snapshots[0][1] - - def get_type(self, var, statement_index=None): - variables = self.get_variables(statement_index) - if isinstance(var, ast.Ident): - if var in variables: - return variables[var] - else: - raise exception.BananaUnknown(var) - # If we encounter a dot path: - if isinstance(var, ast.DotPath): - if var.varname in variables: - if len(var.properties) > 0: - return variables[var.varname][var.next_dot_path()] - else: - return variables[var.varname] - else: - raise exception.BananaUnknown(var.varname) - raise exception.BananaTypeCheckerBug("Unkown type for {}".format(var)) - - def set_type(self, var, _type, statement_index): - """ - Set the type for the given var to _type. - - :type var: ast.Ident | ast.DotPath - :param var: The var to set a type. - :type _type: util.Object | util.Component | util.String | util.Number - :param _type: The type for the var. - :type statement_index: int - :param statement_index: The statement at which this assignment was - made. - """ - if _type is None: - raise exception.BananaTypeCheckerBug( - "'None' is not a valid banana type" - ) - - if isinstance(var, ast.Ident): - self._check_needs_for_snapshot(var, _type, statement_index) - self._variables[var] = _type - return - - if isinstance(var, ast.DotPath): - if util.is_comp(_type) and len(var.properties) > 0: - raise exception.BananaAssignCompError(var.span) - - if len(var.properties) == 0: - self._check_needs_for_snapshot( - var.varname, - _type, - statement_index - ) - self._variables[var.varname] = _type - else: - if var.varname in self._variables: - var_type = self._variables[var.varname] - if isinstance(var_type, util.Object): - new_type = util.create_object_tree( - var.next_dot_path(), _type) - util.attach_to_root(var_type, new_type, var.span, - erase_existing=True) - elif isinstance(var_type, util.Component): - var_type[var.next_dot_path()] = _type - else: - raise exception.BananaTypeError( - expected_type=util.Object, - found_type=type(var) - ) - # Var undeclared, declare its own type - else: - new_type = util.create_object_tree(var.next_dot_path(), - _type) - self._variables[var.varname] = new_type - return - raise exception.BananaTypeCheckerBug("Unreachable code reached.") - - def get_variables(self, statement_index=None): - """ - Returns the list of variables with their associated type. - - :type statement_index: int - :param: Statement index. - :rtype: dict[str, util.Object|util.Component|util.String|util.Number] - """ - if statement_index is None: - return self._variables - - variables = {} - for created_at, snap in self._variables_snapshots: - if created_at < statement_index: - variables = snap - else: - break - - return variables - - def get_variables_snapshots(self): - return self._variables_snapshots - - def _check_needs_for_snapshot(self, var, _type, statement_index): - if var in self._variables: - # If we shadow a component, we need to raise an error - if util.is_comp(self._variables[var]): - raise exception.BananaShadowingComponentError( - where=var.span, - comp=self._variables[var].class_name - ) - - # If we change the type of the variable, we create a new snapshot: - # This is very strict but will allow to know exactly how - # the type of a variable (or a property) changed. - if self._variables[var] != _type: - self._create_snapshot(statement_index) - - def _create_snapshot(self, statement_index): - """ - Create a new snapshot of the variables. - :type statement_index: int - :param statement_index: index of the statement - (should be strictly positive) - """ - new_snapshot = copy.deepcopy(self._variables) - self._variables_snapshots.append(( - statement_index, new_snapshot - )) - self._variables = new_snapshot - - def to_json(self): - """ - Convert this type table into a dictionary. - Useful to serialize the type table. - - :rtype: dict - :return: Returns this type table as a dict. - """ - res = {} - for key, val in six.iteritems(self._variables): - res[key.inner_val()] = val.to_json() - return res - - def __contains__(self, key): - """ - Test if the type table contains or not the provided - path. This function is more permissive than the other two. - It will never raise any exception (or should aim not to). - :type key: six.string_types | ast.Ident | ast.DothPath - :param key: The key to test. - :return: Returns True if the TypeTable contains a type for the - given path or identifier. - """ - if isinstance(key, six.string_types): - return key in self._variables - - if isinstance(key, ast.Ident): - return key.val in self._variables - - if isinstance(key, ast.DotPath): - res = key.varname in self._variables - if not res: - return False - val = self._variables[key.varname] - for prop in key.properties: - if isinstance(val, util.Object): - if prop in val.props: - val = val[prop] - else: - return False - return True - - return False - - def __str__(self): - return strut.dict_to_str(self._variables) diff --git a/monasca_analytics/banana/typeck/type_util.py b/monasca_analytics/banana/typeck/type_util.py deleted file mode 100644 index 262e4e6..0000000 --- a/monasca_analytics/banana/typeck/type_util.py +++ /dev/null @@ -1,626 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Util files to manipulates banana types. - -The list of possible types is as follow: - - * `Number` - * `Boolean` - * `String` - * `Object` (Json-like object) - * `Component.Source.` - * `Component.Ingestor.` - * `Component.Sink.` - * `Component.Voter.` - * `Component.Ldp.` - * `Component.Sml.` - -where will be the component class name defined -in the code base. - -For type defined in banana such as Json parsers, -refers the name they are defined with. -""" -import abc -import six - -import monasca_analytics.banana.grammar.ast as ast -import monasca_analytics.exception.banana as exception -import monasca_analytics.util.string_util as strut - - -@six.add_metaclass(abc.ABCMeta) -class IsType(object): - """ - Any class that represents a Banana type should inherit - from this class. - """ - - def __ne__(self, other): - # Dispatch to eq function - return not self.__eq__(other) - - @abc.abstractmethod - def default_value(self): - pass - - @abc.abstractmethod - def to_json(self): - pass - - -class Any(IsType): - """ - Any type. This type should be used by component's writer when - they have a complex handling of parameters. This is not - recommended though as it move the error handling to - the component writer. - """ - - def __str__(self): - return "TypeAny" - - def __eq__(self, _): - # Any type is equal to nothing not even itself. - return False - - def __ne__(self, other): - return not self.__eq__(other) - - def __getitem__(self, _): - return Any() - - def __hash__(self): - raise Exception("Any type should not be used in dictionaries.") - - def default_value(self): - return {} - - def to_json(self): - return {"id": "any"} - - -class String(IsType): - """ - String Type. - """ - - def __str__(self): - return "TypeString" - - def __eq__(self, other): - return isinstance(other, String) - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(str(self)) - - def default_value(self): - return "" - - def to_json(self): - return {"id": "string"} - - -class Number(String): - """ - Number type. Banana has only floating point value. - """ - - def __str__(self): - return "TypeNumber" - - def __eq__(self, other): - return isinstance(other, Number) - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(str(self)) - - def default_value(self): - return 0 - - def to_json(self): - return {"id": "number"} - - -class Enum(String): - """ - Enum type. This type is a way to constraint a string or number, - to a specific set of values. - """ - - def __init__(self, variants): - self.variants = variants - - def __eq__(self, other): - return isinstance(other, Enum) and self.variants == other.variants - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.variants) - - def __str__(self): - return "TypeEnum < {} >".format(','.join(self.variants)) - - def default_value(self): - return "" - - def to_json(self): - return { - "id": "enum", - "variants": self.variants - } - - -def attach_to_root(root_obj, obj1, span, erase_existing=False): - """ - Attach the object obj1 to the root_obj object type. - - :type root_obj: Object - :param root_obj: The root object - :type obj1: Object - :param obj1: The object to attach. - :type span: Span - :param span: The span for this change. - :type erase_existing: bool - :param erase_existing: Set to true if the root type should - always be erased. - """ - for key, child_type in six.iteritems(obj1.props): - if key in root_obj.props: - root_sub_type = root_obj.props[key] - # Both are object -> recurse - if isinstance(root_sub_type, Object) and\ - isinstance(child_type, Object): - attach_to_root(root_sub_type, child_type, span, erase_existing) - elif erase_existing: - root_obj.props[key] = child_type - else: - raise exception.BananaTypeError( - expected_type=root_sub_type, - found_type=child_type, - span=span - ) - else: - # We can simply attach the new type! - root_obj.props[key] = child_type - - -def create_object_tree(dot_path, value): - """ - Create a linear tree of object type from the dot_path. - Also work when dot_path is an Ident or StringLit. - - :type dot_path: ast.DotPath | ast.Ident | ast.StringLit - :param dot_path: The ast node that forms a linear tree of type. - :type value: Object | String | Number - :param value: the value to set at the end of the linear tree. - :rtype: Object - :return: Returns the created object - """ - if is_comp(value): - raise exception.BananaAssignCompError(dot_path.span) - - # {a.b.c: value} - root_object = Object(strict_checking=False) - if isinstance(dot_path, ast.DotPath): - # {a: value} - if len(dot_path.properties) == 0: - root_object.props[dot_path.varname.inner_val()] = value - else: - # {a: } - root_object.props[dot_path.varname.inner_val()] = \ - Object(strict_checking=False) - # {b.c: value} - current_obj = root_object.props[dot_path.varname.inner_val()] - last_index = len(dot_path.properties) - 1 - for index, sub_prop in enumerate(dot_path.properties): - sub_prop_name = sub_prop.inner_val() - if index != last_index: - current_obj.props[sub_prop_name] = \ - Object(strict_checking=False) - current_obj = current_obj.props[sub_prop_name] - else: - current_obj.props[sub_prop_name] = value - else: - # Ident and StringLit are captured here. - root_object.props[dot_path.inner_val()] = value - return root_object - - -class Object(String): - """ - Object Type. The value that are dictionary-like have this type. - """ - - def __init__(self, props=None, strict_checking=True): - if props is None: - props = {} - self.props = props - # Strict checking is off for all objects defined within the banana - # language. It is on by default for components so that they can - # force the type checker to throw errors when we try to access - # or to modify unknown properties - self.strict_checking = strict_checking - - def __getitem__(self, key): - # a.b or a."b" - if isinstance(key, ast.Ident) or isinstance(key, ast.StringLit): - if key.inner_val() not in self.props: - raise exception.BananaPropertyDoesNotExists(key, - on_type=self) - return self.props[key.inner_val()] - - # a.b.c - if isinstance(key, ast.DotPath): - if key.varname.inner_val() not in self.props: - raise exception.BananaPropertyDoesNotExists(key.varname, - on_type=self) - sub_object = self.props[key.varname.inner_val()] - if len(key.properties) == 0: - return sub_object - # Recurse - if isinstance(sub_object, Object): - return sub_object[key.next_dot_path()] - if isinstance(sub_object, Any): - return sub_object - - raise exception.BananaPropertyDoesNotExists(key.next_dot_path(), - on_type=sub_object) - - raise exception.BananaTypeCheckerBug( - "Unreachable code in Object.__getitem__ reached." - ) - - def __str__(self): - if self.strict_checking: - return "TypeStruct < {} >".format(strut.dict_to_str(self.props)) - else: - return "TypeObject < {} >".format(strut.dict_to_str(self.props)) - - def __eq__(self, other): - return self.props == other - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.props) - - def default_value(self): - default_value = {} - for key, val in six.iteritems(self.props): - default_value[key] = val.default_value() - return default_value - - def to_json(self): - res = {"id": "object", "props": {}} - for key, val in six.iteritems(self.props): - res["props"][key] = val.to_json() - return res - - -class Component(IsType): - """ - Type of all components. While not strictly used directly, it - is very useful to performs checks on variable that are supposed - to be any of the available components. - """ - - def __init__(self, ctor_properties=None, class_name=None): - """ - Component type - - :type ctor_properties: - list[monasca_analytics.component.params.ParamDescriptor] - :param ctor_properties: - :type class_name: str - :param class_name: Name of the class if there's any. - """ - self.ctor_properties = ctor_properties - self.class_name = class_name - - def __str__(self): - if self.class_name is None: - return "TypeComponent" - else: - return self.class_name + "(" +\ - ",".join(map(lambda x: x.param_name + "=" + str(x.param_type), - self.ctor_properties))\ - + ")" - - def __setitem__(self, dot_path, value): - """ - Attempt to set the value at 'dot_path' to 'value'. - - :type dot_path: ast.DotPath - :param dot_path: The path of the property - :type value: String | Enum | Object | Number - :param value: The new type to set. - """ - if self.ctor_properties is None: - raise exception.BananaTypeCheckerBug( - "Component type can't have properties" - ) - - if len(dot_path.properties) == 0: - for arg in self.ctor_properties: - if arg.param_name == dot_path.varname.inner_val(): - if not can_be_cast_to(value, arg.param_type): - raise exception.BananaArgumentTypeError( - expected_type=arg.param_type, - received_type=value, - where=dot_path.span - ) - else: - return - else: - for arg in self.ctor_properties: - if arg.param_name == dot_path.varname.inner_val(): - if isinstance(arg.param_type, Any): - return - elif isinstance(arg.param_type, Object): - next_dot_path = dot_path.next_dot_path() - sub_arg_type = arg.param_type[next_dot_path] - if not can_be_cast_to(value, sub_arg_type): - raise exception.BananaArgumentTypeError( - expected_type=sub_arg_type, - received_type=value, - where=next_dot_path.span - ) - else: - return - else: - raise exception.BananaPropertyDoesNotExists( - dot_path.next_dot_path(), - arg.param_type - ) - - raise exception.BananaPropertyDoesNotExists(dot_path, on_type=self) - - def __getitem__(self, dot_path): - """ - Return the type of the given item. - - :type dot_path: ast.DotPath - :param dot_path: The path to follow - :return: - """ - if self.ctor_properties is None: - raise exception.BananaTypeCheckerBug( - "Component type can't have properties" - ) - - if len(dot_path.properties) == 0: - for arg in self.ctor_properties: - if arg.param_name == dot_path.varname.inner_val(): - return arg.param_type - else: - for arg in self.ctor_properties: - if arg.param_name == dot_path.varname.inner_val(): - if isinstance(arg.param_type, Object): - return arg.param_type[dot_path.next_dot_path()] - else: - raise exception.BananaPropertyDoesNotExists( - dot_path.next_dot_path(), - arg.param_type - ) - - raise exception.BananaPropertyDoesNotExists(dot_path, on_type=self) - - def __eq__(self, other): - return isinstance(other, Component) - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(str(self)) - - def default_value(self): - return None - - def to_json(self): - res = {"id": "component", "name": self.class_name, "args": []} - for arg in self.ctor_properties: - res["args"].append(arg.to_json()) - return res - - -class Source(Component): - """ - Source type. All component that inherits from BaseSource have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Source, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -class Ingestor(Component): - """ - Ingestor type. All component that inherits from BaseIngestor have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Ingestor, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -class Sink(Component): - """ - Sink type. All component that inherits from BaseSink have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Sink, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -class Voter(Component): - """ - Voter type. All component that inherits from BaseVoter have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Voter, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -class Ldp(Component): - """ - Ldp type. All component that inherits from BaseLdp have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Ldp, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -class Sml(Component): - """ - Sml type. All component that inherits from BaseSml have - this type in Banana. - """ - def __init__(self, class_name, ctor_properties): - super(Sml, self).__init__(ctor_properties, class_name) - - def __eq__(self, other): - return self.class_name == other.class_name - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self.class_name) - - -def get_type(ast_node): - """ - Returns the type for the given ast node. - This function only works for literal node such as - Number, StringLit and JsonObj. - :type ast_node: ast.Number | ast.StringLit | ast.JsonObj | ast.Component - :param ast_node: the node. - :return: Returns the appropriate type. - """ - if isinstance(ast_node, ast.Number): - return Number() - if isinstance(ast_node, ast.StringLit): - return String() - if isinstance(ast_node, ast.JsonObj): - return Object(strict_checking=False) - if isinstance(ast_node, ast.Component): - return Component() - return None - - -def can_to_str(_type): - """ - Check if we the type can be cast to str. - :param _type: Type to check - :return: Returns True if it can be casted - """ - return isinstance(_type, String) - - -def is_comp(_type): - """ - :type _type: String | Number | Object | Component - :param _type: Type to check. - :rtype: bool - :return: Returns True if the provided _type is a component - """ - return isinstance(_type, Component) - - -def can_be_cast_to(_type1, _type2): - """ - Check if the given type `_type1` can be cast into `_type2`. - :type _type1: String | Number | Enum | Object - :param _type1: Type to try to change into _type2 - :type _type2: String | Number | Enum | Object - :param _type2: Type reference. - :return: Returns true if the conversion can be done. - """ - if isinstance(_type2, Any): - return True - elif _type1 == _type2: - return True - elif _type2 == String(): - return can_to_str(_type1) - elif isinstance(_type2, Enum): - return isinstance(_type1, String) or isinstance(_type2, Enum) - elif isinstance(_type1, Object) and isinstance(_type2, Object): - if not _type2.strict_checking: - return True - else: - for prop_name, prop_type in six.iteritems(_type2.props): - if prop_name not in _type1.props: - return False - if not can_be_cast_to(_type1.props[prop_name], prop_type): - return False - return True - return False diff --git a/monasca_analytics/component/__init__.py b/monasca_analytics/component/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/component/base.py b/monasca_analytics/component/base.py deleted file mode 100644 index 2a4ad91..0000000 --- a/monasca_analytics/component/base.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import six - - -class abstractstatic(staticmethod): - """ - See http://stackoverflow.com/a/4474495 for - more details on this class purpose - """ - __slots__ = () - - def __init__(self, function): - super(abstractstatic, self).__init__(function) - function.__isabstractmethod__ = True - __isabstractmethod__ = True - - -@six.add_metaclass(abc.ABCMeta) -class BaseComponent(object): - """Base class for all component types. - - Should be as lightweight as possible, becuase any data here will be sent - to all workers every time a component is added. - """ - - def __init__(self, _id, _config): - """BaseComponent constructor. - - :type _id: str - :param _id: identifier of this Source - :type _config: dict - :param _config: configuration of this Source - """ - self.validate_config(_config) - self._id = _id - - @abstractstatic - def validate_config(_config): # @NoSelf - """Abstract static method for configuration validation. - - To be implemented by BaseComponent children. - It is called at creation time, and it should validate the - schema of the configuration passed as parameter - (i.e. check for expected keys and value format). - This function should raise exceptions if the validation fails, - otherwise it is assumed the validation was successful. - - :type _config: dict - :param _config: configuration of this module to be validated. - """ - pass - - @abstractstatic - def get_default_config(): # @NoSelf - """Abstract static method that returns the default configuration. - - To be implemented by BaseComponent children. It has to return a default - valid configuration for the module. - - :rtype: dict - :returns: default configuration - """ - pass - - @abstractstatic - def get_params(): # @NoSelf - """Abstract static method that returns the description of the params. - - To be implemented by BaseComponent children. It has to return - a list of the params description such as: - - return [ - ParamDescriptor('param1', type_util.String(), 'default value'), - ParamDescriptor('param2', type_util.Object({ - 'a': type_util.Number() - ), {'a': 123}), - ... - ] - - This function must be kept in sync with `get_default_config` and - `validate_config`, otherwise banana scripts using this component - will get runtime errors when being evaluated. - - The order in the list maps to the order the parameter must be - passed when the component would be created, in banana: - - a = MyComponent(param1, param2) - - `param1` and `param2` would be type-checked respectively against - the first and the second element of the returned list. - - :rtype: list[monasca_analytics.component.params.ParamDescriptor] - :return: Returns the list of parameters accepted by this component. - """ - pass - - def id(self): - return self._id - - def __hash__(self): - return hash(self._id) - - def __eq__(self, other): - return self._id == other.id() - - def __ne__(self, other): - return not(self == other) - - def __str__(self): - return self._id diff --git a/monasca_analytics/component/params.py b/monasca_analytics/component/params.py deleted file mode 100644 index 3c7a820..0000000 --- a/monasca_analytics/component/params.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.banana.typeck.type_util as u - - -class ParamDescriptor(object): - """ - Description of a component parameter. This object contains - information such as the name of the parameter, the type, - the default value and a validator that will be evaluated - when the component is instantiated. - """ - def __init__(self, name, _type, default=None, validator=None): - """ - Construct a parameter descriptor. - :type name: str - :param name: The name of the parameter - :type _type: u.String | u.Number | u.Object | u.Enum | u.Any - :param _type: The type of the parameter - :type default: str | float | int | dict - :param default: The default value for the parameter. - :param validator: Additional validator for the parameter. - """ - if not isinstance(_type, u.String) and\ - not isinstance(_type, u.Number) and\ - not isinstance(_type, u.Object) and\ - not isinstance(_type, u.Enum) and\ - not isinstance(_type, u.Any): - raise Exception("ParamDescriptor incorrectly defined") - self.param_name = name - self.default_value = default - self.param_type = _type - self.validator = validator - - def to_json(self): - return { - "name": self.param_name, - "default_value": self.default_value, - "type": self.param_type.to_json(), - } diff --git a/monasca_analytics/config/__init__.py b/monasca_analytics/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/config/config.py b/monasca_analytics/config/config.py deleted file mode 100644 index 4d3d144..0000000 --- a/monasca_analytics/config/config.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import sys - -import monasca_analytics.config.connection as connection -import monasca_analytics.config.creation as creation -import monasca_analytics.config.validation as validation -import monasca_analytics.source.base as msource - -logger = logging.getLogger(__name__) - - -def instantiate_components(_config): - """Instantiate the components from the configuration. - - :type _config: dict - :param _config: configuration of the module to instantiate - :rtype: dict - :returns: the list of components - """ - try: - validation.validate_config(_config) - logger.debug("Creating components according to configuration...") - components = creation.create_components(_config) - logger.debug("Done creating components. Creating link data...") - links = connection.connect_components(components, _config) - logger.debug("Done connecting components. Validating links...") - validation.validate_links(links) - logger.debug("Done validating links. Successful instantiation") - return links - except Exception as ex: - logger.error("Failed to instantiate components") - logger.error("Reason : " + str(ex)) - sys.exit(-1) - - -def collect_sources(links): - """Collect the sources from the links and return them in a list - - :type links: dict - :returns: List of sources - :rtype: list[msource.BaseSource] - """ - sources = [] - for key in links.keys(): - if isinstance(key, msource.BaseSource): - sources.append(key) - return sources diff --git a/monasca_analytics/config/connection.py b/monasca_analytics/config/connection.py deleted file mode 100644 index 9f8ed17..0000000 --- a/monasca_analytics/config/connection.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import monasca_analytics.config.const as const -import monasca_analytics.exception.monanas as err - - -logger = logging.getLogger(__name__) - - -def connect_components(components, _config): - """Connects the components using the information from the configuration - - :type components: dict - :param components: components to connect - :type _config: dict - :param _config: configuration containing the - connections definitions - :rtype: dict - :returns: Dictionary where keys are IDs of sources of connections, - and values are their destinations IDs. - """ - return _perform_all_connections(const.CONNECTIONS, _config, components) - - -def _perform_all_connections(connection_kind, _config, components): - """Connect all component that are of the given kind. - - :type connection_kind: str - :param connection_kind: Kind of connection (feedback or flow) - :type _config: dict - :param _config: configuration containing the connections - :type components: dict - :param components: components to connect. - :rtype: dict - :returns: Dictionay where keys are IDs of sources of connections, - and values are their destinations IDs. - """ - links = {} - for origin_id in _config[connection_kind].keys(): - for comp_type in const.components_types: - if origin_id in components[comp_type]: - component = components[comp_type][origin_id] - connections_list = _config[connection_kind][origin_id] - _perform_connections( - component, connections_list, - components, links) - return links - - -def _perform_connections(origin, connections_list, components, links): - """Connect 'origin' with all destinations in connections_list - - :type origin: str - :param origin: origin component - :type connections_list: list[str] - :param connections_list: destinations IDs to be connected - :type components: dict - :param components: all components - :type links: dict - :param links: links that we are going to represent - """ - if origin not in links: - links[origin] = [] - - if not connections_list: - logger.debug("No connections for {}".format(origin)) - return - - for dest_id in connections_list: - if dest_id in components[const.INGESTORS].keys(): - ingestor = components[const.INGESTORS][dest_id] - links[origin].append(ingestor) - continue - if dest_id in components[const.SMLS].keys(): - sml = components[const.SMLS][dest_id] - links[origin].append(sml) - continue - if dest_id in components[const.VOTERS].keys(): - voter = components[const.VOTERS][dest_id] - links[origin].append(voter) - continue - if dest_id in components[const.SINKS].keys(): - sink = components[const.SINKS][dest_id] - links[origin].append(sink) - continue - if dest_id in components[const.LDPS].keys(): - ldp = components[const.LDPS][dest_id] - links[origin].append(ldp) - continue - raise err.MonanasWrongConnectoinError( - "wrong component defined in connection : " + dest_id) diff --git a/monasca_analytics/config/const.py b/monasca_analytics/config/const.py deleted file mode 100644 index 62a1533..0000000 --- a/monasca_analytics/config/const.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy - -SOURCES = "sources" -INGESTORS = "ingestors" -SMLS = "smls" -VOTERS = "voters" -SINKS = "sinks" -LDPS = "ldps" -CONNECTIONS = "connections" -FEEDBACK = "feedback" - -components_types = [SOURCES, INGESTORS, SMLS, VOTERS, SINKS, LDPS] - - -_default_base_config = { - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": False - }, - "sources": {}, - "ingestors": {}, - "smls": {}, - "voters": {}, - "sinks": {}, - "ldps": {}, - "connections": {}, - "feedback": {} -} - - -def get_default_base_config(): - return copy.deepcopy(_default_base_config) diff --git a/monasca_analytics/config/creation.py b/monasca_analytics/config/creation.py deleted file mode 100644 index 3325f57..0000000 --- a/monasca_analytics/config/creation.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from monasca_analytics.config import const -from monasca_analytics.util import common_util - -import six - - -logger = logging.getLogger(__name__) - - -def create_components(_config): - """Creates the components defined by the configuration - - :type _config: dict - :param _config: configuration containing components - :rtype: dict - :returns: Created components indexed by type and ID - """ - components = {} - for component_type in const.components_types: - components[component_type] = \ - _create_comps_by_module(component_type, _config) - return components - - -def _create_comps_by_module(comp_type, _config): - """Instantiates all the components of a type defined in the configuration - - :type comp_type: str - :param comp_type: type of the components to be deployed - (e.g. source, ingestor, ...) - :type _config: dict - :param _config: Configuration containing components - :rtype: dict - :returns: deployed components, keyed by ID - :raises: MonanasNoSuchSourceError -- if no source class found. - """ - logger.debug("Creating components of type : " + comp_type) - ret = {} - for comp_id, comp_config in six.iteritems(_config[comp_type]): - comp = _create_component_by_module( - comp_id, comp_config, comp_type) - ret[comp_id] = comp - return ret - - -def _create_component_by_module(comp_id, comp_config, comp_type): - """Create a single component matching the past configuration. - - The id assigned to that component will be comp_id. - - :type comp_id: str - :param comp_id: ID of the component to create - :type comp_config: dict - :param comp_config: Configuration of the component to create - :type comp_type: str - :param comp_type: type of component to create - :rtype: monasca_analytics.component.base.BaseComponent - :returns: Instantiated component object - """ - logger.debug("deploying " + comp_config["module"] + " object") - clazz = common_util.get_class_by_name(comp_config["module"], - comp_type) - _comp = clazz(comp_id, comp_config) - return _comp diff --git a/monasca_analytics/config/validation.py b/monasca_analytics/config/validation.py deleted file mode 100644 index a97c136..0000000 --- a/monasca_analytics/config/validation.py +++ /dev/null @@ -1,251 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""A list of functions to validate config models.""" - -import logging - -import six -import voluptuous - -from monasca_analytics.config import const - - -logger = logging.getLogger(__name__) - - -valid_connection_types = { - const.SOURCES: [const.INGESTORS, const.LDPS], - const.INGESTORS: [const.SINKS], - const.SMLS: [const.VOTERS, const.SINKS], - const.VOTERS: [const.LDPS, const.SINKS], - const.LDPS: [const.SINKS], - const.SINKS: [] -} - - -valid_feedback_connection_types = { - const.SOURCES: [], - const.INGESTORS: [], - const.SMLS: [], - const.VOTERS: [], - const.LDPS: [], - const.SINKS: [const.VOTERS, const.SMLS] -} - - -def validate_config(config): - """Perform the whole validation: schema, uniqueness and connections - - :type config: dict - :param config: configuration to validate - :raises: SchemaError -- if the configuration is not valid for any reason - """ - _validate_schema(config) - _validate_only_one_voter(config) - _validate_ids_uniqueness(config) - _validate_connections(config) - - -def validate_links(links): - """Validate links to make sure, nothing is missing - - :type links: dict - :param links: connection links to validate - :raises: SchemaError -- if any link is missing - """ - missing = set([]) - all_keys = set(links.keys()) - for connections in links.values(): - for component in connections: - if component not in all_keys: - missing.add(component.id()) - if len(missing) > 0: - raise voluptuous.Invalid([ - "In connections section, the following components are not " - "connected\n\t{}\n" - "please modify the configuration so that their list of " - "connections is at least '[]'".format(", ".join(missing))], []) - - -def _validate_schema(config): - """Validate the configuration, with spark, up to the orchestration level - - Checks that hte spark configuration is valid, as well as the modules - structure in the configuration up to the orchestration level. - Each module will be responsible to validate its own sub-configuration. - - :type config: dict - :param config: configuration model for the whole system - :raises: SchemaError -- if the configuration, up to the - orchestration level, is not valid - """ - config_schema = voluptuous.Schema({ - "spark_config": { - "appName": six.string_types[0], - "streaming": { - "batch_interval": voluptuous.And(int, voluptuous.Range(min=1)) - } - }, - "server": { - "port": int, - "debug": bool - }, - "sources": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "ingestors": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "smls": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "voters": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "sinks": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "ldps": { - voluptuous.Optional(six.string_types[0]): {six.string_types[0]: - object} - }, - "connections": { - voluptuous.Optional(six.string_types[0]): [six.string_types[0]] - }, - "feedback": { - voluptuous.Optional(six.string_types[0]): [six.string_types[0]] - } - }, required=True) - return config_schema(config) - - -def _validate_only_one_voter(config): - """Check that the configuration defines only a single voter - - :type config: dict - :param config: configuration model for the whole system - :raises: SchemaError -- if there is more than one voter defined in config - """ - def _raise(comp): - raise voluptuous.Invalid([ - "More than one {} found in the config, please modify " + - "it specifying only one {}".format(comp, comp)], []) - - if len(config["voters"]) > 1: - _raise("voter") - - -def _validate_ids_uniqueness(config): - """Validate that the IDs of the components are unique - - :type config: dict - :param config: configuration model for the whole system - :raises: SchemaError -- if there is any duplicated ID in the configuration - """ - all_ids = set() - for comp_type in valid_connection_types.keys(): - for com_id in config[comp_type].keys(): - if com_id in all_ids: - raise voluptuous.Invalid( - ["Duplicated component ID : " + com_id], []) - all_ids.add(com_id) - - -def _validate_expected_dest_type(config, from_id, to_ids, expected_types): - """Check that the connection is valid according to expected_types. - - :type config: dict - :param config: configuration model for the whole system - :type from_id: str - :param from_id: ID of the component which is the - origin point of the connection - :type to_ids: list - :param to_ids: IDs of the components which are the - destination points of the connections - :type expected_types: list - :param expected_types: types of components that are allowed - as destination points - """ - for to_id in to_ids: - logger.debug("validating connection " + from_id + " --> " + to_id) - valid_connection = False - for expected_type in expected_types: - if to_id in config[expected_type].keys(): - valid_connection = True - break - if not valid_connection: - raise voluptuous.Invalid([ - from_id + " connected to a wrong component: " + to_id + - ". It should be connected only to any of : " + - str(expected_types)], []) - - -def _validate_existing_id(config, component_id): - """Check that the id passed as parameter is defined in the configuration - - :type config: dict - :param config: configuration model for the whole system - :type component_id: str - :param component_id: component ID to be found in configuration - """ - found_id = False - for comp_type in valid_connection_types.keys(): - if component_id in config[comp_type].keys(): - found_id = True - if not found_id: - raise voluptuous.Invalid([ - 'In "connections", component `{}` hasn\'t been defined' - .format(component_id) - ], []) - - -def _validate_from_dictionary(config, conf_key, validation_dict): - """Validate connections in config[conf_key] according to validation_dict - - :type config: dict - :param config: configuration model for the whole system - :type conf_key: str - :param conf_key: key of the configuration dictionary where - the connections to be checked are defined - :type validation_dict: dict - :param validation_dict: keys are source types, and values - are lists of allowed destination types - for that particular source type - """ - for from_id in config[conf_key].keys(): - _validate_existing_id(config, from_id) - to_ids = config[conf_key][from_id] - for comp_type in validation_dict.keys(): - if from_id in config[comp_type].keys(): - _validate_expected_dest_type( - config, from_id, to_ids, validation_dict[comp_type]) - - -def _validate_connections(config): - """Validate that the connections defined in config are allowed - - :type config: dict - :param config: configuration model for the whole system - """ - _validate_from_dictionary(config, "connections", valid_connection_types) - _validate_from_dictionary(config, "feedback", - valid_feedback_connection_types) diff --git a/monasca_analytics/exception/__init__.py b/monasca_analytics/exception/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/exception/banana.py b/monasca_analytics/exception/banana.py deleted file mode 100644 index 96a54c9..0000000 --- a/monasca_analytics/exception/banana.py +++ /dev/null @@ -1,353 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Banana Error classes.""" - -import abc -import pyparsing as p -import six - -import monasca_analytics.banana.grammar.base_ast as ast - - -@six.add_metaclass(abc.ABCMeta) -class BananaException(Exception): - - @abc.abstractmethod - def __str__(self): - pass - - @abc.abstractmethod - def get_span(self): - """ - :rtype: ast.Span - :return: Returns the span where the error occured if appropriate - """ - pass - - -class BananaInvalidExpression(BananaException): - def __init__(self, value): - self._value = value - - def __str__(self): - return repr(self._value) - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaEnvironmentError(BananaException): - def __init__(self, value): - self._value = value - - def __str__(self): - return repr(self._value) - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaNoFullPath(BananaException): - def __init__(self, missing): - self._value = "None of the paths can be executed. Missing at least" \ - " one {}.".format(missing) - - def __str__(self): - return self._value - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaArgumentTypeError(BananaException): - def __init__(self, where, expected_type, received_type): - if isinstance(where, ast.ASTNode): - self._span = where.span - else: - self._span = where - self._value = "Wrong type of argument. Expected '{}' got '{}'."\ - .format(expected_type, received_type) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaComponentTooManyParams(BananaException): - def __init__(self, span): - self._span = span - self._value = "Too many params provided to '{}'.".format( - span, span.get_lineno() - ) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaComponentMixingParams(BananaException): - def __init__(self, span, named_is_wrong): - self._span = span - if named_is_wrong: - self._value = "'{}' should be named as " \ - "previous parameters are.".format(span) - else: - self._value = "'{}' should not be named as " \ - "previous parameters are.".format(span) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaComponentIncorrectParamName(BananaException): - def __init__(self, found, component): - if isinstance(component, ast.ASTNode): - component = component.span - if isinstance(found, ast.ASTNode): - self._span = found.span - found = found.span - else: - self._span = found - self._value = "Incorrect parameter name. Parameter '{}' " \ - "does not exists on component {}."\ - .format(found, component) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaComponentAlreadyDefined(BananaException): - def __init__(self, first_def, second_def): - self._value = "Component already defined!\n" \ - " First definition: '{}'\n" \ - " Second definition: '{}'."\ - .format(first_def, second_def) - - def __str__(self): - return self._value - - def get_span(self): - # TODO(Joan): This could be a real span instead of this one. - return ast.DUMMY_SPAN - - -class BananaShadowingComponentError(BananaException): - def __init__(self, where, comp): - self._span = where - self._value = "Shadowing component '{}'. " \ - "Please use another variable name.".format(comp) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaAssignmentError(BananaException): - def __init__(self, lhs, rhs): - self._value = "You can't assign '{}' to '{}'.".format(lhs, rhs) - - def __str__(self): - return self._value - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaGrammarBug(BananaException, p.ParseFatalException): - def __init__(self, error): - super(BananaGrammarBug, self).__init__(pstr=error) - self._value = "Bug found in the grammar!" \ - " Please report this error: {}".format(error) - - def __str__(self): - return self._value - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaJsonObjShadowingError(BananaException, p.ParseFatalException): - def __init__(self, span, error): - self._span = span - error = "Can't shadow property already defined in {}.".format(error) - super(BananaJsonObjShadowingError, self).__init__(pstr=error) - - def __str__(self): - return self.msg - - def get_span(self): - return self._span - - -class BananaTypeCheckerBug(BananaException): - def __init__(self, error): - self._value = "Bug found in the TypeChecker!" \ - " Please report this error: {}".format(error) - - def __str__(self): - return self._value - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaEvalBug(BananaException): - def __init__(self, error): - self._value = "Bug found in the evaluator!" \ - " Please report this error: {}".format(error) - - def __str__(self): - return self._value - - def get_span(self): - return ast.DUMMY_SPAN - - -class BananaUnknown(BananaException): - def __init__(self, ident): - self._span = ident.span - self._value = "Unknown '{}'.".format( - ident.into_unmodified_str() - ) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaUnknownOperator(BananaException): - def __init__(self, span, operator, for_type): - self._span = span - self._value = "Unknown operator '{}' for type '{}'.".format( - operator, - for_type - ) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaPropertyDoesNotExists(BananaException): - def __init__(self, dotpath, on_type=None): - self._span = dotpath.span - if on_type is None: - self._value = "Property '{}' " \ - "does not exists."\ - .format( - dotpath.into_unmodified_str() - ) - else: - self._value = "Property '{}' " \ - "does not exists on type '{}'."\ - .format( - dotpath.into_unmodified_str(), - str(on_type) - ) - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaTypeError(BananaException): - def __init__(self, expected_type, found_type=None, span=None): - self._span = span - if expected_type is None: - class DummyType(object): - def __str__(self): - return "_" - expected_type = DummyType - if found_type is None: - if isinstance(expected_type, list): - self._value = "Type error found. Expected" \ - " one among '{}'."\ - .format(', '.join(map(lambda x: str(x), expected_type))) - else: - self._value = "Type error found. Expected '{}'.".format( - str(expected_type) - ) - else: - if isinstance(expected_type, list): - self._value = "Type error found. Expected" \ - " one among '{}', found '{}'."\ - .format(', '.join(map(lambda x: str(x), expected_type)), - str(found_type)) - else: - self._value = "Type error found. Expected" \ - " '{}', found '{}'."\ - .format(str(expected_type), str(found_type)) - - def __str__(self): - return self._value - - def get_span(self): - if self._span is None: - return ast.DUMMY_SPAN - return self._span - - -class BananaAssignCompError(BananaException): - def __init__(self, span): - self._span = span - self._value = "Component objects " \ - "can't be assigned to " \ - "properties of other objects." - - def __str__(self): - return self._value - - def get_span(self): - return self._span - - -class BananaConnectionError(BananaException): - - def __init__(self, span, ident_from, ident_to, type_from, - possible_connections): - self._value = "Can't connect '{}'" \ - " to '{}'," \ - " '{}' can only be connected to a {}."\ - .format( - ident_from.val, - ident_to.val, - type_from.class_name, ' or a '.join(possible_connections)) - self._span = span - - def __str__(self): - return self._value - - def get_span(self): - return self._span diff --git a/monasca_analytics/exception/dsl.py b/monasca_analytics/exception/dsl.py deleted file mode 100644 index e2efc01..0000000 --- a/monasca_analytics/exception/dsl.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""DSL Error classes.""" - -import abc -import six - - -@six.add_metaclass(abc.ABCMeta) -class DSLException(Exception): - - @abc.abstractmethod - def __str__(self): - pass - - -class DSLExistingConnection(DSLException): - def __init__(self, value): - self._value = value - - def __str__(self): - DSLException.__str__(self) - return repr(self._value) - - -class DSLInexistentComponent(DSLException): - def __init__(self, value): - self._value = value - - def __str__(self): - DSLException.__str__(self) - return repr(self._value) - - -class DSLInvalidConnection(DSLException): - def __init__(self, value): - self._value = value - - def __str__(self): - DSLException.__str__(self) - return repr(self._value) - - -class DSLInterpreterException(DSLException): - def __init__(self, value): - self._value = value - - def __str__(self): - DSLException.__str__(self) - return repr(self._value) diff --git a/monasca_analytics/exception/ingestor.py b/monasca_analytics/exception/ingestor.py deleted file mode 100644 index ad79a6a..0000000 --- a/monasca_analytics/exception/ingestor.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Data Ingestor Error classes.""" - -import abc -import six - - -@six.add_metaclass(abc.ABCMeta) -class IngestorException(Exception): - - @abc.abstractmethod - def __str__(self): - pass - - -class IngestorNoSuchSourceModel(IngestorException): - def __init__(self, value): - self._value = value - - def __str__(self): - IngestorException.__str__(self) - return repr(self._value) diff --git a/monasca_analytics/exception/monanas.py b/monasca_analytics/exception/monanas.py deleted file mode 100644 index 55b088b..0000000 --- a/monasca_analytics/exception/monanas.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Monanas Error classes.""" - -import abc -import six - - -@six.add_metaclass(abc.ABCMeta) -class MonanasException(Exception): - - @abc.abstractmethod - def __str__(self): - pass - - -class MonanasMainError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasInitError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasBindSourcesError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasAlreadyStartedStreaming(MonanasException): - def __init__(self): - self._value = "Monanas has already started streaming." - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasAlreadyStoppedStreaming(MonanasException): - def __init__(self): - self._value = "Monanas has already stopped streaming." - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasStreamingError(MonanasException): - def __init__(self): - self._value = "Unable to start streaming data. Make sure there is at \ - least one operation registered." - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchClassError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDuplicateClassError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchSourceError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDuplicateSourceError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchIngestorError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDuplicateIngestorError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchAggregatorError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDuplicateAggregatorError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchSMLError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDuplicateSMLError(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasDStreamNotReady(MonanasException): - def __init__(self): - self._value = "The dstream requested is not ready." - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasAlreadyIngested(MonanasException): - def __init__(self): - self._value = "Monanas has already ingested data." - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasNoSuchSourceModel(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasInvalidConfig(MonanasException): - def __init__(self, value): - self._value = value - - def __str__(self): - MonanasException.__str__(self) - return repr(self._value) - - -class MonanasCyclicRandomSourceError(Exception): - - def __init__(self): - self._value = "Monanas couldn't start the linearly dependent \ - random source: Cycle found." - - def __str__(self): - return repr(self._value) - - -class MonanasWrongConnectoinError(Exception): - - def __init__(self, value): - self._value = value - - def __str__(self): - return repr(self._value) diff --git a/monasca_analytics/ingestor/__init__.py b/monasca_analytics/ingestor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/ingestor/base.py b/monasca_analytics/ingestor/base.py deleted file mode 100644 index 94086fa..0000000 --- a/monasca_analytics/ingestor/base.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import logging - -from monasca_analytics.component import base - -logger = logging.getLogger(__name__) - - -class BaseIngestor(base.BaseComponent): - """Base class for all the Ingestor modules""" - - def __init__(self, _id, _config): - """Constructor with ID and configuration - - :type _id: str - :param _id: ID assigned to this component - :type _config: dict - :param _config: configuration of this component - """ - self._features = None - super(BaseIngestor, self).__init__(_id, _config) - - @abc.abstractmethod - def map_dstream(self, dstream): - """Transforms the data provided by a dstream to another dstream - - Abstract method to be implemented by BaseIngestor children. - The processed dstream should be returned. - - :type dstream: pyspark.streaming.DStream - :param dstream: stream of data before being processed - :rtype: pyspark.streaming.DStream - :returns: stream of data after being processed - """ - pass - - def set_feature_list(self, features): - """Set the list of features - - :type features: list[str] - :param features: List of features names (when extracted from the data) - """ - self._features = features diff --git a/monasca_analytics/ingestor/cloud.py b/monasca_analytics/ingestor/cloud.py deleted file mode 100644 index 8df6b1a..0000000 --- a/monasca_analytics/ingestor/cloud.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -import voluptuous - -from monasca_analytics.ingestor import base -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -class CloudIngestor(base.BaseIngestor): - """Data ingestor for Cloud""" - - def __init__(self, _id, _config): - super(CloudIngestor, self).__init__(_id=_id, _config=_config) - - @staticmethod - def validate_config(_config): - cloud_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()) - }, required=True) - return cloud_schema(_config) - - @staticmethod - def get_params(): - return [] - - def map_dstream(self, dstream): - features_list = list(self._features) - return dstream.map(fn.from_json)\ - .map(lambda x: (x['ctime'], x['event']))\ - .groupByKey()\ - .map(lambda rdd_entry: CloudIngestor._parse_and_vectorize( - rdd_entry[1], - features_list)) - - @staticmethod - def get_default_config(): - return {"module": CloudIngestor.__name__} - - @staticmethod - def _parse_and_vectorize(iterable, feature_list): - values = { - "support_1": 0.0 - } - for feature in feature_list: - values[feature] = 0.0 - for e in iterable: - if e["id"] in values: - values[e["id"]] += 1.0 - res = [values[f] for f in feature_list] - return np.array(res) diff --git a/monasca_analytics/ingestor/iptables.py b/monasca_analytics/ingestor/iptables.py deleted file mode 100644 index a2eefca..0000000 --- a/monasca_analytics/ingestor/iptables.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -import voluptuous - -from monasca_analytics.ingestor import base -from monasca_analytics.source import iptables_markov_chain as src -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - -RDD_EVENT = "event" -RDD_CTIME = "ctime" -EVENT_MSG = "msg" - - -class IptablesIngestor(base.BaseIngestor): - """This ingestor class implements an IPTable parsing and vectorization. - - Assuming the dstream contains iptables that have been triggered, it creates - an np array for each sample wit the number of times that each IPTable has - been triggered. - """ - - def __init__(self, _id, _config): - super(IptablesIngestor, self).__init__(_id=_id, _config=_config) - - @staticmethod - def validate_config(_config): - iptables_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()) - }, required=True) - return iptables_schema(_config) - - @staticmethod - def get_default_config(): - return {"module": IptablesIngestor.__name__} - - @staticmethod - def get_params(): - return [] - - def map_dstream(self, dstream): - """ - Map the provided dstream into another dstream. - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream to transform. - :rtype: pyspark.streaming.DStream - :return: Returns a new dstream. - """ - features_list = list(self._features) - return dstream.map(fn.from_json)\ - .map(lambda x: (x['ctime'], x))\ - .groupByKey()\ - .map(lambda rdd_entry: IptablesIngestor._process_data( - rdd_entry[1], - features_list)) - - @staticmethod - def _process_data(rdd_entry, feature_list): - """Parse and vectorize the rdd_entry - - Assuming the rdd_entry is encoded in JSON format, this method - gets the events and vectorizes them according to the features. - - :type rdd_entry: list[dict] - :param rdd_entry: event - :type feature_list: list[str] - :param feature_list: features to extract, in order - """ - events = [] - for event in rdd_entry: - events.append(event[RDD_EVENT]) - return IptablesIngestor.vectorize_events(events, feature_list) - - @staticmethod - def vectorize_events(events, feature_list): - """Event vectorizing logic. - - For each event, we get the message, - which is the IPTable that has been triggered. - Then we get the corresponding feature for the IPtable. - Finally, we increase the index of the vector corresponding to - that feature. - - :type events: list[dict] - :param events: List of collected events. - :type feature_list: list[str] - :param feature_list: features to extract, in order - """ - ret = np.zeros(len(feature_list)) - for event in events: - iptable_id = src.iptables[event[EVENT_MSG]] - feature = src.get_iptable_type(iptable_id) - index = feature_list.index(feature) - ret[index] += 1 - return ret diff --git a/monasca_analytics/ldp/__init__.py b/monasca_analytics/ldp/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/ldp/base.py b/monasca_analytics/ldp/base.py deleted file mode 100644 index f4b5e27..0000000 --- a/monasca_analytics/ldp/base.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import six - -from monasca_analytics.component import base - - -@six.add_metaclass(abc.ABCMeta) -class BaseLDP(base.BaseComponent): - """Base class for Live Data Processor (LDP), to be extended""" - - def __init__(self, _id, _config): - """Constructor with ID and configuration - - :type _id: str - :param _id: ID assigned to this component - :type _config: dict - :param _config: configuration of this component - """ - super(BaseLDP, self).__init__(_id, _config) - self._features = None - self._data = { - "features": None, - "matrix": None - } - - @abc.abstractmethod - def map_dstream(self, dstream): - """Map the dstream input to new values - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream created by the source. - """ - pass - - def set_voter_output(self, matrix): - """Assign the features and matrix to the _data object that - - :type matrix: numpy.ndarray - :param matrix: the causality matrix learned by the voter. - """ - self._data["features"] = self._features - self._data["matrix"] = matrix - - def set_feature_list(self, features): - """Set the list of features - - :type features: list[str] - :param features: list of the features names. - """ - self._features = features diff --git a/monasca_analytics/ldp/cloud_causality.py b/monasca_analytics/ldp/cloud_causality.py deleted file mode 100644 index 4d928f5..0000000 --- a/monasca_analytics/ldp/cloud_causality.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import six -import voluptuous - -import monasca_analytics.ldp.base as bt -import monasca_analytics.util.spark_func as fn -import monasca_analytics.util.validation_utils as vu - - -logger = logging.getLogger(__name__) - - -class CloudCausalityLDP(bt.BaseLDP): - """A causality live data processor""" - - @staticmethod - def validate_config(_config): - cloud_causality_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()) - }, required=True) - return cloud_causality_schema(_config) - - @staticmethod - def get_default_config(): - return {"module": CloudCausalityLDP.__name__} - - @staticmethod - def get_params(): - return [] - - def map_dstream(self, dstream): - """Executes _aggregate for each RDD in the dstream - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream created by the source. - """ - data = self._data - return dstream.map(fn.from_json)\ - .map(lambda x: (x['ctime'], x))\ - .groupByKey()\ - .flatMap(lambda r: CloudCausalityLDP._aggregate(r[1], data)) - - @staticmethod - def _aggregate(rdd_entry, data): - new_entries = [] - features = data["features"] - matrix = data["matrix"] - - if features is None or matrix is None: - return rdd_entry - - for event in rdd_entry: - causes = [] - - try: - cause = features.index(event["event"]["id"]) - for other_event in rdd_entry: - if other_event["event"]["id"] != event["event"]["id"]: - try: - caused = features.index(other_event["event"]["id"]) - - if matrix[caused][cause]: - causes.append(other_event["event"]["id"]) - except ValueError: - pass - except ValueError: - pass - - event["__monanas__"] = dict(causes=causes) - new_entries.append(event) - - return new_entries diff --git a/monasca_analytics/ldp/iptables_ldp.py b/monasca_analytics/ldp/iptables_ldp.py deleted file mode 100644 index a3e00da..0000000 --- a/monasca_analytics/ldp/iptables_ldp.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import six -import voluptuous - -import monasca_analytics.ingestor.iptables as ip_ing -import monasca_analytics.ldp.base as bt -from monasca_analytics.sml import svm_one_class -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - -FEATURES = "features" -MATRIX = "matrix" - - -class IptablesLDP(bt.BaseLDP): - """An anomaly detection life module""" - - @staticmethod - def validate_config(_config): - iptables_ldp_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()) - }, required=True) - return iptables_ldp_schema(_config) - - @staticmethod - def get_default_config(): - return {"module": IptablesLDP.__name__} - - @staticmethod - def get_params(): - return [] - - def map_dstream(self, dstream): - """Detect anomalies in a dstream using the learned classifier - - :type dstream: pyspark.streaming.DStream - :param dstream: Spark's DStream - """ - data = self._data - return dstream.map(fn.from_json)\ - .map(lambda x: (x['ctime'], x))\ - .groupByKey()\ - .flatMap(lambda r: IptablesLDP._detect_anomalies(r[1], data)) - - @staticmethod - def _detect_anomalies(rdd_entry, data): - """Classifies and marks the RDD entry as anomalous or non-anomalous - - :type rdd_entry: list[dict] - :param rdd_entry: entry to be classified - :type data: dict - :param data: contains the features and the classifier - """ - new_entries = [] - events = [] - ctimes = [] - for event in rdd_entry: - events.append(event[ip_ing.RDD_EVENT]) - ctimes.append(event["ctime"]) - features = data[FEATURES] - classifier = data[MATRIX] - - if features is None or classifier is None: - return events - - X = ip_ing.IptablesIngestor.vectorize_events(events, features) - Y = classifier.predict(X) - for i in range(len(events)): - event = events[i] - event["ctime"] = ctimes[i] - if Y[0] == svm_one_class.ANOMALY: - event["anomalous"] = True - else: - event["anomalous"] = False - new_entries.append(event) - return new_entries diff --git a/monasca_analytics/ldp/monasca/__init__.py b/monasca_analytics/ldp/monasca/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/ldp/monasca/base.py b/monasca_analytics/ldp/monasca/base.py deleted file mode 100644 index 92b7a62..0000000 --- a/monasca_analytics/ldp/monasca/base.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ldp import base - - -class MonascaBaseLDP(base.BaseLDP): - """Base class for monasca ldp, To be extended by concrete monasca LDPs.""" - pass diff --git a/monasca_analytics/ldp/monasca/helpers.py b/monasca_analytics/ldp/monasca/helpers.py deleted file mode 100644 index a5e6346..0000000 --- a/monasca_analytics/ldp/monasca/helpers.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import bisect -import time - - -def interpolate(timestamp, metric_values, metric_timestamps): - """ - :type timestamp: int - :param timestamp: Timestamp at witch we want to interpolate or extrapolate - the metric value - :type metric_values: list[dict] - :param metric_values: List of metrics - :type metric_timestamps: list[int] - :param metric_timestamps: List of timestamp for the given metric. - :rtype: float - :return: Returns the interpolated value - """ - insertion_pos = bisect.bisect_left(metric_timestamps, timestamp) - # Edge cases: - if insertion_pos == 0: - return metric_values[0]["metric"]["value"] - if insertion_pos == len(metric_timestamps) - 1: - return metric_values[len(metric_timestamps) - 1]["metric"]["value"] - if metric_timestamps[insertion_pos] == timestamp: - return metric_values[insertion_pos]["metric"]["value"] - # General case: - lo = metric_timestamps[insertion_pos - 1] - hi = metric_timestamps[insertion_pos] - dt = hi - lo - return metric_values[insertion_pos - 1]["metric"]["value"] *\ - (timestamp - lo) / dt + \ - metric_values[insertion_pos]["metric"]["value"] *\ - (hi - timestamp) / dt - - -def create_agg_metric(metric_name, meta, dimensions, timestamp, value): - return { - "metric": { - "name": metric_name, - "dimensions": dimensions, - "timestamp": timestamp, - "value": value - }, - "meta": meta, - "creation_time": int(time.time()) - } diff --git a/monasca_analytics/ldp/monasca_aggregate.py b/monasca_analytics/ldp/monasca_aggregate.py deleted file mode 100644 index fa08fd6..0000000 --- a/monasca_analytics/ldp/monasca_aggregate.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import six - -import monasca_analytics.ldp.base as bt -import monasca_analytics.ldp.monasca.helpers as helpers -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -class MonascaAggregateLDP(bt.BaseLDP): - """Monasca aggregator live data processor""" - - def __init__(self, _id, _config): - super(MonascaAggregateLDP, self).__init__(_id, _config) - self._aggregation_period = _config["period"] - self._reducer_func = MonascaAggregateLDP.select_reducer(_config) - self._suffix = "_" + _config["func"] - - @staticmethod - def validate_config(_config): - monasca_ag_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "period": voluptuous.Or(float, int), - "func": voluptuous.Or( - "avg", - "max", - "sum", - "min", - "cnt" - ) - }, required=True) - return monasca_ag_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": MonascaAggregateLDP.__name__, - "period": 60.0 * 60.0, - "func": "avg" - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('period', type_util.Number(), 60 * 60), - params.ParamDescriptor( - 'func', - type_util.Enum(['avg', 'max', 'sum', 'min', 'cnt']), - 'avg' - ) - ] - - def map_dstream(self, dstream): - """ - Map the given DStream into a new DStream where metrics - have been aggregated by name. - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream - :return: Returns the stream of aggregated metrics - """ - red = self._reducer_func - suf = self._suffix - agg_period = self._aggregation_period - # TODO(Joan): Add a filter to only aggregate some metrics - # TODO(Joan): or particular dimensions - return dstream.map(fn.from_json) \ - .window(agg_period, agg_period) \ - .map(lambda metric: (metric["metric"]["name"], metric)) \ - .groupByKey() \ - .flatMapValues(lambda metrics: MonascaAggregateLDP.aggregate( - metrics, - red, - suf - ))\ - .map(lambda metric_and_name: metric_and_name[1]) - - @staticmethod - def aggregate(all_metrics, reducer, suffix): - """ - Aggregate values produced by different providers together. - The metric name is assumed to be the same for all providers. - - :type all_metrics: list[dict] - :param all_metrics: Values to aggregate mapping to a specific - metric name. - :type reducer: ((float, float) -> float, - (float, float, float) -> float) - :param reducer: Combine the metrics values together - :type suffix: str - :param suffix: Suffix to append to the metric name in its combined form - """ - # Collect metric separately - separated_metrics = {} # type: dict[frozenset, list[dict]] - for el in all_metrics: - key = frozenset(el["metric"]["dimensions"].items()) - if key not in separated_metrics: - separated_metrics[key] = [el] - else: - separated_metrics[key].append(el) - - # Collect all dimensions - dims = {} - for metric_dims in separated_metrics.keys(): - for prop, val in six.iteritems(dict(metric_dims)): - if prop in dims: - dims[prop].add(val) - else: - dims[prop] = set(val) - - # Sort each metric - for _, metric in six.iteritems(separated_metrics): - metric.sort(key=lambda v: v["metric"]["timestamp"]) - - separated_metrics = sorted(list(separated_metrics.values()), key=len) - separated_metrics.reverse() - - # Compute the new values - new_values = [] - all_timestamps = [[x["metric"]["timestamp"] for x in l] - for l in separated_metrics] - metric_count = len(separated_metrics) - for index in range(0, len(separated_metrics[0])): - new_value = reducer[0]( - separated_metrics[0][index]["metric"]["value"], - metric_count) - new_timestamp = separated_metrics[0][index]["metric"]["timestamp"] - for metric_index in range(1, metric_count): - new_value = reducer[1](new_value, helpers.interpolate( - new_timestamp, - separated_metrics[metric_index], - all_timestamps[metric_index] - ), metric_count) - new_values.append((new_timestamp, new_value)) - - # Aggregate the other details: - metric_name = separated_metrics[0][0]["metric"]["name"] + suffix - meta = separated_metrics[0][0]["meta"] - new_metrics = [ - helpers.create_agg_metric( - metric_name, - meta, - dims, - val[0], - val[1] - ) for val in new_values - ] - return new_metrics - - @staticmethod - def select_reducer(_config): - return { - "avg": ( - lambda m, cnt: m / cnt, - lambda acc, m, cnt: m / cnt + acc, - ), - "max": ( - lambda m, cnt: m, - lambda acc, m, cnt: max(m, acc), - ), - "sum": ( - lambda m, cnt: m, - lambda acc, m, cnt: m + acc, - ), - "min": ( - lambda m, cnt: m, - lambda acc, m, cnt: min(m, acc), - ), - "cnt": ( - lambda m, cnt: m, - lambda acc, m, cnt: cnt, - ), - }[_config["func"]] diff --git a/monasca_analytics/ldp/monasca_combine.py b/monasca_analytics/ldp/monasca_combine.py deleted file mode 100644 index bf8463d..0000000 --- a/monasca_analytics/ldp/monasca_combine.py +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import math -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import six - -import monasca_analytics.ldp.base as bt -import monasca_analytics.ldp.monasca.helpers as helpers -import monasca_analytics.parsing.api as parsing -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -class MonascaCombineLDP(bt.BaseLDP): - """Monasca combiner live data processor""" - - def __init__(self, _id, _config): - super(MonascaCombineLDP, self).__init__(_id, _config) - logger.debug(_config["bindings"]) - logger.debug(_config["lambda"]) - self._combine_function = parsing.create_fn_with_config( - env=_config["bindings"], - expr_string=_config["lambda"] - ) - self._combine_period = _config["period"] - self._combine_metric_name = _config["metric"] - self._metrics_of_interest = _config["bindings"].values() - - def map_dstream(self, dstream): - """ - Map the given DStream into a new DStream where the specified metrics - have been combined together. - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream - :return: Returns the stream of combined metrics - """ - combine_fn = self._combine_function - metric_names = self._metrics_of_interest - nb_metrics = len(metric_names) - metric_name = self._combine_metric_name - return dstream.map(fn.from_json)\ - .window(self._combine_period, self._combine_period)\ - .filter(lambda x: x["metric"]["name"] in metric_names and - x["metric"]["value"] is not None) \ - .map(lambda x: (frozenset(x["metric"]["dimensions"]), x))\ - .groupByKey()\ - .flatMapValues(lambda metrics: MonascaCombineLDP.combine( - metrics, - combine_fn, - metric_name, - nb_metrics - ))\ - .map(lambda x: x[1]) - - @staticmethod - def combine(all_metrics, combine_fn, combine_metric_name, nb_of_metrics): - """ - Combine the given metrics of this RDD into one. - - :type all_metrics: pyspark.resultiterable.ResultIterable - :param all_metrics: List containing the metrics. - :param combine_fn: Combiner. - :type combine_metric_name: str - :param combine_metric_name: Name of the new metric - :type nb_of_metrics: int - :param nb_of_metrics: The number of metrics expected - """ - # Separate metrics based on name - separated_metrics = {} # type: dict[str, list[dict]] - dims = None - for el in all_metrics: - key = el["metric"]["name"] - if dims is None: - dims = el["metric"]["dimensions"] - if key not in separated_metrics: - separated_metrics[key] = [el] - else: - separated_metrics[key].append(el) - - if len(separated_metrics.keys()) != nb_of_metrics: - return [] - - separated_metrics = sorted(list(six.iteritems(separated_metrics)), - key=lambda x: len(x[1])) - separated_metrics = separated_metrics # type: list[(str, list[dict])] - - # Sort each metric - for metric in separated_metrics: - metric[1].sort(key=lambda v: v["metric"]["timestamp"]) - - temp_values = [] - all_timestamp = [[x["metric"]["timestamp"] for x in l[1]] - for l in separated_metrics] - for index in range(0, len(separated_metrics[0][1])): - current_env = { - separated_metrics[0][0]: - separated_metrics[0][1][index]["metric"]["value"] - } - timestamp = all_timestamp[0][index] - for metric_index in range(1, len(separated_metrics)): - metric_prop = separated_metrics[metric_index] - metric_name = metric_prop[0] - current_env[metric_name] = helpers.interpolate( - timestamp, - metric_prop[1], - all_timestamp[metric_index] - ) - temp_values.append(current_env) - - new_values = map(combine_fn, temp_values) - - new_metrics = [ - helpers.create_agg_metric( - combine_metric_name, - {}, - dims, - tsmp, - val - ) for val, tsmp in zip(new_values, all_timestamp[0]) - ] - return new_metrics - - @staticmethod - def validate_config(_config): - monasca_comb_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "metric": six.string_types[0], - "period": voluptuous.And( - voluptuous.Or(float, int), - lambda i: i >= 0 and math.floor(i) == math.ceil(i)), - "lambda": six.string_types[0], - "bindings": { - six.string_types[0]: voluptuous.Or( - "apache.net.kbytes_sec", - "apache.net.requests_sec", - "apache.performance.cpu_load_perc", - "cpu.idle_perc", - "cpu.stolen_perc", - "cpu.system_perc", - "cpu.total_logical_cores", - "cpu.user_perc", - "cpu.wait_perc", - "disk.allocation", - "disk.inode_used_perc", - "disk.space_used_perc", - "disk.total_space_mb", - "disk.total_used_space_mb", - "host_alive_status", - "io.read_kbytes_sec", - "io.read_req_sec", - "io.write_time_sec", - "kafka.consumer_lag", - "load.avg_1_min", - "load.avg_5_min", - "mem.free_mb", - "mem.swap_free_mb", - "mem.swap_total_mb", - "mem.total_mb", - "mem.usable_mb", - "mem.used_cache", - "metrics-added-to-batch-counter[0]", - "mysql.innodb.buffer_pool_free", - "mysql.innodb.buffer_pool_used", - "mysql.innodb.data_reads", - "mysql.innodb.mutex_spin_rounds", - "mysql.performance.com_delete_multi", - "mysql.performance.com_insert", - "mysql.performance.com_insert_select", - "mysql.performance.com_select", - "mysql.performance.com_update", - "mysql.performance.created_tmp_disk_tables", - "mysql.performance.created_tmp_files", - "mysql.performance.open_files", - "mysql.performance.questions", - "mysql.performance.user_time", - "net.in_bytes_sec", - "net.in_errors_sec", - "net.in_packets_dropped_sec", - "net.in_packets_sec", - "net.out_bytes_sec", - "net.out_errors_sec", - "net.out_packets_dropped_sec", - "net.out_packets_sec", - "nova.vm.disk.total_allocated_gb", - "process.pid_count", - "raw-sql.time.max", - "vcpus", - "vm.cpu.utilization_perc", - "vm.host_alive_status", - "vm.mem.total_mb", - "zookeeper.out_bytes", - "zookeeper.outstanding_bytes" - ) - } - }, required=True) - monasca_comb_schema(_config) - # Checks the expression and the environment - handle = parsing.validate_expression(_config["lambda"]) - parsing.validate_name_binding(handle, - _config["bindings"]) - - @staticmethod - def get_default_config(): - return { - "module": MonascaCombineLDP.__name__, - "metric": "cpu.logical_cores_actives", - "period": 1, - "lambda": "a * b", - "bindings": { - "a": "cpu.idle_perc", - "b": "cpu.total_logical_cores" - } - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor( - 'metric', - type_util.String(), - 'cpu.logcal_cores_actives' - ), - params.ParamDescriptor( - 'period', - type_util.Number(), - 1 - ), - params.ParamDescriptor( - 'lambda', - type_util.String(), - 'a * b' - ), - params.ParamDescriptor( - 'bindings', - type_util.Any(), - {'a': 'cpu.ilde_perc', 'b': 'cpu.total_logical_cores'} - ) - ] diff --git a/monasca_analytics/ldp/monasca_derivative.py b/monasca_analytics/ldp/monasca_derivative.py deleted file mode 100644 index c82cb76..0000000 --- a/monasca_analytics/ldp/monasca_derivative.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import math -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import six - -import monasca_analytics.ldp.base as bt -import monasca_analytics.ldp.monasca.helpers as helpers -import monasca_analytics.util.spark_func as fn -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -# FIXME: This code is inaccurate because values on "edge" of the RDD -# FIXME: have a computed derivative with less precision than others. -# FIXME: The base idea would be to use the sliding window capability -# FIXME: to compute the derivative with the unbiased variant for all -# FIXME: values. However, we need a way to "know" how many derivative -# FIXME: calculation values needs to be skipped from one window to the -# FIXME: other. -# FIXME: -class MonascaDerivativeLDP(bt.BaseLDP): - """Monasca derivative live data processor""" - - def __init__(self, _id, _config): - super(MonascaDerivativeLDP, self).__init__(_id, _config) - self._period = _config["period"] - - @staticmethod - def validate_config(_config): - monasca_der_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - # Derivative period in multiple of batch interval - "period": voluptuous.And( - voluptuous.Or(float, int), - lambda i: i >= 0 and math.floor(i) == math.ceil(i)) - }, required=True) - return monasca_der_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": MonascaDerivativeLDP.__name__, - "period": 1 - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('period', type_util.Number(), 1) - ] - - def map_dstream(self, dstream): - """ - Map the given DStream into a new DStream where metrics - are replaced with their derivative. - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream - :return: Returns the stream of derivative. - """ - period = self._period - return dstream.map(fn.from_json) \ - .window(period, period) \ - .map(lambda m: ((frozenset( - list(m["metric"]["dimensions"].items())), - m["metric"]["name"]), - m)) \ - .groupByKey() \ - .flatMapValues(lambda metric: MonascaDerivativeLDP.derivative( - metric, - )) \ - .map(lambda x: x[1]) - - @staticmethod - def derivative(metric_values): - """ - Compute the derivative of the given function. - - :type metric_values: pyspark.resultiterable.ResultIterable[dict] - :param metric_values: The list of metric_values - :return: Returns the derivative of the provided metric. - """ - if len(metric_values.data) < 2: - return [] - - metric_name = metric_values.data[0]["metric"]["name"] + "_derivative" - meta = metric_values.data[0]["meta"] - dims = metric_values.data[0]["metric"]["dimensions"] - # All values - timestamps = [m["metric"]["timestamp"] for m in metric_values] - all_values = [m["metric"]["value"] for m in metric_values] - # Sort values - all_values = [y for (_, y) in - sorted(zip(timestamps, all_values), key=lambda x: x[0])] - timestamps = sorted(timestamps) - # Remove duplicates - last_timestamp = timestamps[0] - tmp_all_values = [all_values[0]] - tmp_timestamps = [last_timestamp] - for index in range(1, len(timestamps)): - if timestamps[index] == last_timestamp: - continue - else: - last_timestamp = timestamps[index] - tmp_all_values.append(all_values[index]) - tmp_timestamps.append(last_timestamp) - all_values = tmp_all_values - timestamps = tmp_timestamps - - if len(all_values) < 2: - return [] - - # Filter all values that have the same timestamp - n = len(all_values) - 1 - new_values = [ - float(all_values[1] - all_values[0]) / - float(timestamps[1] - timestamps[0]) - ] - for index in range(1, n): - new_values.append( - float(all_values[index + 1] - all_values[index - 1]) / - float(timestamps[index + 1] - timestamps[index - 1]) - ) - new_values.append( - float(all_values[n] - all_values[n - 1]) / - float(timestamps[n] - timestamps[n - 1]) - ) - new_metrics = [ - helpers.create_agg_metric( - metric_name, - meta, - dims, - tmst, - val - ) for val, tmst in zip(new_values, timestamps) - ] - return new_metrics diff --git a/monasca_analytics/monanas.py b/monasca_analytics/monanas.py deleted file mode 100644 index 2e6b1e4..0000000 --- a/monasca_analytics/monanas.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os -import sys - -from tornado import ioloop -import voluptuous - -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.pass_manager as executor -import monasca_analytics.exception.monanas as err -import monasca_analytics.spark.driver as driver -import monasca_analytics.util.common_util as cu -import monasca_analytics.web_service.web_service as ws - -logger = logging.getLogger(__name__) - -debugging = False - - -class Monanas(object): - """Monanas. - - Monanas entry point. This class implements the high level functions to - manage the streaming. - - Currently: start and stop. - """ - - def __init__(self, _config): - """Monanas constructor. - - It validates the configuration passed as parameter and, - if it is fine, it creates the components defined by it. - - :type _config: dict - :param _config: configuration of the system. - """ - self._is_streaming = False - self._driver = driver.DriverExecutor(_config) - logger.info("Monanas initialized.") - - def is_streaming(self): - """Gets the status of streaming. - - :rtype: bool - :returns: `True` if Monanas is streaming,`False` otherwise. - """ - return self._is_streaming - - def try_change_configuration(self, banana_str, emitter): - """Try to change the configuration to the provided one. - - :type banana_str: str - :param banana_str: New configuration. - :type emitter: emit.JsonEmitter - :param emitter: a Json emitter instance - """ - if not isinstance(emitter, emit.JsonEmitter): - raise err.MonanasException() - # Try to change the configuration. - executor.execute_banana_string(banana_str, self._driver, emitter) - - def typeck_configuration(self, banana_str, emitter): - """Only type check the provided configuration. - - :type banana_str: str - :param banana_str: New configuration. - :type emitter: emit.JsonEmitter - :param emitter: a Json emitter instance - """ - executor.execute_banana_string(banana_str, None, emitter) - - def compute_type_table(self, banana_str): - """Compute the type table for the provided configuration. - - :type banana_str: str - :param banana_str: Configuration to test. - :rtype: dict - :return: Returns the type table - """ - type_table = executor.try_compute_type_table(banana_str) - if type_table is not None: - return type_table.to_json() - return {} - - def start_streaming(self): - """Starts streaming data. - - :raises: MonanasStreamingError -- if one or more sources fail to bind - or StreamingContext fails to start. - :raises: MonanasAlreadyStartedStreaming -- if Monanas is already - streaming. - """ - if not self._is_streaming: - try: - self._driver.start_pipeline() - self._is_streaming = True - except Exception: - raise err.MonanasStreamingError() - else: - raise err.MonanasAlreadyStartedStreaming() - - def stop_streaming(self): - """Stops streaming data. - - :raises: MonanasAlreadyStoppedStreaming -- if Monanas is not streaming - """ - if self._is_streaming: - self._driver.stop_pipeline() - self._is_streaming = False - else: - raise err.MonanasAlreadyStoppedStreaming() - - def stop_streaming_and_terminate(self): - """Stops streaming data and terminate Monanas.""" - try: - self.stop_streaming() - logger.info("All streaming stopped.") - except (err.MonanasAlreadyStoppedStreaming, NameError): - logger.info("All streaming stopped.") - logger.info("Monanas stopped.") - os.kill(os.getpid(), 1) - - -if __name__ == "__main__": - monanas = None - if debugging: - import pydevd - pydevd.settrace(suspend=False) - try: - try: - cu.setup_logging(sys.argv[2]) - except IOError: - raise err.MonanasMainError("File not found: \ - `{0}`.".format(sys.argv[2])) - except ValueError: - raise err.MonanasMainError("`{0}` is not a valid logging \ - config file.".format(sys.argv[2])) - - logger = logging.getLogger(__name__) - - try: - config = cu.parse_json_file(sys.argv[1]) - except IOError: - raise err.MonanasMainError("File not found: \ - `{0}`.".format(sys.argv[1])) - except ValueError as e: - raise err.MonanasMainError("`{0}` is not a \ - valid json file.".format(sys.argv[1])) - except voluptuous.Invalid: - raise err.MonanasMainError("`{0}` has an \ - invalid schema.".format(sys.argv[1])) - - monanas = Monanas(config) - web_service = ws.WebService(monanas, config["server"]) - web_service.listen(config["server"]["port"]) - ioloop.IOLoop.instance().start() - except IOError as e: - logger.error("Address already in use.") - except (err.MonanasInitError, err.MonanasMainError) as e: - logger.error(e.__str__()) - except KeyboardInterrupt: - try: - if monanas is not None: - monanas.stop_streaming_and_terminate() - except NameError: - logger.info("Premature termination.") - except Exception as e: - logger.error("Unexpected error: {0}. {1}.". - format(sys.exc_info()[0], e)) - - try: - if monanas is not None: - monanas.stop_streaming_and_terminate() - except NameError: - logger.info("Premature termination.") - - logger.info("Monanas stopped.") diff --git a/monasca_analytics/parsing/__init__.py b/monasca_analytics/parsing/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/parsing/api.py b/monasca_analytics/parsing/api.py deleted file mode 100644 index a0caee3..0000000 --- a/monasca_analytics/parsing/api.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.parsing.expression import create_fn_with_config -from monasca_analytics.parsing.expression import validate_environment -from monasca_analytics.parsing.expression import validate_expression -from monasca_analytics.parsing.expression import validate_name_binding - -create_fn_with_config = create_fn_with_config -validate_expression = validate_expression -validate_environment = validate_environment -validate_name_binding = validate_name_binding diff --git a/monasca_analytics/parsing/expression.py b/monasca_analytics/parsing/expression.py deleted file mode 100644 index 8b96e6e..0000000 --- a/monasca_analytics/parsing/expression.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import pyparsing as p -import types - -import monasca_analytics.banana.bytecode.assembler as asbl -import monasca_analytics.exception.banana as exception -import monasca_analytics.parsing.private as priv - -import six - - -logger = logging.getLogger(__name__) - - -class ExpressionParser(object): - - def __init__(self): - """ - Create a parser that parse arithmetic expressions. They can - contains variable identifiers or raw numbers. The meaning - for the identifiers is left to the - """ - number = p.Regex(r'\d+(\.\d*)?([eE]\d+)?') - identifier = p.Word(p.alphas) - terminal = identifier | number - self._expr = p.infixNotation(terminal, [ - (p.oneOf('* /'), 2, p.opAssoc.LEFT), - (p.oneOf('+ -'), 2, p.opAssoc.LEFT) - ]) + p.stringEnd() - - def parse(self, string, code=asbl.Code()): - """ - Parse a given string and construct an Evaluator - :type string: six.string_types - :param string: String to parse. - :type code: ass.Code - :param code: Generated code will be written here. - :return: Returns an evaluator that will returns a value - given the appropriate environment to resolve - variables. - """ - tree = self._expr.parseString(string)[0] - self._build_tree(tree, code) - - def parse_tree(self, expr): - """ - Parse the given string and return the generated tree - by pyparsing. - :type expr: str - :param expr: Expression to parse. - :return: Returns the generated tree. - """ - return self._expr.parseString(expr) - - @staticmethod - def _build_tree(subtree, code): - """ - :type subtree: list - :param subtree: Sub tree to parse - :type code: ass.Code - :param code: Generated code is written here. - """ - current_operator = None - pushed_one_stack_value = False - for child in subtree: - if isinstance(child, six.string_types): - if priv.is_op(child): - current_operator = child - else: - code(asbl.Local(child)) - if not pushed_one_stack_value: - pushed_one_stack_value = True - else: - ExpressionParser._push_op(current_operator, code) - else: - ExpressionParser._build_tree(child, code) - if not pushed_one_stack_value: - pushed_one_stack_value = True - else: - ExpressionParser._push_op(current_operator, code) - - @staticmethod - def _push_op(operator, code): - if operator is None: - raise exception.BananaInvalidExpression( - "Bug found! please fill a bug report on ??" - ) - if operator == '+': - code.BINARY_ADD() - elif operator == '-': - code.BINARY_SUBTRACT() - elif operator == '/': - code.BINARY_DIVIDE() - elif operator == '*': - code.BINARY_MULTIPLY() - - -def create_fn_with_config(env, expr_string): - """ - Create an evaluator given the expected - environment renaming and expression. - :type env: dict[str, str] - :param env: Environment to use. - :type expr_string: str - :param expr_string: String containing the expression - to be evaluated - :returns: Returns a function that accept one argument - expected to be the environment. - """ - code = asbl.Code() - # Argument - code(asbl.Local('__monanas__env')) - code.co_argcount = 1 - # Create local variables - for key, value in six.iteritems(env): - code(asbl.Call( - asbl.Getattr( - asbl.Local('__monanas__env'), 'get'), - [asbl.Const(value)]), - asbl.LocalAssign(str(key))) - parser = ExpressionParser() - try: - parser.parse(expr_string, code) - except p.ParseException as e: - raise exception.BananaInvalidExpression(e.message) - code.RETURN_VALUE() - final_fn = types.FunctionType(code.code(), globals()) - return final_fn - - -def validate_environment(env): - """ - Validate the given arguments that create_fn_with_config - is expecting. - :param env: Environment spec - """ - for key, val in six.iteritems(env): - if not isinstance(key, six.string_types): - raise exception.BananaEnvironmentError( - "{} is not a valid key (only string are)".format(key) - ) - if not isinstance(val, six.string_types): - raise exception.BananaEnvironmentError( - "{} is not a valid value (only string are)".format(val) - ) - - -def validate_expression(expr_string): - """ - Validate the provided expression string. - :type expr_string: str - :param expr_string: Expression string to validate. - :returns: Returns a handle that can be use to validate - name usage against an environment. - :raises: exception.BananaInvalidExpression - """ - if not isinstance(expr_string, six.string_types): - raise exception.BananaArgumentTypeError( - expected_type=six.string_types[0], - received_type=type(expr_string) - ) - parser = ExpressionParser() - try: - res = parser.parse_tree(expr_string) - return ExpressionHandle(res, expr_string) - except p.ParseException as e: - raise exception.BananaInvalidExpression(str(e)) - - -def validate_name_binding(expr_handle, environment): - """ - Validate the name binding in the expr_handle for - the provided environment. - :type expr_handle: ExpressionHandle - :param expr_handle: The expression handle - :type environment: dict - :param environment: The environment - """ - if not isinstance(expr_handle, ExpressionHandle): - raise exception.BananaArgumentTypeError( - expected_type=ExpressionHandle, - received_type=type(expr_handle) - ) - - def collect_names(subtree): - """ - Collect names used in this subtree - :type subtree: list - :param subtree: subtree - """ - for child in subtree: - if isinstance(child, six.string_types): - if priv.is_not_op(child): - names.add(child) - else: - collect_names(child) - names = set() - collect_names(expr_handle.tree) - for name in names: - if name not in list(environment.keys()): - raise exception.BananaInvalidExpression( - "The expression '{}' can't be used with the provided " - "environment: '{}'. Reason: '{}' is not defined.".format( - expr_handle.original_str, - environment, - name - ) - ) - - -class ExpressionHandle(object): - def __init__(self, tree, original_string): - self.tree = tree - self.original_str = original_string diff --git a/monasca_analytics/parsing/private.py b/monasca_analytics/parsing/private.py deleted file mode 100644 index c77f822..0000000 --- a/monasca_analytics/parsing/private.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -EXPRESSION_OPERATOR_LIST = ['+', '-', '*', '/'] - - -def is_op(x): - return x in EXPRESSION_OPERATOR_LIST - - -def is_not_op(x): - return x not in EXPRESSION_OPERATOR_LIST diff --git a/monasca_analytics/sink/__init__.py b/monasca_analytics/sink/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/sink/base.py b/monasca_analytics/sink/base.py deleted file mode 100644 index 20fc4a5..0000000 --- a/monasca_analytics/sink/base.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import six - -from monasca_analytics.component import base - - -@six.add_metaclass(abc.ABCMeta) -class BaseSink(base.BaseComponent): - """Base class for dstream sink to be extended by concrete dstream sinks.""" - - @abc.abstractmethod - def sink_dstream(self, dstream): - pass - - @abc.abstractmethod - def sink_ml(self, voter_id, matrix): - pass diff --git a/monasca_analytics/sink/base_sqlite.py b/monasca_analytics/sink/base_sqlite.py deleted file mode 100644 index aeeca8f..0000000 --- a/monasca_analytics/sink/base_sqlite.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import logging -import six -from six.moves import cPickle -import sqlite3 -import time - - -from monasca_analytics.sink import base - - -DB_NAME_DEFAULT = "sqlite_sink.db" -logger = logging.getLogger(__name__) - - -@six.add_metaclass(abc.ABCMeta) -class BaseSQLiteSink(base.BaseSink): - """Base class for SQLite sink to be extended by concrete implementations""" - - def __init__(self, _id, _config): - super(BaseSQLiteSink, self).__init__(_id, _config) - self.db_name = self._get_db_name(_config) - with sqlite3.connect(self.db_name) as conn: - c = conn.cursor() - c.execute(self._rdds_table_create_query()) - c.execute('''CREATE TABLE IF NOT EXISTS smls - (timestamp INTEGER, voter_id TEXT, sml BLOB)''') - conn.commit() - - def _get_db_name(self, _config): - if "db_name" in _config: - return _config["db_name"] - return DB_NAME_DEFAULT - - def sink_dstream(self, dstream): - dstream.foreachRDD(self._persist) - - def _persist(self, _, rdd): - rdd_entries = rdd.collect() - with sqlite3.connect(self.db_name) as conn: - c = conn.cursor() - for rdd_entry in rdd_entries: - query = self._rdd_insert_query(rdd_entry) - c.execute(query) - conn.commit() - - def sink_ml(self, voter_id, matrix): - with sqlite3.connect(self.db_name) as conn: - c = conn.cursor() - timestamp = time.time() - blob_matrix = cPickle.dumps(matrix, cPickle.HIGHEST_PROTOCOL) - c.execute( - 'INSERT INTO smls (timestamp, voter_id, sml) VALUES(?, ?, ?);', - [timestamp, voter_id, sqlite3.Binary(blob_matrix)]) - conn.commit() - - @abc.abstractmethod - def _rdds_table_create_query(self): - pass - - @abc.abstractmethod - def _rdd_insert_query(self, rdd_json): - pass diff --git a/monasca_analytics/sink/file.py b/monasca_analytics/sink/file.py deleted file mode 100644 index 3554fb1..0000000 --- a/monasca_analytics/sink/file.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import os.path as path -import tempfile -import time -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import monasca_analytics.sink.base as base -from monasca_analytics.util import validation_utils as vu - - -import six - - -class FileSink(base.BaseSink): - """Sink that prints the dstream to a file in the driver - - This sink is for development **only**. - """ - - def __init__(self, _id, _config): - super(FileSink, self).__init__(_id, _config) - if _config["path"] is not None: - _path = path.expanduser(_config["path"]) - if path.isdir(_path): - _path = path.join(_path, time.time() + '.log') - self._file_path = _path - else: - self._file_path = tempfile.NamedTemporaryFile().name - - def sink_dstream(self, dstream): - """ - Sink the provided DStream into a file. - - :type dstream: pyspark.streaming.DStream - :param dstream: DStream to sink - """ - _file_name = self._file_path - - def write_output(rdd): - _file = open(_file_name, 'a+') - for rdd_entry in rdd.collect(): - _file.write(json.dumps(rdd_entry, indent=4)) - - dstream.foreachRDD(lambda _, rdd: write_output(rdd)) - - def sink_ml(self, voter_id, matrix): - pass - - @staticmethod - def get_default_config(): - return { - "module": FileSink.__name__, - "path": None - } - - @staticmethod - def get_params(): - return [params.ParamDescriptor('path', type_util.String())] - - @staticmethod - def validate_config(_config): - file_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "path": voluptuous.Or( - voluptuous.And(six.string_types[0], vu.ExistingPath()), - None) - }, required=True) - return file_schema(_config) diff --git a/monasca_analytics/sink/iptables_sqlite.py b/monasca_analytics/sink/iptables_sqlite.py deleted file mode 100644 index 31e7390..0000000 --- a/monasca_analytics/sink/iptables_sqlite.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import monasca_analytics.sink.base_sqlite as base -from monasca_analytics.util import validation_utils as vu - - -import six - - -class IptablesSQLiteSink(base.BaseSQLiteSink): - """IPTables SQLite Sink implementation.""" - - def _rdds_table_create_query(self): - return """CREATE TABLE IF NOT EXISTS rdds - (msg TEXT, anomalous TEXT, msg_id TEXT, ctime TEXT)""" - - def _rdd_insert_query(self, rdd_json): - return ('INSERT INTO rdds VALUES("' + str(rdd_json["msg"]) + '", "' + - str(rdd_json["anomalous"]) + '", "' + str(rdd_json["id"]) + - '", "' + str(rdd_json["ctime"]) + '")') - - @staticmethod - def get_default_config(): - return { - "module": IptablesSQLiteSink.__name__, - "db_name": "sqlite_sink.db" - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('db_name', - type_util.String(), - 'sqlite_sink.db') - ] - - @staticmethod - def validate_config(_config): - iptables_sql_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - voluptuous.Optional("db_name"): voluptuous.And( - six.string_types[0], vu.NoSpaceCharacter()), - }, required=True) - return iptables_sql_schema(_config) diff --git a/monasca_analytics/sink/kafkas.py b/monasca_analytics/sink/kafkas.py deleted file mode 100644 index 4d31f95..0000000 --- a/monasca_analytics/sink/kafkas.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import time - -import kafka - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -from monasca_analytics.sink import base -import monasca_analytics.sink.sink_config_validator as validator - - -class KafkaSink(base.BaseSink): - """A Kafka sink for dstream""" - - def __init__(self, _id, _config): - self._topic = None - self._producer = None - super(KafkaSink, self).__init__(_id, _config) - self._host = _config["host"] - self._port = int(_config["port"]) - self._topic = _config["topic"] - - def sink_dstream(self, dstream): - if self._producer is None: - self._producer = kafka.KafkaProducer( - bootstrap_servers="{0}:{1}".format(self._host, self._port)) - dstream.foreachRDD(self._persist) - - def _persist(self, _, rdd): - rdd_entries = rdd.collect() - - for rdd_entry in rdd_entries: - self._producer.send(self._topic, - json.dumps(rdd_entry)) - self._producer.flush() - - def sink_ml(self, voter_id, matrix): - output = dict( - id=voter_id, - matrix=matrix, - timestamp=time.time() - ) - self._producer.send(self._topic, - json.dumps(output)) - - @staticmethod - def validate_config(_config): - validator.validate_kafka_sink_config(_config) - - @staticmethod - def get_default_config(): - return { - "module": KafkaSink.__name__, - "host": "localhost", - "port": 9092, - "topic": "transformed_alerts" - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('host', type_util.String(), 'localhost'), - params.ParamDescriptor('port', type_util.Number(), 9092), - params.ParamDescriptor('topic', type_util.String(), - 'transformed_alerts') - ] diff --git a/monasca_analytics/sink/sink_config_validator.py b/monasca_analytics/sink/sink_config_validator.py deleted file mode 100644 index 08a45b1..0000000 --- a/monasca_analytics/sink/sink_config_validator.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""A list of functions for validating sink configs.""" - -import math -import voluptuous - -from monasca_analytics.util import validation_utils as vu - - -import six - - -def validate_kafka_sink_config(config): - """Validates the KafkaSink configuration""" - - config_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], vu.AvailableSink()), - "host": voluptuous.And( - six.string_types[0], vu.NoSpaceCharacter()), - "port": voluptuous.And( - voluptuous.Or(float, int), - lambda i: i >= 0 and math.floor(i) == math.ceil(i)), - "topic": voluptuous.And( - six.string_types[0], vu.NoSpaceCharacter()) - }, required=True) - return config_schema(config) diff --git a/monasca_analytics/sink/stdout_sink.py b/monasca_analytics/sink/stdout_sink.py deleted file mode 100644 index a66a8c4..0000000 --- a/monasca_analytics/sink/stdout_sink.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import voluptuous - -from monasca_analytics.sink import base -from monasca_analytics.util import validation_utils as vu - - -import six - - -class StdoutSink(base.BaseSink): - """Sink that prints the dstream to stdout, using pprint command""" - - def sink_dstream(self, dstream): - dstream.pprint(1000) - - def sink_ml(self, voter_id, matrix): - pass - - @staticmethod - def get_default_config(): - return {"module": StdoutSink.__name__} - - @staticmethod - def validate_config(_config): - stdout_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()) - }, required=True) - stdout_schema(_config) - - @staticmethod - def get_params(): - return [] diff --git a/monasca_analytics/sml/__init__.py b/monasca_analytics/sml/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/sml/base.py b/monasca_analytics/sml/base.py deleted file mode 100644 index d7f23ca..0000000 --- a/monasca_analytics/sml/base.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc - -from monasca_analytics.component import base - - -class BaseSML(base.BaseComponent): - """Base SML, to be extended by statistical or machine learning classes""" - - def __init__(self, _id, _config): - super(BaseSML, self).__init__(_id, _config) - self._voter = None - - @abc.abstractmethod - def learn_structure(self, samples): - """Learn structure based on the provided data - - Abstract method to be implemented by subclasses. - It should learn over those samples a structure such as - a causality matrix or a decision tree that is then - going to be suggested to a voter which then - forward it to a LDP. - - :type samples: numpy.ndarray - :param samples: the list of samples to be processed - :rtype: numpy.ndarray - :returns: The information learned with the training set. - """ - pass - - @abc.abstractmethod - def number_of_samples_required(self): - """This function returns the number of samples required - - Algorithm typically requires a number of samples before - being able to produce a result. You can specify this constraint - with this function. - - :rtype: int - :returns: the number of samples required. - """ - pass - - def learn(self, samples): - """Learning phase - - This method is called by the aggregator owning this sml. - - :type samples: numpy.ndarray - :param samples: the list of samples that can be - processed by the data. - """ - self._voter.suggest_structure(self, self.learn_structure(samples)) - - def set_voter(self, voter): - if self._voter is not None: - self._voter.remove_sml(self) - self._voter = voter - self._voter.append_sml(self) diff --git a/monasca_analytics/sml/decision_tree.py b/monasca_analytics/sml/decision_tree.py deleted file mode 100644 index b7b98d8..0000000 --- a/monasca_analytics/sml/decision_tree.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn.metrics import classification_report -from sklearn import tree -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = 1 -NON_ANOMALY = 0 -N_SAMPLES = 1000 - - -class DecisionTreeClassifier(BaseSML): - """Anomaly detection based on the DecisionTreeClassifier algorithm""" - - def __init__(self, _id, _config): - super(DecisionTreeClassifier, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - decisiontree_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return decisiontree_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': DecisionTreeClassifier.__name__, - 'nb_samples': N_SAMPLES - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - - data, labels = np.hsplit(samples, [-1]) - X_train = np.array(data[:num_samples_train]) - _labels = np.array(labels[:num_samples_train]) - X_train_label = _labels.ravel() - X_test = np.array(data[num_samples_train:]) - _labels = np.array(labels[num_samples_train:]) - X_test_label = _labels.ravel() - return X_train, X_train_label, X_test, X_test_label - - def _get_best_detector(self, train, label): - detector = tree.DecisionTreeClassifier() - detector.fit(train, label) - return detector - - def learn_structure(self, samples): - X_train, X_train_label, X_test, X_test_label = \ - self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - dt_detector = self._get_best_detector(X_train, X_train_label) - Y_test = dt_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - - logger.info('Confusion Matrix: \n{}'. - format(classification_report( - X_test_label, - Y_test, - target_names=['no', 'yes']))) - return dt_detector diff --git a/monasca_analytics/sml/elliptic_envelope.py b/monasca_analytics/sml/elliptic_envelope.py deleted file mode 100644 index 69cc2cb..0000000 --- a/monasca_analytics/sml/elliptic_envelope.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn import covariance -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = -1 -NON_ANOMALY = 1 -N_SAMPLES = 1000 - - -class EllipticEnvelope(BaseSML): - """Anomaly detection based on the EllipticEnvelope algorithm""" - - def __init__(self, _id, _config): - super(EllipticEnvelope, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - elliptic_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return elliptic_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': EllipticEnvelope.__name__, - 'nb_samples': N_SAMPLES - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - X_train = np.array(samples[:num_samples_train]) - X_test = np.array(samples[num_samples_train:]) - return X_train, X_test - - def _get_best_detector(self, train): - detector = covariance.EllipticEnvelope() - detector.fit(train) - return detector - - def learn_structure(self, samples): - X_train, X_test = self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - ee_detector = self._get_best_detector(X_train) - Y_test = ee_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - return ee_detector diff --git a/monasca_analytics/sml/isolation_forest.py b/monasca_analytics/sml/isolation_forest.py deleted file mode 100644 index 4510f3b..0000000 --- a/monasca_analytics/sml/isolation_forest.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn import ensemble -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = -1 -NON_ANOMALY = 1 -N_SAMPLES = 1000 - - -class IsolationForest(BaseSML): - """Anomaly detection based on the IsolationForest algorithm""" - - def __init__(self, _id, _config): - super(IsolationForest, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - isolation_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return isolation_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': IsolationForest.__name__, - 'nb_samples': N_SAMPLES - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - X_train = np.array(samples[:num_samples_train]) - X_test = np.array(samples[num_samples_train:]) - return X_train, X_test - - def _get_best_detector(self, train): - detector = ensemble.IsolationForest() - detector.fit(train) - return detector - - def learn_structure(self, samples): - X_train, X_test = self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - if_detector = self._get_best_detector(X_train) - Y_test = if_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - return if_detector diff --git a/monasca_analytics/sml/lingam.py b/monasca_analytics/sml/lingam.py deleted file mode 100644 index 09eef7e..0000000 --- a/monasca_analytics/sml/lingam.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import math - -import numpy as np -import six -from sklearn import decomposition -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params - -from monasca_analytics.sml import base -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -class LiNGAM(base.BaseSML): - """Causality discovery assuming a linear non gaussian acyclic data model""" - - def __init__(self, _id, _config): - super(LiNGAM, self).__init__(_id, _config) - self._threshold = _config["threshold"] - self._threshold = 0.1 - - @staticmethod - def validate_config(_config): - lingam_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "threshold": float - }, required=True) - return lingam_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": LiNGAM.__name__, - "threshold": 0.1 - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('threshold', type_util.Number(), 0.1) - ] - - def number_of_samples_required(self): - return 5000 - - def learn_structure(self, samples): - logger.debug(samples.shape) - logger.debug(samples) - threshold = self._threshold - causality_matrix, _ = LiNGAM._discover_structure(samples) - structure = causality_matrix > threshold - - logger.info("Causality Matrix: {0}".format(causality_matrix)) - logger.info("Learned causality: {0}".format(structure)) - return structure - - @staticmethod - def _discover_structure(data): - - # Add a random noise uniformly distributed to avoid singularity - # when performing the ICA - data += np.random.random_sample(data.shape) - - # Create the ICA node to get the inverse of the mixing matrix - k, w, _ = decomposition.fastica(data) - - w = np.dot(w, k) - n = w.shape[0] - best_nzd = float("inf") - best_slt = float("inf") - best_w_permuted = w - causality_matrix = None - causal_perm = None - - if n < 9: - perm = LiNGAM._perms(n) - - for i in range(perm.shape[1]): - perm_matrix = np.eye(n) - perm_matrix = perm_matrix[:, perm[:, i]] - w_permuted = perm_matrix.dot(w) - cost = LiNGAM._cost_non_zero_diag(w_permuted) - if cost < best_nzd: - best_nzd = cost - best_w_permuted = w_permuted - - w_opt = best_w_permuted - - w_opt = w_opt / np.diag(w_opt).reshape((n, 1)) - b_matrix = np.eye(n) - w_opt - best_b_permuted = b_matrix - best_i = 0 - - for i in range(perm.shape[1]): - b_permuted = b_matrix[:, perm[:, i]][perm[:, i], :] - cost = LiNGAM._cost_strictly_lower_triangular( - b_permuted) - if cost < best_slt: - best_slt = cost - best_i = i - best_b_permuted = b_permuted - - causal_perm = perm[:, best_i] - causality_matrix = b_matrix - - percent_upper = best_slt / np.sum(best_b_permuted ** 2) - - if percent_upper > 0.2: - # TODO(David): Change that code to raise an exception instead - logger.error("LiNGAM failed to run on the data set") - logger.error( - "--> B permuted matrix is at best {}% lower triangular" - .format(percent_upper)) - - return causality_matrix, causal_perm - - @staticmethod - def _cost_strictly_lower_triangular(b): - return np.sum((np.tril(b, -1) - b) ** 2) - - @staticmethod - def _cost_non_zero_diag(w): - return np.sum(1 / np.abs(np.diag(w))) - - @staticmethod - def _perms(n): - k = 1 - p = np.empty((2 * n - 1, math.factorial(n)), np.uint8) - for i in range(n): - p[i, :k] = i - p[i + 1:2 * i + 1, :k] = p[:i, :k] - for j in range(i): - p[:i + 1, k * (j + 1):k * (j + 2)] = p[j + 1:j + i + 2, :k] - k *= i + 1 - return p[:n, :] diff --git a/monasca_analytics/sml/logistic_regression.py b/monasca_analytics/sml/logistic_regression.py deleted file mode 100644 index 30e5d1c..0000000 --- a/monasca_analytics/sml/logistic_regression.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn import linear_model -from sklearn.metrics import classification_report -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = 1 -NON_ANOMALY = 0 -N_SAMPLES = 1000 - - -class LogisticRegression(BaseSML): - """Anomaly detection based on the LogisticRegression algorithm""" - - def __init__(self, _id, _config): - super(LogisticRegression, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - log_reg_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return log_reg_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': LogisticRegression.__name__, - 'nb_samples': N_SAMPLES - } - - def get_params(): - return [ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - - data, labels = np.hsplit(samples, [-1]) - X_train = np.array(data[:num_samples_train]) - _labels = np.array(labels[:num_samples_train]) - X_train_label = _labels.ravel() - X_test = np.array(data[num_samples_train:]) - _labels = np.array(labels[num_samples_train:]) - X_test_label = _labels.ravel() - return X_train, X_train_label, X_test, X_test_label - - def _get_best_detector(self, train, label): - detector = linear_model.LogisticRegression() - detector.fit(train, label) - return detector - - def learn_structure(self, samples): - X_train, X_train_label, X_test, X_test_label = \ - self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - lr_detector = self._get_best_detector(X_train, X_train_label) - Y_test = lr_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - - logger.info('Confusion Matrix: \n{}'. - format(classification_report( - X_test_label, - Y_test, - target_names=['no', 'yes']))) - return lr_detector diff --git a/monasca_analytics/sml/random_forest_classifier.py b/monasca_analytics/sml/random_forest_classifier.py deleted file mode 100644 index 66dffdf..0000000 --- a/monasca_analytics/sml/random_forest_classifier.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn import ensemble -from sklearn.metrics import classification_report -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = 1 -NON_ANOMALY = 0 -N_SAMPLES = 1000 - - -class RandomForestClassifier(BaseSML): - """Anomaly detection based on the RandomForestClassifier algorithm""" - - def __init__(self, _id, _config): - super(RandomForestClassifier, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - randomforest_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return randomforest_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': RandomForest.__name__, - 'nb_samples': N_SAMPLES - } - - def get_params(): - return [ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - - data, labels = np.hsplit(samples, [-1]) - X_train = np.array(data[:num_samples_train]) - _labels = np.array(labels[:num_samples_train]) - X_train_label = _labels.ravel() - X_test = np.array(data[num_samples_train:]) - _labels = np.array(labels[num_samples_train:]) - X_test_label = _labels.ravel() - return X_train, X_train_label, X_test, X_test_label - - def _get_best_detector(self, train, label): - detector = ensemble.RandomForestClassifier() - detector.fit(train, label) - return detector - - def learn_structure(self, samples): - X_train, X_train_label, X_test, X_test_label = \ - self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - rf_detector = self._get_best_detector(X_train, X_train_label) - Y_test = rf_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - - logger.info('Confusion Matrix: \n{}'. - format(classification_report( - X_test_label, - Y_test, - target_names=['no', 'yes']))) - return rf_detector diff --git a/monasca_analytics/sml/svc.py b/monasca_analytics/sml/svc.py deleted file mode 100644 index 22729a3..0000000 --- a/monasca_analytics/sml/svc.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn.metrics import classification_report -from sklearn import svm -import voluptuous - -from monasca_analytics.sml.base import BaseSML -from monasca_analytics.util.validation_utils import NoSpaceCharacter - -logger = logging.getLogger(__name__) - -ANOMALY = 1 -NON_ANOMALY = 0 -N_SAMPLES = 1000 - - -class Svc(BaseSML): - """Anomaly detection based on the SVC algorithm""" - - def __init__(self, _id, _config): - super(Svc, self).__init__(_id, _config) - self._nb_samples = int(_config['nb_samples']) - - @staticmethod - def validate_config(_config): - svc_schema = voluptuous.Schema({ - 'module': voluptuous.And(six.string_types[0], - NoSpaceCharacter()), - 'nb_samples': voluptuous.Or(float, int) - }, required=True) - return svc_schema(_config) - - @staticmethod - def get_default_config(): - return { - 'module': Svc.__name__, - 'nb_samples': N_SAMPLES - } - - def get_params(): - return[ - params.ParamDescriptor('nb_samples', type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - - data, labels = np.hsplit(samples, [-1]) - X_train = np.array(data[:num_samples_train]) - _labels = np.array(labels[:num_samples_train]) - X_train_label = _labels.ravel() - X_test = np.array(data[num_samples_train:]) - _labels = np.array(labels[num_samples_train:]) - X_test_label = _labels.ravel() - return X_train, X_train_label, X_test, X_test_label - - def _get_best_detector(self, train, label): - detector = svm.SVC(kernel='rbf') - detector.fit(train, label) - return detector - - def learn_structure(self, samples): - X_train, X_train_label, X_test, X_test_label = \ - self._generate_train_test_sets(samples, 0.75) - logger.info('Training with ' + str(len(X_train)) + - 'samples; testing with ' + str(len(X_test)) + ' samples.') - - svc_detector = self._get_best_detector(X_train, X_train_label) - Y_test = svc_detector.predict(X_test) - - num_anomalies = Y_test[Y_test == ANOMALY].size - logger.info('Found ' + str(num_anomalies) + - ' anomalies in testing set') - - logger.info('Confusion Matrix: \n{}'. - format(classification_report( - X_test_label, - Y_test, - target_names=['no', 'yes']))) - return svc_detector diff --git a/monasca_analytics/sml/svm_one_class.py b/monasca_analytics/sml/svm_one_class.py deleted file mode 100644 index e143b53..0000000 --- a/monasca_analytics/sml/svm_one_class.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -import six -from sklearn import svm -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -from monasca_analytics.sml import base -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - -ANOMALY = -1 -NON_ANOMALY = 1 -N_SAMPLES = 1000 -OUTLIERS_FRACTION = 0.10 - - -class SvmOneClass(base.BaseSML): - """Anomaly detection based on the SVM one class algorithm""" - - def __init__(self, _id, _config): - super(SvmOneClass, self).__init__(_id, _config) - self._nb_samples = int(_config["nb_samples"]) - - @staticmethod - def validate_config(_config): - svm_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "nb_samples": voluptuous.Or(float, int) - }, required=True) - return svm_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": SvmOneClass.__name__, - "nb_samples": N_SAMPLES - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor("nb_samples", type_util.Number(), N_SAMPLES) - ] - - def number_of_samples_required(self): - return self._nb_samples - - def _generate_train_test_sets(self, samples, ratio_train): - num_samples_train = int(len(samples) * ratio_train) - X_train = np.array(samples[:num_samples_train]) - X_test = np.array(samples[num_samples_train:]) - return X_train, X_test - - def learn_structure(self, samples): - X_train, X_test = self._generate_train_test_sets(samples, 0.75) - logger.info("Training with " + str(len(X_train)) + - "samples; testing with " + str(len(X_test)) + " samples.") - svm_detector = svm.OneClassSVM(nu=0.95 * OUTLIERS_FRACTION + 0.05, - kernel="rbf", gamma=0.1) - svm_detector.fit(X_train) - Y_test = svm_detector.predict(X_test) - num_anomalies = Y_test[Y_test == -1].size - logger.info("Found " + str(num_anomalies) + - " anomalies in testing set") - return svm_detector diff --git a/monasca_analytics/source/__init__.py b/monasca_analytics/source/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/source/base.py b/monasca_analytics/source/base.py deleted file mode 100644 index 0e20ccb..0000000 --- a/monasca_analytics/source/base.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import logging - -from monasca_analytics.component import base - -logger = logging.getLogger(__name__) - - -class BaseSource(base.BaseComponent): - """Base class for source provider - - To be extended by concrete sources - """ - - def __init__(self, _id, _config): - super(BaseSource, self).__init__(_id, _config) - # This is fine to store the config within the class for sources - # as they're not supposed to do any processing with the dstream - # Thus won't be transmitted to workers. - self._config = _config - - @abc.abstractmethod - def get_feature_list(self): - """Returns the list of features names. - - :rtype: list[str] - """ - pass - - @abc.abstractmethod - def create_dstream(self, ssc): - """Create a dstream to be consumed by Monanas. - - :type ssc: pyspark.streaming.StreamingContext - :param ssc: Spark streaming context. It shouldn't be stored by self. - :rtype: pyspark.streaming.DStream - :returns: a Spark dstream to be consumed by Monanas. - """ - pass - - @abc.abstractmethod - def terminate_source(self): - """Terminate the source. - - Note to implementers: - - Please, implement the termination logic here, like - disconnecting from a server, unsubscribing from a queue, - closing a file, etc. - """ - pass diff --git a/monasca_analytics/source/cloud_markov_chain.py b/monasca_analytics/source/cloud_markov_chain.py deleted file mode 100644 index d39c02c..0000000 --- a/monasca_analytics/source/cloud_markov_chain.py +++ /dev/null @@ -1,334 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params - -from monasca_analytics.source.markov_chain import base -from monasca_analytics.source.markov_chain import events as ev -import monasca_analytics.source.markov_chain.prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import monasca_analytics.source.markov_chain.transition as tr -from monasca_analytics.util import validation_utils as vu - -import six - - -logger = logging.getLogger(__name__) - - -class CloudMarkovChainSource(base.MarkovChainSource): - - @staticmethod - def validate_config(_config): - source_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "min_event_per_burst": voluptuous.Or(float, int), - "sleep": voluptuous.And( - float, voluptuous.Range( - min=0, max=1, min_included=False, max_included=False)), - "transitions": { - "web_service": { - "run=>slow": { - voluptuous.And(vu.NumericString()): voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - "slow=>run": { - voluptuous.And(vu.NumericString()): voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - "stop=>run": voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - "switch": { - "on=>off": voluptuous.And(voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - "off=>on": voluptuous.And(voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - "host": { - "on=>off": voluptuous.And(voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - "off=>on": voluptuous.And(voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - }, - "triggers": { - "support": { - "get_called": { - voluptuous.And(vu.NumericString()): voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range(min=0, max=1)), - }, - }, - }, - "graph": { - voluptuous.And(six.string_types[0], - vu.ValidMarkovGraph()): [six.string_types[0]] - } - }, required=True) - return source_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": CloudMarkovChainSource.__name__, - "sleep": 0.01, - "min_event_per_burst": 500, - "transitions": { - "web_service": { - "run=>slow": { - "0": 0.001, - "8": 0.02, - "12": 0.07, - "14": 0.07, - "22": 0.03, - "24": 0.001 - }, - "slow=>run": { - "0": 0.99, - "8": 0.7, - "12": 0.1, - "14": 0.1, - "22": 0.8, - "24": 0.99 - }, - "stop=>run": 0.7 - }, - "host": { - "on=>off": 0.005, - "off=>on": 0.5 - }, - "switch": { - "on=>off": 0.01, - "off=>on": 0.7 - } - }, - "triggers": { - "support": { - "get_called": { - "0": 0.1, - "8": 0.2, - "12": 0.8, - "14": 0.8, - "22": 0.5, - "24": 0.0 - } - } - }, - "graph": { - "h1:host": ["s1"], - "h2:host": ["s1"], - "s1:switch": [], - "w1:web_service": ["h1"], - "w2:web_service": ["h2"] - } - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('sleep', type_util.Number(), 0.01), - params.ParamDescriptor('min_event_per_burst', type_util.Number(), - 500), - params.ParamDescriptor('transitions', type_util.Object({ - 'web_service': type_util.Object({ - 'run=>slow': type_util.Any(), - 'slow=>run': type_util.Any(), - 'stop=>run': type_util.Any(), - }), - 'switch': type_util.Object({ - 'on=>off': type_util.Number(), - 'off=>on': type_util.Number(), - }), - 'host': type_util.Object({ - 'on=>off': type_util.Number(), - 'off=>on': type_util.Number(), - }) - })), - params.ParamDescriptor('triggers', type_util.Object({ - 'support': type_util.Object({ - 'get_called': type_util.Any() - }) - })), - params.ParamDescriptor('graph', type_util.Any()) - ] - - def get_feature_list(self): - node_names = [k.split(":")[0] - for k in dict(self._config["graph"]).keys()] - node_names.append("support_1") - return node_names - - def _create_system(self): - triggers = self._create_event_triggers() - markov_chains = self._create_markov_chain_models() - graph = self._config["graph"] - nodes = {} - support_node = base.StateNode(None, - markov_chains["support"], - triggers["support"], - _id="support_1") - - for k in graph.keys(): - node_name, node_type = k.split(":") - if node_type == "host": - nodes[node_name] = base.StateNode("on", markov_chains["host"], - triggers["host"], - _id=node_name) - elif node_type == "switch": - nodes[node_name] = base.StateNode("on", - markov_chains["switch"], - triggers["switch"], - _id=node_name) - elif node_type == "web_service": - webs = base.StateNode("run", markov_chains["web_service"], - triggers["web_service"], - _id=node_name) - support_node.dependencies.append(webs) - nodes[node_name] = webs - - for k, v in six.iteritems(graph): - node_name, _ = k.split(":") - - for depend_on in v: - if depend_on not in nodes: - logger.warn( - "Configuration error: '{}'" - " is not a proper dependency" - " of '{}'".format(depend_on, node_name)) - else: - n = nodes[node_name] - o = nodes[depend_on] - n.dependencies.append(o) - - return [support_node] - - def _create_event_triggers(self): - triggers = self._config["triggers"] - sup_tr = triggers["support"] - user_support = ev.Trigger( - prob_check=pck.ProbCheck(sup_tr["get_called"]), - node_check=dck.AnyDepCheck(dck.NeqCheck("run")), - event_builder=ev.EventBuilder( - "User complained for poor web service")) - webs1 = ev.Trigger( - node_check=dck.OrCheck( - dck.EqCheck("stop"), - dck.DepCheck(dck.EqCheck("off")), - dck.DepCheck(dck.DepCheck(dck.EqCheck("off"))) - ), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("Application is down") - ) - webs2 = ev.Trigger( - node_check=dck.EqCheck("slow"), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("Application is slow") - ) - host = ev.Trigger( - node_check=dck.OrCheck(dck.EqCheck("off"), - dck.DepCheck(dck.EqCheck("off"))), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("Host is unreachable or down") - ) - switch = ev.Trigger( - node_check=dck.EqCheck("off"), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("Switch is unreachable or down") - ) - - return { - "switch": switch, - "host": host, - "web_service": [webs1, webs2], - "support": user_support - } - - def _create_markov_chain_models(self): - transitions = self._config["transitions"] - - # Switch Transitions - sw_tr = transitions["switch"] - tr1 = tr.Transition( - from_state="on", to_state="off", - prob_check=pck.ProbCheck(sw_tr["on=>off"])) - tr2 = tr.Transition( - from_state="off", to_state="on", - prob_check=pck.ProbCheck(sw_tr["off=>on"])) - switch_mc = tr.MarkovChain([tr1, tr2]) - - # Host Transitions - hs_tr = transitions["host"] - tr1 = tr.Transition( - from_state="on", to_state="off", - prob_check=pck.ProbCheck(hs_tr["on=>off"])) - tr2 = tr.Transition( - from_state="off", to_state="on", - prob_check=pck.ProbCheck(hs_tr["off=>on"])) - host_mc = tr.MarkovChain([tr1, tr2]) - - # Web service Transitions - ws_tr = transitions["web_service"] - tr1 = tr.Transition( - from_state="run", to_state="stop", - prob_check=pck.NoProbCheck(), - deps_check=dck.EqCheck("off")) - tr2 = tr.Transition( - from_state="slow", to_state="stop", - prob_check=pck.NoProbCheck(), - deps_check=dck.EqCheck("off")) - tr3 = tr.Transition( - from_state="slow", to_state="run", - prob_check=pck.NoProbCheck(), - deps_check=dck.AndCheck( - dck.EqCheck("on"), - dck.DepCheck(dck.EqCheck("off")))) - tr4 = tr.Transition( - from_state="run", to_state="slow", - prob_check=pck.ProbCheck(ws_tr["run=>slow"]), - deps_check=dck.AndCheck( - dck.EqCheck("on"), - dck.DepCheck(dck.EqCheck("on")))) - tr5 = tr.Transition( - from_state="slow", to_state="run", - prob_check=pck.ProbCheck(ws_tr["slow=>run"]), - deps_check=dck.AndCheck( - dck.EqCheck("on"), - dck.DepCheck(dck.EqCheck("on")))) - tr6 = tr.Transition( - from_state="stop", to_state="run", - prob_check=pck.ProbCheck(ws_tr["stop=>run"]), - deps_check=dck.EqCheck("on")) - webs_mc = tr.MarkovChain([tr1, tr2, tr3, tr4, tr5, tr6]) - - # User support markov chain - sup_mc = tr.MarkovChain([]) - - return { - "switch": switch_mc, - "host": host_mc, - "web_service": webs_mc, - "support": sup_mc - } diff --git a/monasca_analytics/source/iptables_markov_chain.py b/monasca_analytics/source/iptables_markov_chain.py deleted file mode 100644 index 633e60a..0000000 --- a/monasca_analytics/source/iptables_markov_chain.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params - -from monasca_analytics.source.markov_chain import base -from monasca_analytics.source.markov_chain import events -from monasca_analytics.source.markov_chain import prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import monasca_analytics.source.markov_chain.transition as tr -from monasca_analytics.util import validation_utils as vu - -import six - - -logger = logging.getLogger(__name__) - -STATE_STOP = "stop" -STATE_NORMAL = "normal" -STATE_ATTACK = "ping_flood_attack" - -iptables = {"INPUT -i eth0 -p tcp --dport 22 -j ACCEPT": "ssh0", - "OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT": "ssh1", - "INPUT -s 1.2.3.4 -j DROP": "ip0", - "INPUT -s 5.6.7.8 -j DROP": "ip1", - "INPUT -s 1.2.1.2 -j DROP": "ip2", - "INPUT -s 6.5.4.3 -j DROP": "ip3", - "INPUT -i eth0 -p tcp --dport 80 -j ACCEPT": "http0", - "OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT": "http1", - "INPUT -p icmp --icmp-type echo-request -j ACCEPT": "ping0", - "OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT": "ping1", - "OUTPUT -p icmp --icmp-type echo-request -j ACCEPT": "ping2", - "INPUT -p icmp --icmp-type echo-reply -j ACCEPT": "ping3"} - - -iptable_types = ["ssh", "ip", "http", "ping"] - - -def get_iptable_type(identifier): - for ip_type in iptable_types: - if identifier.startswith(ip_type): - return ip_type - - -class IPTablesSource(base.MarkovChainSource): - """This source class implements an IPTable triggering emulator. - - It models a network system where iptables are triggered following - a specific probability depending on the state of the Markov chain. - """ - - @staticmethod - def validate_config(_config): - source_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "sleep": voluptuous.And( - float, - voluptuous.Range( - min=0, max=1, min_included=False, max_included=False)), - }, required=True) - return source_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": IPTablesSource.__name__, - "sleep": 0.01, - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('sleep', type_util.Number(), 0.01) - ] - - def get_feature_list(self): - return iptable_types - - def _create_system(self): - """Markov Chain of IPTables being triggered in each state. - - Implements the Markov Chain model corresponding to the IPTables that - are triggered depending on the state. - In order to create the model, we have to create the triggers - (events with some probability for each state), - and the Markov chain model (probabilities of state transitions). - """ - logger.debug("Creating IPTables System") - triggers = self._create_event_triggers() - logger.debug("Generated " + str(len(triggers)) + - " IPTables event triggers") - markov_chain = self._create_markov_chain_model() - logger.debug("Created Markov chain model for IPTables") - support_node = base.StateNode(STATE_STOP, - markov_chain, - triggers) - return [support_node] - - def _create_markov_chain_model(self): - """Defines the Markov chain transitions. - - The transition will happen with the probability defined by ProbCheck, - which will be evaluated each server_sleep_in_seconds time - (defined by config). The values are quite low because the time when - these are evaluated is the same as when the traffic is evaluated. - Over time, the probability accumulation is much higher, though. - """ - tr_stop_normal = tr.Transition( - from_state=STATE_STOP, to_state=STATE_NORMAL, - prob_check=pck.ProbCheck(0.8)) - tr_normal_stop = tr.Transition( - from_state=STATE_NORMAL, to_state=STATE_STOP, - prob_check=pck.ProbCheck(0.001)) - tr_normal_attack = tr.Transition( - from_state=STATE_NORMAL, to_state=STATE_ATTACK, - prob_check=pck.ProbCheck(0.0001)) - tr_attack_normal = tr.Transition( - from_state=STATE_ATTACK, to_state=STATE_NORMAL, - prob_check=pck.ProbCheck(0.2)) - return tr.MarkovChain([tr_stop_normal, - tr_normal_stop, - tr_normal_attack, - tr_attack_normal]) - - def _create_event_triggers(self): - """Defines the events that will be triggered in each state.""" - return self._create_normal_traffic_behaviour() +\ - self._create_ping_flood_traffic_behaviour() - - def _create_normal_traffic_behaviour(self): - """These are the triggers that will happen in the NORMAL state. - - The http traffic is predominant, but there is also some ping traffic, - and a little bit of ssh traffic - """ - tr = [] - for iptable, feature in six.iteritems(iptables): - if feature.startswith("ssh"): - tr.append(self._create_trigger(0.1, STATE_NORMAL, iptable)) - elif feature.startswith("http"): - tr.append(self._create_trigger(0.6, STATE_NORMAL, iptable)) - elif feature.startswith("ping"): - tr.append(self._create_trigger(0.2, STATE_NORMAL, iptable)) - return tr - - def _create_ping_flood_traffic_behaviour(self): - """These are the triggers that will happen in the ATTACK state. - - The ssh and http traffic is the same as in the normal state, - but the ping traffic is dramatically increased - """ - tr = [] - for iptable, feature in six.iteritems(iptables): - if feature.startswith("ssh"): - tr.append(self._create_trigger(0.1, STATE_ATTACK, iptable)) - elif feature.startswith("http"): - tr.append(self._create_trigger(0.6, STATE_ATTACK, iptable)) - elif feature.startswith("ping"): - tr.append(self._create_trigger(0.95, STATE_ATTACK, iptable)) - return tr - - def _create_trigger(self, prob, state, event_msg): - """Aux function to create an event trigger - - :param prob: float between 0 and 1 -- probability of the event - being triggered - :param state: str -- State where this event can be triggered - :param event_msg: str -- message that will be sent for this event - """ - return events.Trigger( - prob_check=pck.ProbCheck(prob), - node_check=dck.EqCheck(state), - event_builder=events.EventBuilder(event_msg)) diff --git a/monasca_analytics/source/kafka.py b/monasca_analytics/source/kafka.py deleted file mode 100644 index 61753fa..0000000 --- a/monasca_analytics/source/kafka.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from pyspark.streaming import kafka -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params - -from monasca_analytics.source import base -from monasca_analytics.util import validation_utils as vu - -import six - - -logger = logging.getLogger(__name__) - - -class KafkaSource(base.BaseSource): - """A Kafka source implementation that consumes data from a Kafka queue.""" - - @staticmethod - def validate_config(_config): - source_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "params": { - "zk_host": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "zk_port": int, - "group_id": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "topics": { - voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()): - voluptuous.And(int, voluptuous.Range(min=1)) - } - } - }, required=True) - return source_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": KafkaSource.__name__, - "params": { - "zk_host": "localhost", - "zk_port": 2181, - "group_id": "my_group_id", - "topics": { - "my_topic": 1 - } - } - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('zk_host', type_util.String(), - 'localhost'), - params.ParamDescriptor('zk_port', type_util.Number(), - 2181), - params.ParamDescriptor('group_id', type_util.String(), - 'my_group_id'), - params.ParamDescriptor('topics', - type_util.Object(strict_checking=False)) - ] - - def create_dstream(self, ssc): - """Dstream creation - - The _dstream object is created before this source is bound - to the consumers. It uses a KafkaUtils.createStream, to read data from - the Kafka queue that was defined in the configuration. - - :type ssc: pyspark.streaming.StreamingContext - :param ssc: Spark Streaming Context - """ - return kafka.KafkaUtils.createStream( - ssc, - "{0}:{1}".format( - self._config["params"]["zk_host"], - self._config["params"]["zk_port"]), - self._config["params"]["group_id"], - self._config["params"]["topics"]) - - def terminate_source(self): - pass - - def get_feature_list(self): - raise NotImplementedError("This method needs to be implemented") diff --git a/monasca_analytics/source/markov_chain/__init__.py b/monasca_analytics/source/markov_chain/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/source/markov_chain/base.py b/monasca_analytics/source/markov_chain/base.py deleted file mode 100644 index b47e80b..0000000 --- a/monasca_analytics/source/markov_chain/base.py +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import datetime -import itertools -import json -import logging -import six -from six.moves import socketserver -import threading -import time - -from monasca_analytics.source import base - -logger = logging.getLogger(__name__) - - -class MarkovChainSource(base.BaseSource): - """Base Source of data generated according a Markov chain model. - - A Markov chain model baked by a finite state machine - to model more realistic scenario with optional confounding variables. - This source is useful to see how causality is discovered in the presence - of confounding variable as well as scenario where some alert appears only - in a deterministic fashion. - """ - - @abc.abstractmethod - def _create_system(self): - """ - Abstract method that should be implemented by subclasses - - :rtype: list[StateNode] - :returns: List of StateNode that do not have any dependencies - """ - pass - - def create_dstream(self, ssc): - """Initiates the system in a TCP server, and creates the dstream object - - The _dstream object is created before this source is bound - to the consumers. It uses a socketTextStream, to read data from - the ThreadingTCPServer. - - :type ssc: pyspark.streaming.StreamingContext - :param ssc: Spark Streaming Context that provides the data input - """ - system = LeafNodes(self._create_system()) - port = self._start_thread(system) - return ssc.socketTextStream( - "localhost", - port) - - def terminate_source(self): - # This is to allow all the messages - # being sent by the handler to clear up. - self._server.terminate = True - self._server.shutdown() - self._server.server_close() - self._server_thread.join() - - def _start_thread(self, system): - self._server = socketserver.ThreadingTCPServer( - ("", 0), # Let the OS pick a port for us - FMSTCPHandler, # Handler of the requests - False) - self._server.allow_reuse_address = True - self._server.server_bind() - self._server.server_activate() - self._server.terminate = False - self._server.system = system - self._server.sleep_in_seconds = self._config["sleep"] - if "min_event_per_burst" in self._config: - self._server.min_event_per_burst = \ - int(self._config["min_event_per_burst"]) - else: - self._server.min_event_per_burst = 500 - - self._server_thread = threading.Thread(target=self._serve_forever) - self._server_thread.start() - port_used = self._server.socket.getsockname()[1] - return port_used - - def _serve_forever(self): - try: - self._server.serve_forever() - except IOError: - logger.debug("Markov chain source's server stopped.") - - -class MetaId(abc.ABCMeta): - - def __new__(mcs, name, bases, namespace): # @NoSelf - cls = super(abc.ABCMeta, mcs).__new__(mcs, name, bases, namespace) - cls.ids = itertools.count(1) - return cls - - -class LeafNodes(object): - - def __init__(self, state_nodes): - """Constructor with list of state nodes - - :type state_nodes: list[StateNode] - :param state_nodes: The node of the directed acyclic graph - that has no dependencies. - """ - self._state_nodes = state_nodes - - def next_state(self, hour_of_day): - """Move to next state - - :type hour_of_day: int - :param hour_of_day: An hour of the day that is used by - StateNode.next_state - """ - ignored_states = set([]) - for s in self._state_nodes: - s.next_state(hour_of_day, ignored_states) - - def collect_events(self, hour_of_day, fake_date, request): - """Get list of events - - :type hour_of_day: int - :param hour_of_day: An hour of the day that is used by - StateNode.collect_event - :type fake_date: datetime.datetime - :param fake_date: A date that you can use to generate a ctime. - :type request: RequestBuilder - :param request: Request object to send data. - :rtype: list - :returns: List of event. Specific to the event builder. - """ - for node in self._state_nodes: - node.collect_events(hour_of_day, fake_date, request) - - -@six.add_metaclass(MetaId) -class StateNode(object): - """This class describes a particular node in the dependency graph. - - It holds the state information relative to that node and the - dependencies with the other nodes. The Markov - It is managed by one instance of a StateDescriptor. - """ - - def __init__(self, initial_state, markov_chain, trigger, _id=None): - """Constructor - - :type _id: int | str - :param _id: Id of the node - :type initial_state: str | int | None - :param initial_state: Initial state for this node. - :type markov_chain: - monasca_analytics.source.markov_chain.transition.MarkovChain - :param markov_chain: Markov Chain managing this node state. - :type trigger: - list | monasca_analytics.source.markov_chain.events.Trigger - :param trigger: List of triggers or single trigger that you want - to attached to this node. - """ - if _id is None: - self._id = next(self.__class__.ids) - else: - self._id = _id - self.state = initial_state - self._markov_chain = markov_chain - if type(trigger) == list: - self._triggers = trigger - else: - self._triggers = [trigger] - self.dependencies = [] - - def id(self): - """ - :rtype: int | str - :returns: Returns this object id. - """ - return self._id - - def next_state(self, hour_of_day, ignored_states): - """Move this element to the next state if it is not in the ignored set - - This will affect this element's children that conditionally depends - on this element's state. - - :type hour_of_day: int - :param hour_of_day: An integer in the range of 0 to 24 to - express the hour of the day. - :type ignored_states: set - :param ignored_states: set of states that should not change. - """ - if self._id not in ignored_states: - ignored_states.add(self._id) - for dep in self.dependencies: - dep.next_state(hour_of_day, ignored_states) - self._markov_chain.apply_on(self, hour_of_day) - - def collect_events(self, hour_of_day, fake_date, request): - """Collect event triggered for the next burst. - - :type hour_of_day: int - :param hour_of_day: an integer in the range of 0 to 24 to express - he hour of the day. - :type fake_date: datetime.datetime - :param fake_date: A date that you can use to generate a ctime. - :type request: RequestBuilder - :param request: Request builder to send specific events - :rtype: list - :returns: events for this step or None - """ - for trigger in self._triggers: - trigger.apply_on(self, hour_of_day, fake_date, request) - for dep in self.dependencies: - dep.collect_events(hour_of_day, fake_date, request) - - -class FMSTCPHandler(socketserver.BaseRequestHandler): - """A TCP server handler for the alert generation.""" - - def handle(self): - """Handles incoming connection and pushing data into them.""" - - fake_date = datetime.datetime.today() - hour_of_day = fake_date.hour - while not self.server.terminate: - request = RequestBuilder(self.request) - - # Collect some events - while request.nb_events() < self.server.min_event_per_burst: - self.server.system.next_state(hour_of_day) - self.server.system.collect_events(hour_of_day, fake_date, - request) - hour_of_day += 1 - fake_date += datetime.timedelta(hours=1) - if hour_of_day > 24: - hour_of_day = 0 - - try: - request.finalize() - except IOError: - logger.debug("Source is now off") - self.server.terminate = True - - time.sleep(self.server.sleep_in_seconds) - - -class RequestBuilder(object): - - def __init__(self, request): - self._request = request - self._collected_data = [] - - def send(self, data): - """ - Send an object over the network. - :param data: Object to send. - """ - self._collected_data.append(data) - - def nb_events(self): - return len(self._collected_data) - - def finalize(self): - for data in self._collected_data: - self._request.send("{0}\n".format(json.dumps(data, - cls=DictEncoder))) - self._request = None - self._collected_data = None - - -class DictEncoder(json.JSONEncoder): - - def default(self, o): - return o.__dict__ diff --git a/monasca_analytics/source/markov_chain/events.py b/monasca_analytics/source/markov_chain/events.py deleted file mode 100644 index ba05400..0000000 --- a/monasca_analytics/source/markov_chain/events.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -class Trigger(object): - """A trigger generate events when a particular graph state is reached.""" - - def __init__(self, node_check, prob_check, event_builder): - """Create a new trigger. - - :type node_check: - (monasca_analytics.source.markov_chain.base.StateNode) -> bool - :param node_check: - Checker function that will return true if the node has an - appropriate type - :type prob_check: (int) -> bool - :param prob_check: - A bernoulli trial that randomly return true or false that - can use the parameter (hour of the day) to modify the - probability of success - - :type event_builder: - (monasca_analytics.source.markov_chain.base.StateNode, - datetime.datetime, - monasca_analytics.source.markov_chain.base.RequestBuilder) -> None - :param event_builder: Event builder that receive the node and use - the state to return an event. - """ - self._prob_check = prob_check - self._node_check = node_check - self._event_builder = event_builder - - def apply_on(self, node, hour_of_day, fake_date, request): - """Apply this trigger on the given node. - - :type node: monasca_analytics.source.markov_chain.base.StateNode - :param node: Node to test the trigger with. - :type hour_of_day: int - :param hour_of_day: An integer between [0, 24) representing - the hour of the day. - :type fake_date: datetime.datetime - :param fake_date: A date that you can use to generate a ctime. - :type request: - monasca_analytics.source.markov_chain.base.RequestBuilder - :param request: Request builder to send events - """ - if self._prob_check(hour_of_day) and self._node_check(node): - self._event_builder(node, fake_date, request) - - -class Event(object): - - def __init__(self, msg, ident): - """ - :type msg: str - :param msg: The event message. - :type ident: str - :param ident: The id of the node causing this event. - """ - self.id = ident - self.msg = msg - - -class EventBuilder(object): - - def __init__(self, msg): - """ - :type msg: str - :param msg: The event message. - """ - self._msg = msg - - def __call__(self, node, fake_date, request): - """ - :type node: monasca_analytics.source.markov_chain.base.StateNode - :param node: The node associated with the event. - :type fake_date: datetime.datetime - :param fake_date: A date that you can use to generate a ctime. - :type request: - monasca_analytics.source.markov_chain.base.RequestBuilder - """ - request.send({ - 'ctime': fake_date.ctime(), - 'event': Event(self._msg, str(node.id())) - }) diff --git a/monasca_analytics/source/markov_chain/prob_checks.py b/monasca_analytics/source/markov_chain/prob_checks.py deleted file mode 100644 index 33df9d7..0000000 --- a/monasca_analytics/source/markov_chain/prob_checks.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import random - -from monasca_analytics.util import math - - -class ProbCheck(object): - """Function object to randomly return True or False with probability - - This function object randomly returns true or false - with a chance of success that can optionally vary - given the hour of the day. - """ - - def __init__(self, prob): - """Create a ProbCheck, or change stat if the prob check is passed. - - :type prob: dict[int, float] | float - :param prob: a probability value or a dictionary where keys correspond - to the hour of the day and the value is the probability of - success associated with it. - """ - if isinstance(prob, dict): - self._prob = list(prob.items()) - else: - self._prob = prob - - def __call__(self, hour_of_day): - if isinstance(self._prob, list): - p = math.interpolate_1d(self._prob, hour_of_day) - else: - p = self._prob - return random.random() < p - - -class NoProbCheck(object): - """When you don't want to have any prob check performed.""" - - def __call__(self, *_): - return True diff --git a/monasca_analytics/source/markov_chain/state_check.py b/monasca_analytics/source/markov_chain/state_check.py deleted file mode 100644 index 3a25fbd..0000000 --- a/monasca_analytics/source/markov_chain/state_check.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -class DepCheck(object): - """Dependency checks.""" - - def __init__(self, dep_check): - self._dep_check = dep_check - - def __call__(self, node): - res = True - for dep in node.dependencies: - res = res and self._dep_check(dep) - return res and len(node.dependencies) > 0 - - -class AnyDepCheck(object): - """Dependency checks.""" - - def __init__(self, dep_check): - self._dep_check = dep_check - - def __call__(self, node): - for dep in node.dependencies: - if self._dep_check(dep): - return True - return False - - -class TrueCheck(object): - """This dep check always pass.""" - - def __call__(self, *_): - return True - - -class EqCheck(object): - """Check that the node has the appropriate state.""" - - def __init__(self, state): - self._state = state - - def __call__(self, node): - return node.state == self._state - - -class NeqCheck(object): - """Check that the node has the appropriate state.""" - - def __init__(self, state): - self._state = state - - def __call__(self, node): - return node.state != self._state - - -class OrCheck(object): - """Combine two check in an or expression.""" - - def __init__(self, c1, c2, c3=None): - self._c1 = c1 - self._c2 = c2 - self._c3 = c3 - - def __call__(self, node): - if self._c3 is None: - return self._c1(node) or self._c2(node) - else: - return self._c1(node) or self._c2(node) or self._c3(node) - - -class AndCheck(object): - """Combine two check in an or expression.""" - - def __init__(self, c1, c2): - self._c1 = c1 - self._c2 = c2 - - def __call__(self, node): - return self._c1(node) and self._c2(node) diff --git a/monasca_analytics/source/markov_chain/transition.py b/monasca_analytics/source/markov_chain/transition.py deleted file mode 100644 index 901f3ef..0000000 --- a/monasca_analytics/source/markov_chain/transition.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.source.markov_chain import state_check as sc - - -class MarkovChain(object): - """Possible transitions for each state. - - This class describes the possible transitions for - a particular type of state. - It can use the dependencies of the node as it want. - """ - - def __init__(self, transitions): - self._transitions = dict() - for tr in transitions: - from_state = tr.from_state() - if from_state in self._transitions: - self._transitions[from_state].append(tr) - else: - self._transitions[from_state] = [tr] - - def apply_on(self, node, hour_of_day): - """Performs a state transition for the given node. - - :type node: monasca_analytics.source.markov_chain.base.StateNode - :param node: the state of this node will be changed - :type hour_of_day: int - :param hour_of_day: the hour of the day (used by probability checks) - :rtype: bool - :returns: True if there exists in the model at least one transition - from the node current state. - """ - if node.state not in self._transitions: - return False - for tr in self._transitions[node.state]: - if tr(node, hour_of_day): - break - return True - - -class Transition(object): - """Holds requirement for a transition - - This function object holds the requirement for effectively - performing a transition on a node. It assumes to be used - only by the MarkovChain class who make sure that the node - has the proper state before applying the transition. - """ - - def __init__(self, from_state, to_state, prob_check, deps_check=None): - """Create a new Transition instance. - - :param from_state: precondition for the node. It must be in this - state in order to have a chance to be promoted into `to_state` - :param to_state: next state if the condition is met. - :param prob_check: the markov condition. - :param deps_check: deterministic check performed on dependencies. - """ - self._from_state = from_state - self._to_state = to_state - if deps_check is not None: - self._deps_check = sc.DepCheck(deps_check) - else: - self._deps_check = sc.TrueCheck() - self._prob_check = prob_check - - def __call__(self, node, hour_of_day): - if self._prob_check(hour_of_day) and\ - self._deps_check(node) and\ - self._from_state == node.state: - node.state = self._to_state - return True - return False - - def from_state(self): - return self._from_state diff --git a/monasca_analytics/source/monasca_markov_chain.py b/monasca_analytics/source/monasca_markov_chain.py deleted file mode 100644 index e88302b..0000000 --- a/monasca_analytics/source/monasca_markov_chain.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import random -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -import six - -import monasca_analytics.source.markov_chain.base as base -import monasca_analytics.source.markov_chain.events as ev -import monasca_analytics.source.markov_chain.prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import monasca_analytics.source.markov_chain.transition as tr -import monasca_analytics.util.timestamp as tp -from monasca_analytics.util import validation_utils as vu - - -logger = logging.getLogger(__name__) - - -class MonascaMarkovChainSource(base.MarkovChainSource): - - @staticmethod - def validate_config(_config): - markov_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "sleep": voluptuous.And( - float, voluptuous.Range( - min=0, max=1, min_included=False, max_included=False)), - }, required=True) - return markov_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": MonascaMarkovChainSource.__name__, - "sleep": 0.01, - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('sleep', type_util.Number(), 0.01) - ] - - def get_feature_list(self): - return ["vm1", "vm2", "host1", "host2"] - - def _create_system(self): - mc = tr.MarkovChain([]) - vm_triggers = [ - ev.Trigger( - event_builder=MonascaFakeMetricBuilder("vm.mem.used_mb"), - node_check=dck.TrueCheck(), - prob_check=pck.NoProbCheck() - ), - ev.Trigger( - event_builder=MonascaFakeMetricBuilder("cpu.idle_perc"), - node_check=dck.TrueCheck(), - prob_check=pck.NoProbCheck() - ), - ev.Trigger( - event_builder=MonascaFakeMetricBuilder( - "cpu.total_logical_cores"), - node_check=dck.TrueCheck(), - prob_check=pck.NoProbCheck() - ) - ] - host_trigger = ev.Trigger( - event_builder=MonascaFakeMetricBuilder("mem.total_mb"), - node_check=dck.TrueCheck(), - prob_check=pck.NoProbCheck() - ) - - return [ - # vm.mem.used_mb - base.StateNode(3, mc, vm_triggers[0], _id="vm1"), - base.StateNode(1, mc, vm_triggers[0], _id="vm2"), - # cpu.idle_perc - base.StateNode(0.75, mc, vm_triggers[1], _id="vm1"), - base.StateNode(0.75, mc, vm_triggers[1], _id="vm2"), - # cpu.total_logical_cores - base.StateNode(3, mc, vm_triggers[2], _id="vm1"), - base.StateNode(2, mc, vm_triggers[2], _id="vm2"), - # mem.total_mb - base.StateNode(5, mc, host_trigger, _id="host1"), - base.StateNode(6, mc, host_trigger, _id="host2"), - ] - - -class MonascaFakeMetricBuilder(object): - - def __init__(self, metric_name): - """ - :type metric_name: str - :param metric_name: The name of the metric - """ - self.metric_name = metric_name - - def __call__(self, node, fake_date, request): - """ - :type node: monasca_analytics.source.markov_chain.base.StateNode - :param node: The node associated with the event. - :type fake_date: datetime.datetime - :param fake_date: A date that you can use to generate a ctime. - :type request: - monasca_analytics.source.markov_chain.base.RequestBuilder - """ - half_hour = 60 * 60 / 2 - request.send({ - "metric": { - "name": self.metric_name, - "dimensions": { - "service": "monitoring", - "hostname": node.id() - }, - "timestamp": tp.timestamp(fake_date) + - random.randint(- half_hour, half_hour), - "value": node.state - }, - "meta": { - "tenantId": 0, - "region": "earth" - }, - "creation_time": 0 - }) diff --git a/monasca_analytics/source/randoms.py b/monasca_analytics/source/randoms.py deleted file mode 100644 index 882cc49..0000000 --- a/monasca_analytics/source/randoms.py +++ /dev/null @@ -1,403 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import json -import logging -import numpy as np -import random -import six -from six.moves import socketserver -import threading as th -import time -import uuid -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params - -import monasca_analytics.exception.monanas as err -from monasca_analytics.source import base -from monasca_analytics.util import validation_utils as vu - -logger = logging.getLogger(__name__) - - -class RandomSource(base.BaseSource): - """A randomly generated data source implementation.""" - - def __init__(self, _id, _config): - super(RandomSource, self).__init__(_id, _config) - try: - self._configure_server() - except IOError: - raise err.MonanasInitError("Address already in use.") - except AttributeError: - raise err.MonanasInitError("Invalid generate or validate method.") - - def _configure_server(self): - """Creates and configures the Server object - - The server object is configured according to - the configuration of this source module - """ - self._server = socketserver.ThreadingTCPServer( - (self._config["params"]["host"], - self._config["params"]["port"]), - MonanasTCPHandler, False) - self._server.generate = getattr( - self, "_generate_" + - self._config["params"]["model"]["name"]) - # self._server.validate = getattr( - # source_model, self._config["validate"]) - self._server.allow_reuse_address = True - self._server.server_bind() - self._server.server_activate() - self._server.terminate = False - self._server.generate_alerts_per_second =\ - self._config["params"]["alerts_per_burst"] - self._server.generate_idle_time_between_bursts =\ - self._config["params"]["idle_time_between_bursts"] - self._server_thread = th.Thread(target=self._server.serve_forever) - self._is_server_running = False - - @staticmethod - def validate_config(_config): - source_schema = voluptuous.Schema({ - "module": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "params": { - "host": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "port": int, - "model": { - "name": voluptuous.And(six.string_types[0], - vu.NoSpaceCharacter()), - "params": { - "origin_types": voluptuous.And([ - { - "origin_type": voluptuous.And( - six.string_types[0], - vu.NoSpaceCharacter()), - "weight": voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range( - min=0, min_included=False)), - } - ], vu.NotEmptyArray()), - voluptuous.Optional("key_causes"): dict - } - }, - "alerts_per_burst": voluptuous.And( - int, voluptuous.Range(min=1)), - "idle_time_between_bursts": voluptuous.And( - voluptuous.Or(int, float), - voluptuous.Range(min=0, min_included=False)) - } - }, required=True) - return source_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": RandomSource.__name__, - "params": { - "host": "localhost", - "port": 1010, - "model": { - "name": "my_model_name", - "params": { - "origin_types": [ - { - "origin_type": "my_origin_type", - "weight": 1.0 - } - ], - } - }, - "alerts_per_burst": 1, - "idle_time_between_bursts": 1.0 - } - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('host', type_util.String(), 'localhost'), - params.ParamDescriptor('port', type_util.Number(), 1010), - params.ParamDescriptor('model', type_util.Object({ - 'name': type_util.String(), - 'params': type_util.Object({ - 'origin_types': type_util.Object(strict_checking=False) - }) - })), - params.ParamDescriptor('alert_per_burst', type_util.Number(), 1), - params.ParamDescriptor('idle_time_between_bursts', - type_util.Number(), 1.0), - ] - - def _start_server(self): - if not self._is_server_running: - self._server_thread.start() - self._is_server_running = True - - def create_dstream(self, ssc): - """Dstream object creation - - The _dstream object is created before this source is bound - to the consumers. It uses a socketTextStream, to read data from - the ThreadingTCPServer. - - :type ssc: pyspark.streaming.StreamingContext - :param ssc: Spark Streaming Context - """ - self._start_server() - self._dstream = ssc.socketTextStream( - self._config["params"]["host"], - self._config["params"]["port"]) - - def get_feature_list(self): - raise NotImplementedError("This method needs to be implemented") - - def terminate_source(self): - """Terminates the source with a delay - - Terminates the source with a delay to allow the messages - being sent by the handler to clear up. - """ - self._server.terminate = True - time.sleep(1) - self._server.server_close() - self._server_thread = None - - def _generate_simple_model(self): - """Generates an alert based on simple_model.""" - current_time = int(round(time.time() * 1000)) - return { - "created": current_time, - "id": str(uuid.uuid4()), - "origin": str(uuid.uuid4()), - "origin_type": self._random_origin_type(), - "data": {}, - "state": "", - "updated": current_time - } - - def _random_origin_type(self): - """Randomizes the origin_type""" - origin_types = self._config[ - "params"]["model"]["params"]["origin_types"] - return origin_types[self._weighted_choice( - [o["weight"] for o in origin_types])]["origin_type"] - - def _weighted_choice(self, weights): - """Gets an index chosen randomly but weighted from a list of weights""" - totals = [] - running_total = 0 - - for w in weights: - running_total += w - totals.append(running_total) - - rnd = random.random() * running_total - - for i, total in enumerate(totals): - if rnd < total: - return i - - -@six.add_metaclass(abc.ABCMeta) -class BaseDataSourceGenerator(object): - """An interface for random data source generators.""" - - @abc.abstractmethod - def __init__(self, _config): - """BaseDataSourceGenerator constructor. - - :type _config: dict - :param _config: Configuration of this source - """ - self._config = _config - self.generate = getattr(self, "generate_" + - self._config["params"]["model"]["name"]) - - @abc.abstractmethod - def is_burst_over(self): - """Should return true when all the burst alerts have been generated""" - pass - - def generate_simple_model(self): - """Generate alert event that are shaped according to the simple model - """ - current_time = time.time() - return { - "created": current_time, - "id": str(uuid.uuid4()), - "origin": str(uuid.uuid4()), - "origin_type": self._pick_next_type(), - "data": {}, - "state": "", - "updated": current_time - } - - @abc.abstractmethod - def _pick_next_type(self): - """Should return the next type for the simple model generation""" - pass - - -class LinearlyDependentDataSourceGenerator(BaseDataSourceGenerator): - """A data source generator where alerts are linearly dependent - - :raises: exception -- if the causal matrix is cyclic - """ - - def __init__(self, config): - BaseDataSourceGenerator.__init__(self, config) - - # Acyclic causality model - config_key_causes = self._config[ - "params"]["model"]["params"]["key_causes"] - - # Create the causal matrix (/graph) - self._features_names = config_key_causes.keys() - n = len(self._features_names) - self._causal_matrix = np.zeros((n, n), dtype=np.float32) - for i in range(n): - for j in range(n): - row = self._features_names[i] - col = self._features_names[j] - if col in config_key_causes[row]: - self._causal_matrix[i, j] = 1 - - # Triangulate the causal matrix - tmp_matrix = np.copy(self._causal_matrix) - n_t = tmp_matrix.shape[0] - while n_t != 1: - for i in range(n_t): - if np.all(tmp_matrix[i, :] == np.zeros(n_t)): - tmp_matrix[[i, 0], :] = tmp_matrix[[0, i], :] - tmp_matrix[:, [i, 0]] = tmp_matrix[:, [0, i]] - k = n - n_t - r = i + k - self._causal_matrix[ - [r, k], :] = self._causal_matrix[[k, r], :] - self._causal_matrix[ - :, [r, k]] = self._causal_matrix[:, [k, r]] - self._features_names[r], self._features_names[ - k] = self._features_names[k], self._features_names[r] - tmp_matrix = tmp_matrix[1:, 1:] - break - if i == n_t - 1: - raise err.MonanasCyclicRandomSourceError - n_t = tmp_matrix.shape[0] - - # Prepare a zero buffer that store the random values generated - # following the causal model - self._features_random_value = np.zeros(len(self._features_names)) - - # This stack will contains the generated values for one burst (if that - # make some sense) - self._features_stack_emitted = [] - logger.debug( - "Causality Matrix (RandomSource): {0}".format( - self._causal_matrix)) - - def is_burst_over(self): - return len(self._features_stack_emitted) == 0 - - def _pick_next_type(self): - while len(self._features_stack_emitted) == 0: - # Generate more features that follows the dag defined by the causal - # matrix - n = len(self._features_names) - self._features_random_value = np.random.laplace(size=n) - for i in range(n): - self._features_random_value[ - i] += np.dot(self._causal_matrix, - self._features_random_value)[i] - - self._features_random_value = np.floor(self._features_random_value) - for i in range(n): - nb = np.abs(int(self._features_random_value[i])) - if nb > 0: - feature = self._features_names[i] - self._features_stack_emitted.extend( - [feature for _ in range(nb)]) - return self._features_stack_emitted.pop() - - -class UncorrelatedDataSourceGenerator(BaseDataSourceGenerator): - """A data source generator where alert item are not correlated. - - Each item has a unique probability to be generated. - """ - - def __init__(self, config): - BaseDataSourceGenerator.__init__(self, config) - self.accumulated_alerts = 0 - self._config = config - - def is_burst_over(self): - is_over = self.accumulated_alerts == self._config[ - "params"]["alerts_per_burst"] - if is_over: - self.accumulated_alerts = 0 - return is_over - - def _pick_next_type(self): - self.accumulated_alerts += 1 - origin_types = self._config[ - "params"]["model"]["params"]["origin_types"] - origin_type = UncorrelatedDataSourceGenerator._weighted_choice( - [o["weight"] for o in origin_types]) - return origin_types[origin_type]["origin_type"] - - @staticmethod - def _weighted_choice(weights): - """Gets an index chosen randomly but weighted from a list of weights""" - totals = [] - running_total = 0 - - for w in weights: - running_total += w - totals.append(running_total) - - rnd = random.random() * running_total - - for i, total in enumerate(totals): - if rnd < total: - return i - - -class MonanasTCPHandler(socketserver.BaseRequestHandler): - """A TCP server handler for the alert generation.""" - - def handle(self): - """Handles the incoming messages.""" - accumulated_alerts = 0 - - while True and not self.server.terminate: - alert = self.server.generate() - - try: - validated_alert = self.server.validate(alert) - self.request.send(json.dumps(validated_alert) + "\n") - accumulated_alerts += 1 - except voluptuous.Invalid: - logger.warn("Invalid schema for generated alerts.") - - time.sleep(self.server.generate_idle_time_between_bursts) diff --git a/monasca_analytics/spark/__init__.py b/monasca_analytics/spark/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/spark/aggregator.py b/monasca_analytics/spark/aggregator.py deleted file mode 100644 index 143baeb..0000000 --- a/monasca_analytics/spark/aggregator.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import logging -import six - -import numpy as np - -logger = logging.getLogger(__name__) - - -@six.add_metaclass(abc.ABCMeta) -class Aggregator(object): - """Aggregator that accumulates data and sends it to SMLs""" - - def __init__(self, driver): - """BaseAggregator constructor. - - :type driver: monasca_analytics.spark.driver.DriverExecutor - :param driver: The driver that manages spark - """ - self._combined_stream = None - self._smls = [] - self._samples = None - self._driver = driver - - def append_sml(self, l): - """The given sml will now be owned and receive the accumulated data - - :type l: monasca_analytics.sml.base.BaseSML - :param l: The sml to connect to. - """ - self._smls.append(l) - - def accumulate_dstream_samples(self, stream): - """Accumulate the samples coming from a stream - - The first time this function is called it sets the _combined_stream - to be the _stream parameter, and the _output_stream to be the - transformed version (according to the logic implemented by children - of this class) of the _combined_stream. - The consecutive times, it joins the _stream to the aggregated stream, - so at runtime _combined_stream is a funnel of all streams passed - to this function. - - :type stream: pyspark.streaming.DStream - :param stream: stream to be collected - """ - if self._combined_stream is None: - self._combined_stream = stream - else: - self._combined_stream = self._combined_stream.union(stream) - - def prepare_final_accumulate_stream_step(self): - """Accumulate each sample into an ndarray. - - This can only be called once accumulate_dstream_samples has been - called on every stream that need to be accumulated together. - """ - if self._combined_stream is not None: - self._combined_stream.foreachRDD( - lambda _, rdd: self._processRDD(rdd)) - - def _processRDD(self, rdd): - """Process the RDD - - :type rdd: pyspark.RDD - :param rdd: A Spark Resilient Distributed Dataset - """ - if len(self._smls) > 0: - rdd_entries = rdd.collect() - for rdd_entry in rdd_entries: - if self._samples is not None: - self._samples = np.vstack([self._samples, rdd_entry]) - else: - self._samples = rdd_entry - self._check_smls() - else: - self._samples = None - - def _check_smls(self): - """Detect if a SML is ready to learn from the set. - - If it is, for simplicity we remove it from the list of SMLs. - """ - if self._samples is None: - return - - def has_learn(sml, samples): - nb_samples = samples.shape[0] - tst = sml.number_of_samples_required() <= nb_samples - if tst: - sml.learn(samples) - return not tst - - logger.debug(self._samples.shape) - self._smls[:] = [l for l in self._smls if has_learn(l, self._samples)] - if len(self._smls) == 0: - self._driver.move_to_phase2() diff --git a/monasca_analytics/spark/driver.py b/monasca_analytics/spark/driver.py deleted file mode 100644 index e55a6dd..0000000 --- a/monasca_analytics/spark/driver.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import pyspark - -import monasca_analytics.config.config as config -import monasca_analytics.ingestor.base as bi -import monasca_analytics.ldp.base as mldp -import monasca_analytics.sink.base as msink -import monasca_analytics.sml.base as bml -import monasca_analytics.spark.aggregator as agg -import monasca_analytics.spark.streaming_context as streamingctx -import monasca_analytics.voter.base as mvoter - -logger = logging.getLogger(__name__) - - -class DriverExecutor(object): - """Driver part of the job submitted to spark. - - This is where we control what is submitted to workers, - what is driver specific and how the pipeline is constructed. - We also execute the pipeline from here. - """ - - def __init__(self, _config): - self._links = None - self._sources = None - self._orchestrator = None - self.set_links(config.instantiate_components(_config)) - - def restart_spark(): - self._ssc = streamingctx.create_streaming_context( - self._sc, - _config) - - self._restart_spark = restart_spark - self._sc = pyspark.SparkContext( - appName=_config["spark_config"]["appName"]) - self._ssc = streamingctx.create_streaming_context(self._sc, _config) - - def set_links(self, links): - """Set new set of links - - This function has no effect on the current pipeline. - In order to use them, you need to restart the pipeline. - """ - self._links = links - logger.debug("Collect sources...") - self._sources = config.collect_sources(self._links) - logger.debug("New list of sources: {}".format(self._sources)) - self._orchestrator = agg.Aggregator(self) - logger.debug("Propagating feature list...") - self._propagate_feature_list() - - def start_pipeline(self): - """Start the pipeline""" - - # Start by connecting the source - if self._phase1_required(): - logger.info("Phase 1 required, ldp won't produce data until" - " smls have finished.") - # Connect sources to ingestors - self._prepare_phase(self._connect_dependents_phase1) - - # Preparation step for the orchestrator: - # Accumulate everything from the sources - self._orchestrator.prepare_final_accumulate_stream_step() - - # Then prepare the orchestrator - self._prepare_orchestrator() - - else: - # Connect sources to ldps - logger.info("Phase 1 was not required, skipping it.") - self._prepare_phase(self._connect_dependents_phase2) - - logger.info("Start the streaming context") - self._ssc.start() - - def stop_pipeline(self): - logger.debug("Stop spark context.") - self._ssc.stop(False, False) - logger.debug("Terminate sources.") - self._terminate_sources() - logger.debug("Restart spark context.") - self._restart_spark() - - def move_to_phase2(self): - if self._ssc is not None: - logger.debug("Phase 2: Stop SparkStreamingContext.") - self._ssc.stop(False, False) - logger.debug("Phase 2: Stop sources") - self._terminate_sources() - logger.debug("Phase 2: Restart streaming...") - self._restart_spark() - logger.debug("Phase 2: Create new connections") - self._prepare_phase(self._connect_dependents_phase2) - self._ssc.start() - # ? - self._ssc.awaitTermination() - - def _terminate_sources(self): - """Terminates the sources.""" - for source in self._sources: - source.terminate_source() - - def _phase1_required(self): - for src in self._sources: - if any(isinstance(el, bi.BaseIngestor) for el in self._links[src]): - return True - - return False - - def _prepare_orchestrator(self): - """ - This is a part of phase 1. The orchestrator collects - input from all ingestors and then orchestrate the sml - pipeline to solve it and provide to LDPs the learned - data structure. - """ - smls = filter(lambda c: isinstance(c, bml.BaseSML), - self._links.keys()) - sml_with_no_dependents = filter( - lambda c: set(self._links[c]).isdisjoint(smls), - smls) - for sml in sml_with_no_dependents: - logger.debug("Append {} to orchestrator".format(sml)) - self._orchestrator.append_sml(sml) - self._connect_sml_dependents(sml) - - def _prepare_phase(self, connect_dependent): - """Prepare given phase by starting sources. - - :type connect_dependent: (pyspark.streaming.DStream, - monasca_analytics.source.base.BaseSource) -> None - :param connect_dependent: Callback that is going to selectively connect - the appropriate dependencies of each sources. - """ - for src in self._sources: - logger.debug("Prepare source {}".format(src)) - dstream = src.create_dstream(self._ssc) - connect_dependent(dstream, src) - - def _connect_sml_dependents(self, from_component): - """Connect an sml component with all its dependencies. - - During phase 1 this code is running exclusively by the driver - at the moment. - - :type from_component: bml.BaseSML | mvoter.BaseVoter - :param from_component: Where we came from. - """ - for connected_node in self._links[from_component]: - - # SML can, for now, only be connected to voter. - if isinstance(connected_node, mvoter.BaseVoter) and \ - isinstance(from_component, bml.BaseSML): - logger.debug("Set {} to {}" - .format(connected_node, from_component)) - from_component.set_voter(connected_node) - - # Voter can only be connected to LDPs - if isinstance(from_component, mvoter.BaseVoter) and \ - isinstance(connected_node, mldp.BaseLDP): - logger.debug("Append {} to {}" - .format(connected_node, from_component)) - from_component.append_ldp(connected_node) - # We don't connect LDP to anything - continue - - # Only SML can be connected to a sink - if isinstance(connected_node, msink.BaseSink): - logger.debug("Sink {} into {}" - .format(from_component, connected_node)) - connected_node.sink_ml(from_component) - # Sink can't be connected to anything - continue - - self._connect_sml_dependents(connected_node) - - def _connect_dependents_phase2(self, dstream, from_component): - """Connect a component to its dependencies. - - During phase 2, only live data processors are considered. - All ingestors are shutdown. - - :type dstream: pyspark.streaming.DStream | None - :param dstream: Dstream that will be modified by dependent. - It can be None, only if from_component is aggregator, - sml or voter. - :type from_component: monasca_analytics.component.base.BaseComponent - :param from_component: Where we came from. - """ - for connected_node in self._links[from_component]: - # Live data processors are also doing a map, they add - # the causality bit to each element in the stream. - if isinstance(connected_node, mldp.BaseLDP): - logger.debug("Connecting {} to {}".format(from_component, - connected_node)) - new_dstream = connected_node.map_dstream(dstream) - self._connect_dependents_phase2(new_dstream, connected_node) - - # Sink are at the end of the branch! - if isinstance(connected_node, msink.BaseSink): - logger.debug("Sink {} into {}".format(from_component, - connected_node)) - connected_node.sink_dstream(dstream) - - def _connect_dependents_phase1(self, dstream, from_component): - """Connect a component to its dependencies for phase 1. - - All live data processors are ignored during that phase. - - :type dstream: pyspark.streaming.DStream | None - :param dstream: Dstream that will be modified by dependent. - It can be None, only if from_component is aggregator, - sml or voter. - :type from_component: monasca_analytics.component.base.BaseComponent -- - :param from_component: Where we came from. - """ - for connected_node in self._links[from_component]: - - # Ingestors "map" the dstream. They are mainly doing worker - # specific transformation. Like parsing and vectorizing the - # data. - if isinstance(connected_node, bi.BaseIngestor): - logger.debug("Stream from {} to {}" - .format(from_component, connected_node)) - new_dstream = connected_node.map_dstream(dstream) - - # We then connect directly this stream to the orchestrator - self._orchestrator.accumulate_dstream_samples(new_dstream) - # And we look for sink if any - self._connect_dependents_phase1(new_dstream, connected_node) - - # Sink are at the end of the branch! - if isinstance(connected_node, msink.BaseSink): - logger.debug("Sink {} into {}" - .format(from_component, connected_node)) - connected_node.sink_dstream(dstream) - - def _propagate_feature_list(self): - """Set the appropriate features list on each live data processor.""" - for source in self._sources: - features = source.get_feature_list() - for connected_node in self._links[source]: - propagated = False - if isinstance(connected_node, bi.BaseIngestor): - connected_node.set_feature_list(features) - propagated = True - if isinstance(connected_node, mldp.BaseLDP): - connected_node.set_feature_list(features) - propagated = True - if propagated: - logger.info("Feature list {} propagated from {} to {}" - .format(features, source, connected_node)) diff --git a/monasca_analytics/spark/streaming_context.py b/monasca_analytics/spark/streaming_context.py deleted file mode 100644 index 91b8d60..0000000 --- a/monasca_analytics/spark/streaming_context.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import os.path as os_path -import pyspark.sql as sql -import pyspark.streaming as streaming - -logger = logging.getLogger(__name__) - - -class DriverStreamingListener(streaming.StreamingListener): - - @staticmethod - def onBatchCompleted(batchCompleted): - logger.debug("Batch Completed: \n\t{}\n".format( - batchCompleted)) - - @staticmethod - def onBatchStarted(batchStarted): - logger.debug("Batch Started: \n\t{}\n".format( - batchStarted)) - - @staticmethod - def onBatchSubmitted(batchSubmitted): - logger.debug("Batch submitted: \n\t{}\n".format( - batchSubmitted)) - - @staticmethod - def onOutputOperationCompleted(outputOperationCompleted): - logger.debug("Job of batch has completed: \n\t{}\n".format( - outputOperationCompleted)) - - @staticmethod - def onOutputOperationStarted(outputOperationStarted): - logger.debug("Job of a batch has started: \n\t{}\n".format( - outputOperationStarted)) - - @staticmethod - def onReceiverError(receiverError): - logger.warn("Receiver has reported an error: \n\t{}\n".format( - receiverError)) - - @staticmethod - def onReceiverStarted(receiverStarted): - logger.debug("Receiver has been started: \n\t{}\n".format( - receiverStarted)) - - @staticmethod - def onReceiverStopped(receiverStopped): - logger.debug("Receiver has stopped: \n\t{}\n".format( - receiverStopped)) - - @staticmethod - def onStreamingStarted(streamingStarted): - logger.debug("Streaming has been started: \n\t{}\n".format( - streamingStarted)) - - -def create_streaming_context(spark_context, config): - """ - Create a streaming context with a custom Streaming Listener - that will log every event. - :param spark_context: Spark context - :type spark_context: pyspark.SparkContext - :param config: dict - :return: Returns a new streaming context from the given context. - :rtype: pyspark.streaming.StreamingContext - """ - ssc = streaming.StreamingContext(spark_context, config[ - "spark_config"]["streaming"]["batch_interval"]) - ssc.addStreamingListener(DriverStreamingListener) - directory = os_path.expanduser("~/checkpointing") - logger.info("Checkpointing to `{}`".format(directory)) - # Commented out to fix a crash occurring when - # phase 1 is used. The reason of the crash is still unclear - # but Spark complains about the SSC being transferred - # to workers. - # ssc.checkpoint(directory) - return ssc - - -def get_sqlcontext_instance(spark_context): - """ - :type spark_context: pyspark.SparkContext - :param spark_context: The currently active Spark Context - :return: Returns the SQLContext - :rtype: sql.SQLContext - """ - if 'sqlContextSingletonInstance' not in globals(): - globals()['sqlContextSingletonInstance'] = sql.SQLContext( - spark_context) - return globals()['sqlContextSingletonInstance'] diff --git a/monasca_analytics/util/__init__.py b/monasca_analytics/util/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/util/common_util.py b/monasca_analytics/util/common_util.py deleted file mode 100644 index ef34e05..0000000 --- a/monasca_analytics/util/common_util.py +++ /dev/null @@ -1,290 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Common util functions.""" - -import importlib -import inspect -import json -import logging -from logging import config as log_conf -import os -import pkgutil - -from monasca_analytics.config import const -from monasca_analytics.exception import monanas as err -from monasca_analytics import ingestor -from monasca_analytics import ldp -from monasca_analytics import sink -from monasca_analytics import sml -from monasca_analytics import source -from monasca_analytics import voter - -logger = logging.getLogger(__name__) - - -def parse_json_file(filename): - """Parses json and return a dict. - - :type filename: str - :param filename: Filename to be parsed to a dictionary. - :rtype: dict - :returns: Parsed data. - :raises: IOError --If the file does not exist. - :raises: ValueError -- If the file is an invalid json file. - """ - try: - with open(filename, "rt") as f: - return json.load(f) - except (IOError, ValueError) as e: - logger.error("Exception parsing json file : " + str(e)) - raise - - -def setup_logging(filename): - """Setup logging based on a json string. - - :type filename: str - :param filename: Log configuration file. - :raises: IOError -- If the file does not exist. - :raises: ValueError -- If the file is an invalid json file. - """ - try: - config = parse_json_file(filename) - log_conf.dictConfig(config) - logpy4j = logging.getLogger("py4j") - logpy4j.setLevel(logging.ERROR) - logkafka = logging.getLogger("kafka") - logkafka.setLevel(logging.ERROR) - except (IOError, ValueError): - raise - - -def get_available_inherited_classes(pkg, base_class): - """Gets all inherited classes in modules for a given package - - This does not include subpackages. - - :type pkg: str - :param pkg: a package name. - :type base_class: object - :param base_class: a base class. - :rtype: list - :returns: a list of inherited classes. - """ - available_classes = [] - pkg_path = os.path.dirname(pkg.__file__) - - for _, mod_name, _ in pkgutil.iter_modules([pkg_path]): - if not mod_name.startswith("_"): - try: - module = importlib.import_module("{0}.{1}".format(pkg.__name__, - mod_name)) - - for clazz in inspect.getmembers(module, inspect.isclass): - if clazz is not base_class: - if issubclass(clazz[1], base_class) and\ - not inspect.isabstract(clazz[1]) and\ - clazz[1] != base_class: - available_classes.append(clazz[1]) - except Exception as e: - logger.warn(e.__str__()) - - return set(available_classes) - - -def get_available_classes(class_type=None): - """Creates a dictionary containing pipeline available classes of each type - - :type class_type: str | None - :param class_type: if provided, only this type of classes - will be returned - :rtype: dict - :returns: all subclasses keyed by type - """ - _classes = {} - - if not class_type or class_type == const.SOURCES: - from monasca_analytics.source.base import BaseSource - _classes[const.SOURCES] = get_available_inherited_classes(source, - BaseSource) - if not class_type or class_type == const.INGESTORS: - from monasca_analytics.ingestor.base import BaseIngestor - _classes[const.INGESTORS] = \ - get_available_inherited_classes(ingestor, BaseIngestor) - - if not class_type or class_type == const.SMLS: - from monasca_analytics.sml.base import BaseSML - _classes[const.SMLS] = get_available_inherited_classes(sml, BaseSML) - - if not class_type or class_type == const.VOTERS: - from monasca_analytics.voter.base import BaseVoter - _classes[const.VOTERS] = get_available_inherited_classes(voter, - BaseVoter) - if not class_type or class_type == const.SINKS: - from monasca_analytics.sink.base import BaseSink - _classes[const.SINKS] = get_available_inherited_classes(sink, BaseSink) - - if not class_type or class_type == const.LDPS: - from monasca_analytics.ldp.base import BaseLDP - _classes[const.LDPS] = \ - get_available_inherited_classes(ldp, BaseLDP) - - return _classes - - -def get_component_type(class_name): - for cls_type in const.components_types: - names = get_available_class_names(cls_type) - if class_name in names: - return cls_type - - -def get_class_by_name(class_name, class_type=None): - """Gets the class by class name. - - :type class_name: str - :param class_name: a class name to look for - :type class_type: str - :param class_type: the type of the class to look for - (e.g. data_sources, ingestors, etc.). - :returns: class -- the source class requested. - :raises: MonanasNoSuchSourceError -- If no source class found. - :raises: MonanasDuplicateSourceError -- If the system has multiple sources - of the same class name. - """ - classes = get_available_classes(class_type) - if class_type: - clazz = list(filter(lambda t_class: t_class.__name__ == class_name, - classes[class_type])) - else: - for c_type in classes.keys(): - clazz = list(filter(lambda t_class: t_class.__name__ == class_name, - classes[c_type])) - if clazz: - break - if not clazz: - raise err.MonanasNoSuchClassError(class_name) - elif len(clazz) > 1: - raise err.MonanasDuplicateClassError(class_name) - else: - return clazz[0] - - -def get_available_class_names(class_type): - """Gets available class names of type class_type. - - :type class_type: str - :param class_type: type of classes to look for - :rtype: list - :returns: a list of available source class names. - """ - classes = get_available_classes(class_type) - return [Clazz.__name__ for Clazz in classes[class_type]] - - -def get_source_class_by_name(class_name): - """Gets the source class by class name. - - :type class_name: str - :param class_name: name of the source class requested. - :raises: MonanasNoSuchIngestorError -- if no source class found. - :raises: MonanasDuplicateIngestorError -- if the system has multiple - source of the same class name. - """ - return get_class_by_name(class_name, const.SOURCES) - - -def get_available_source_class_names(): - """Gets available source class names. - - :rtype: list - :returns: a list of available source class names. - """ - return get_available_class_names(const.SOURCES) - - -def get_ingestor_class_by_name(class_name): - """Gets the ingestor class by class name. - - :type class_name: str - :param class_name: name of the ingestor class requested. - :raises: MonanasNoSuchIngestorError -- if no ingestor class found. - :raises: MonanasDuplicateIngestorError -- if the system has multiple - ingestors of the same class name. - """ - return get_class_by_name(class_name, const.INGESTORS) - - -def get_available_ingestor_class_names(): - """Gets available ingestor class names. - - :rtype: list - :returns: a list of available ingestor class names. - """ - return get_available_class_names(const.INGESTORS) - - -def get_sml_class_by_name(class_name): - """Gets the sml class by class name. - - :type class_name: str - :param class_name: name of the sml class requested. - :raises: MonanasNoSuchIngestorError -- if no sml class found. - :raises: MonanasDuplicateIngestorError -- if the system has multiple sml - algorithms of the same class - name. - """ - return get_class_by_name(class_name, const.SMLS) - - -def get_available_sml_class_names(): - """Gets available sml class names. - - :rtype: list - :returns: a list of available sml class names. - """ - return get_available_class_names(const.SMLS) - - -def get_voter_class_by_name(class_name): - """Gets the voter class by class name. - - :type class_name: str - :param class_name: name of the voter class requested. - :raises: MonanasNoSuchIngestorError -- If no voter class found. - :raises: MonanasDuplicateIngestorError: If the system has multiple - voter of the same class name. - """ - return get_class_by_name(class_name, const.VOTERS) - - -def get_available_voter_class_names(): - """Gets available voter class names. - - :rtype: list - :returns: a list of available voter class names. - """ - return get_available_class_names(const.VOTERS) - - -def get_available_ldp_class_names(): - """Gets available ldp class names. - - :rtype: list - :returns: a list of available ldp class names. - """ - return get_available_class_names(const.LDPS) diff --git a/monasca_analytics/util/math.py b/monasca_analytics/util/math.py deleted file mode 100644 index 1315514..0000000 --- a/monasca_analytics/util/math.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import bisect - - -def interpolate_1d(table, value): - """Return the interpolated result using the table for the passed value. - - :type table: list[(int, float)] - :param table: a list where keys are numbers - :type value: float | int - :param value: the value we want to compute the result from. - """ - table.sort(key=lambda fn: fn[0]) - keys = [fv[0] for fv in table] - index = bisect.bisect(keys, value) - if index == 0: - return table[index][1] - elif index == len(table): - return table[index - 1][1] - else: - lo = table[index - 1] - hi = table[index] - return (hi[1] - lo[1]) * (value - lo[0]) / (hi[0] - lo[0]) + lo[1] diff --git a/monasca_analytics/util/singleton.py b/monasca_analytics/util/singleton.py deleted file mode 100644 index 51ca2ea..0000000 --- a/monasca_analytics/util/singleton.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -class Singleton(type): - """A singleton metaclass.""" - - _instances = {} - - def __call__(self, *args, **kwargs): - if self not in self._instances: - self._instances[self] = super(Singleton, self).__call__(*args, - **kwargs) - return self._instances[self] diff --git a/monasca_analytics/util/spark_func.py b/monasca_analytics/util/spark_func.py deleted file mode 100644 index a8e182c..0000000 --- a/monasca_analytics/util/spark_func.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json - - -def from_json(rdd_entry): - return json.loads(rdd_entry) diff --git a/monasca_analytics/util/string_util.py b/monasca_analytics/util/string_util.py deleted file mode 100644 index a9edb4e..0000000 --- a/monasca_analytics/util/string_util.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import six - - -def array_to_str(array, multiline=False, indent=None): - """ - Convert the provided dictionary into a readable str, by calling - str on both the keys and the values. - :type array: list - :param array: the dictionary to convert. - :type multiline: bool - :param multiline: If each key value pair should be on its own line. - :type indent: int - :param indent: Indentation if multiline is True. - :rtype: str - :return: Returns the converted dict. - """ - if len(array) == 0: - return "[]" - - multiline = multiline or indent is not None - - def dispatch(value): - if isinstance(value, list): - return array_to_str(value, multiline, indent) - if isinstance(value, dict): - return dict_to_str(value, multiline, indent) - return str(value) - - res = "[" - if multiline: - res += "\n" - join_str = "," - if multiline: - join_str += "\n" - else: - join_str += " " - if indent is not None: - join_str = " " * indent + join_str - res += join_str.join(map(dispatch, array)) - if multiline: - res += "\n" - res += "]" - - return res - - -def dict_to_str(dictionary, multiline=False, indent=None): - """ - Convert the provided dictionary into a readable str, by calling - str on both the keys and the values. - :type dictionary: dict - :param dictionary: the dictionary to convert. - :type multiline: bool - :param multiline: If each key value pair should be on its own line. - :type indent: int - :param indent: Indentation if multiline is True. - :rtype: str - :return: Returns the converted dict. - """ - if len(dictionary) == 0: - return "{}" - res = "{" - if multiline: - res += "\n" - multiline = multiline or indent is not None - for k, v in sorted(six.iteritems(dictionary), key=lambda ke: str(ke[0])): - if indent is not None: - res += " " * indent - if isinstance(v, dict): - res += "{}: {}, ".format(str(k), - dict_to_str(v, multiline, indent)) - elif isinstance(v, list): - res += "{}: {}, ".format(str(k), - array_to_str(v, multiline, indent)) - else: - res += "{}: {}, ".format(str(k), str(v)) - if multiline: - res += '\n' - res = res[0:-2] - res += "}" - return res - - -def stable_repr(obj): - """ - Convert the provided dictionary into a 'repr' str, by calling - repr on both the keys and the values. - :type obj: dict | str | float - :param obj: the dictionary to convert. - :rtype: str - :return: Returns the converted dict. - """ - - if isinstance(obj, list): - return "[" + ", ".join(map(stable_repr, obj)) + "]" - elif not isinstance(obj, dict): - return repr(obj) - - if len(obj) == 0: - return "{}" - - res = "{" - - for k, v in sorted(six.iteritems(obj), key=lambda ke: str(ke[0])): - res += "{}: {}, ".format(repr(k), stable_repr(v)) - - res = res[0:-2] - res += "}" - return res diff --git a/monasca_analytics/util/timestamp.py b/monasca_analytics/util/timestamp.py deleted file mode 100644 index 731d5b1..0000000 --- a/monasca_analytics/util/timestamp.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import time - - -def timestamp(date_time_object): - """ - Returns the timestamp associated with the given - datetime object. - - :type date_time_object: datetime.datetime - :param date_time_object: datetime object that will be converted - :rtype int - :return: Returns the appropriate timestamp - """ - return int(time.mktime(date_time_object.timetuple())) diff --git a/monasca_analytics/util/validation_utils.py b/monasca_analytics/util/validation_utils.py deleted file mode 100644 index e7efd78..0000000 --- a/monasca_analytics/util/validation_utils.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os.path as path -import re - -import voluptuous - -from monasca_analytics.config import const -from monasca_analytics.util import common_util as cu - - -def AvailableSink(msg=None): - - available_sink_classes = cu.get_available_classes(const.SINKS)[const.SINKS] - available_sink_names = [Clazz.__name__ for Clazz in available_sink_classes] - - def f(v): - if str(v) in available_sink_names: - return str(v) - else: - raise voluptuous.Invalid(msg or ("Invalid Sink Name: " + str(v))) - return f - - -def NoSpaceCharacter(msg=None): - def f(v): - if not any(c.isspace() for c in str(v)): - return str(v) - else: - raise voluptuous.Invalid(msg or ( - "White space not allowed in: " + str(v))) - return f - - -def ExistingPath(msg=None): - def f(v): - if path.exists(path.expanduser(str(v))) or\ - path.exists(path.dirname(path.expanduser(str(v)))): - return str(v) - else: - raise voluptuous.Invalid(msg or ( - "Path does not exist: " + str(v))) - return f - - -def NumericString(msg=None): - def f(v): - if re.match("[0-9]+", str(v)): - return str(v) - else: - raise voluptuous.Invalid(msg or ( - "string does not represent a number")) - return f - - -def ValidMarkovGraph(msg=None): - def f(v): - if len(str(v).split(":")) == 2 and str(v).split(":")[1] in\ - ["host", "web_service", "switch"]: - return str(v) - else: - raise voluptuous.Invalid(msg or ( - "Key should be of the form 'anything:host' " - "where 'host' can be replaced " - "by 'web_service' or 'switch'.")) - return f - - -def NotEmptyArray(msg=None): - def f(v): - if len(v) > 0: - return v - else: - raise voluptuous.Invalid(msg or ("empty array: " + str(v))) - return f diff --git a/monasca_analytics/voter/__init__.py b/monasca_analytics/voter/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/voter/base.py b/monasca_analytics/voter/base.py deleted file mode 100644 index f13b8ae..0000000 --- a/monasca_analytics/voter/base.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import abc -import logging - -from monasca_analytics.component import base - -logger = logging.getLogger(__name__) - - -class BaseVoter(base.BaseComponent): - - def __init__(self, _id, _config): - super(BaseVoter, self).__init__(_id, _config) - self._ldps = [] - self._smls = [] - self._has_receive_structure_from = set([]) - self._structures = [] - - @abc.abstractmethod - def elect_structure(self, structures): - """Elect a structure or combine them to create a new one - - :type structures: list[numpy.ndarray] - :param structures: the list of structure learned over the samples. - :rtype: numpy.ndarray - :returns: this should returns one of the structure or a combination. - """ - pass - - def suggest_structure(self, who, structure): - """Suggest to this voter the given structure. - - :param who: the sml making the proposal - :param structure: the structure proposed - :rtype: numpy.ndarray - """ - if who not in self._has_receive_structure_from: - self._structures.append(structure) - self._has_receive_structure_from.add(who) - if len(self._has_receive_structure_from) == len(self._smls): - candidate = self.elect_structure(self._structures) - for tr in self._ldps: - tr.set_voter_output(candidate) - # TODO(David): feed the sinks with candidate. - self._has_receive_structure_from = set([]) - return - logger.debug("SML algorithm '{}' already suggested a structure" - .format(who)) - - def append_sml(self, l): - """Append a SML to the list of SMLs - - This method is automatically called by the passed sml - when this voter is connected to it and shouldn't be used directly. - - :type l: monasca_analytics.sml.base.BaseSML - :param l: sml just connected to this. - """ - self._smls.append(l) - - def remove_sml(self, l): - """Remove a SML from the list of SMLs - - This method is automatically called by the passed sml - when this voter is disconnected to it and shouldn't be used - directly. - - :type l: monasca_analytics.sml.base.BaseSML - :param l: sml just disconnected to this. - """ - self._smls.remove(l) - - def append_ldp(self, ldp): - """Add the LDP to the LDPs list""" - self._ldps.append(ldp) - - def remove_ldp(self, ldp): - """Remove the LDP from the LDPs list""" - self._ldps.remove(ldp) diff --git a/monasca_analytics/voter/pick_index.py b/monasca_analytics/voter/pick_index.py deleted file mode 100644 index 604b6ba..0000000 --- a/monasca_analytics/voter/pick_index.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import math -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -from monasca_analytics.voter import base - -import six - - -logger = logging.getLogger(__name__) - - -class PickIndexVoter(base.BaseVoter): - - def __init__(self, _id, _config): - super(PickIndexVoter, self).__init__(_id, _config) - self._index = _config["index"] - - @staticmethod - def validate_config(_config): - pick_schema = voluptuous.Schema({ - "module": voluptuous.And( - six.string_types[0], - lambda i: not any(c.isspace() for c in i)), - "index": voluptuous.And( - voluptuous.Or(float, int), - lambda i: i >= 0 and math.ceil(i) == math.floor(i) - ) - }, required=True) - return pick_schema(_config) - - @staticmethod - def get_default_config(): - return { - "module": PickIndexVoter.__name__, - "index": 0 - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor('index', type_util.Number(), 0), - ] - - def elect_structure(self, structures): - return structures[ - min(len(structures) - 1, - self._index)] diff --git a/monasca_analytics/web_service/__init__.py b/monasca_analytics/web_service/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/monasca_analytics/web_service/request_handler.py b/monasca_analytics/web_service/request_handler.py deleted file mode 100644 index 2e10ce2..0000000 --- a/monasca_analytics/web_service/request_handler.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging -import sys -import traceback - -import six -from tornado import web -import voluptuous - -import monasca_analytics.banana.emitter as emit -import monasca_analytics.exception.monanas as err -import monasca_analytics.util.common_util as introspect -from monasca_analytics.web_service import web_service_model - - -logger = logging.getLogger(__name__) - - -class MonanasHandler(web.RequestHandler): - """Request handler for WebService.""" - - def initialize(self, monanas): - """Initializes the handler. - - :param monanas: Monanas -- A Monanas's instance. - """ - self._monanas = monanas - - @web.asynchronous - def post(self): - """Performs a Monanas's action.""" - terminate = (False, "") - - try: - body = json.loads(self.request.body) - web_service_model.action_model(body) - getattr(self._monanas, body["action"])() - except (AttributeError, voluptuous.Invalid, ValueError): - self.set_status(400, "The request body was malformed.") - except (err.MonanasBindSourcesError, - err.MonanasAlreadyStartedStreaming, - err.MonanasAlreadyStoppedStreaming) as e: - self.set_status(400, e.__str__()) - except err.MonanasStreamingError as e: - self.set_status(500, e.__str__()) - terminate = (True, e.__str__()) - except Exception as e: - logger.error("Unexpected error: {0}. {1}". - format(sys.exc_info()[0], e)) - self.set_status(500, "Internal server error.") - - self.flush() - self.finish() - - if terminate[0]: - logger.error(terminate[1]) - self._monanas.stop_streaming_and_terminate() - - -class BananaHandler(web.RequestHandler): - """ - Request handler to manage the active config using - the banana configuration language. - """ - - def initialize(self, monanas, typeck_only): - """Initialize the handler. - - :param monanas: A Monana's instance. - """ - self._monanas = monanas - self._typeck_only = typeck_only - - @web.asynchronous - def post(self): - """Performs a Monanas's action.""" - terminate = (False, "") - - try: - body = json.loads(self.request.body) - web_service_model.banana_model(body) - emitter = emit.JsonEmitter() - if self._typeck_only: - self._monanas.typeck_configuration(body["content"], - emitter) - else: - self._monanas.try_change_configuration(body["content"], - emitter) - self.write(emitter.result) - except (AttributeError, voluptuous.Invalid, ValueError) as e: - self.set_status(400, "The request body was malformed.") - except Exception as e: - tb = traceback.format_exc() - print(tb) - logger.error("Unexpected error: {0}. {1}". - format(sys.exc_info()[0], e)) - self.set_status(500, "Internal server error.") - - self.flush() - self.finish() - - if terminate[0]: - logger.error(terminate[1]) - self._monanas.stop_streaming_and_terminate() - - -class BananaMetaDataHandler(web.RequestHandler): - - def initialize(self, monanas): - """Initializes the handler. - - :param monanas: Monanas -- A Monanas's instance. - """ - self._monanas = monanas - - @web.asynchronous - def get(self): - all_components = introspect.get_available_classes() - result = {"components": []} - for kind, components in six.iteritems(all_components): - for component in components: - result["components"].append({ - "name": component.__name__, - "description": component.__doc__, - "params": map(lambda x: x.to_json(), - component.get_params()), - }) - self.write(result) - self.flush() - self.finish() - - @web.asynchronous - def post(self): - - try: - body = json.loads(self.request.body) - web_service_model.banana_model(body) - type_table = self._monanas.compute_type_table(body["content"]) - self.write(type_table) - except (AttributeError, voluptuous.Invalid, ValueError) as e: - logger.warn("Wrong request: {}.". - format(e)) - self.set_status(400, "The request body was malformed.") - except Exception as e: - tb = traceback.format_exc() - print(tb) - logger.error("Unexpected error: {}. {}". - format(sys.exc_info()[0], e)) - self.set_status(500, "Internal server error.") - - self.flush() - self.finish() diff --git a/monasca_analytics/web_service/web_service.py b/monasca_analytics/web_service/web_service.py deleted file mode 100644 index 9de9c6b..0000000 --- a/monasca_analytics/web_service/web_service.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from tornado import web - -from monasca_analytics.web_service import request_handler - - -class WebService(web.Application): - """WebService serving REST API for Monanas.""" - - def __init__(self, monanas, config): - """WebService constructor.""" - self._monanas = monanas - self._config = config - params = {"monanas": self._monanas} - handlers = [ - (r"/", request_handler.MonanasHandler, params), - (r"/banana", request_handler.BananaHandler, { - "monanas": self._monanas, - "typeck_only": False - }), - (r"/banana/typeck", request_handler.BananaHandler, { - "monanas": self._monanas, - "typeck_only": True - }), - (r"/banana/metadata", request_handler.BananaMetaDataHandler, { - "monanas": self._monanas, - }) - ] - - settings = {} - - web.Application.__init__(self, - handlers, - debug=config["debug"], - **settings) diff --git a/monasca_analytics/web_service/web_service_model.py b/monasca_analytics/web_service/web_service_model.py deleted file mode 100644 index 7028756..0000000 --- a/monasca_analytics/web_service/web_service_model.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""A list of functions to validate web_service models.""" - -import voluptuous - - -import six - - -def action_model(value): - """Validates the data against action_model schema.""" - action_model_schema = voluptuous.Schema({ - "action": voluptuous.And(six.string_types[0], - lambda o: not o.startswith("_")) - }, required=True) - - return action_model_schema(value) - - -def banana_model(value): - """Validates the data against the banana_model schema.""" - banana_model_schema = voluptuous.Schema({ - "content": six.string_types[0] - }, required=True) - - return banana_model_schema(value) diff --git a/releasenotes/notes/drop-py-2-7-e99c2ab58c9d978a.yaml b/releasenotes/notes/drop-py-2-7-e99c2ab58c9d978a.yaml deleted file mode 100644 index 5f4b0cb..0000000 --- a/releasenotes/notes/drop-py-2-7-e99c2ab58c9d978a.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -upgrade: - - | - Python 2.7 support has been dropped. Last release of monasca-analytics - to support python 2.7 is OpenStack Train. The minimum version of Python now - supported by monasca-analytics is Python 3.6. diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b40c4cd..0000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -numpy -scipy < 1.2.0 -tornado < 6.0 -scikit-learn -kafka-python -pyparsing -voluptuous>=0.8.9 # BSD License diff --git a/run.py b/run.py deleted file mode 100644 index a1a9068..0000000 --- a/run.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Monanas Runner. - -This script checks for appropriate arguments and starts Monanas to use -data coming from one or more given sources. The source(s) can be configured -using the optional argument --sources. However, a default source using random -data generator is provided in the config folder. -""" - -import json -import logging -import logging.config as log_conf -import os -import subprocess -import sys - -import argparse -import textwrap - -import setup_property - - -class RunnerError(Exception): - def __init__(self, value): - self._value = value - - def __str__(self): - return repr(self._value) - - -def main(arguments): - spark_submit = "{0}/bin/spark-submit".format(arguments.spark_path) - monanas_path = os.environ.get('MONANAS_HOME', "") - kafka_jar = None - - try: - for filename in os.listdir("{0}/external/kafka-assembly/target". - format(arguments.spark_path)): - if filename.startswith("spark-streaming-kafka-assembly") and\ - not any(s in filename for s in ["source", "test"]): - kafka_jar = filename - break - - if not kafka_jar: - raise OSError("Spark's external library required does not exist.") - except OSError as e: - raise RunnerError(e.__str__()) - - spark_kafka_jar = "{0}/external/kafka-assembly/target/{1}".\ - format(arguments.spark_path, kafka_jar) - command = [ - spark_submit, "--master", "local[2]", - "--jars", spark_kafka_jar, monanas_path + "/monasca_analytics/monanas.py", - arguments.config, arguments.log_config - ] - - if arguments.sources is not None: - command += arguments.sources - - try: - logger.info("Executing `{}`...".format(" ".join(command))) - subprocess.Popen(command).communicate() - except OSError as e: - raise RunnerError(e.__str__()) - - -def setup_logging(filename): - """Setup logging based on a json string.""" - with open(filename, "rt") as f: - config = json.load(f) - - log_conf.dictConfig(config) - -def setup_parser(): - parser = argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description=textwrap.dedent(__doc__.strip()), - add_help=False) - - parser.add_argument('-c', '--config', - help='Config file.', required=True) - # "-d" currently unused - parser.add_argument('-d', '--debug', - help='Show debug messages.', action='store_true') - parser.add_argument('-h', '--help', - help='Show this screen.', action='help') - parser.add_argument('-l', '--log_config', - help='Log config file\'s path.', required=True) - parser.add_argument('-p', '--spark_path', - help='Spark\'s path.', required=True) - parser.add_argument('-s', '--sources', - help='A list of data sources.', nargs='*') - parser.add_argument('-v', '--version', - help='Show version.', action='version', - version=setup_property.VERSION) - - return parser - -if __name__ == "__main__": - arguments = setup_parser().parse_args() - - try: - setup_logging(arguments.log_config) - except IOError: - raise RunnerError("File not found: {0}.". - format(arguments.log_config)) - except ValueError: - raise RunnerError("{0} is not a valid logging config file.". - format(arguments.log_config)) - - logger = logging.getLogger(__name__) - - try: - main(arguments) - except KeyboardInterrupt: - logger.info("Monanas run script stopped.") - except RunnerError as e: - logger.error(e.__str__()) - except Exception as e: - logger.error("Unexpected error: {0}. {1}.". - format(sys.exc_info()[0], e)) diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 513f837..0000000 --- a/setup.cfg +++ /dev/null @@ -1,41 +0,0 @@ -[metadata] -name = monanas -#name = monasca-analytics - -summary = Monanas - Monasca Analytics -description-file = - README.md -author = OpenStack -author-email = openstack-discuss@lists.openstack.org -home-page = https://launchpad.net/monasca -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - -[files] -packages = - monasca_analytics - test - -#data_files = -# etc/monasca = -# etc/monasca/analytics-config.conf -# etc/monasca/analytics-config.ini - -[entry_points] -#console_scripts = -# monasca-analytics = monasca_analytics.server:launch -# -#tempest.test_plugins = -# monasca_analytics_tests = monasca_analytics_tests.plugin:MonascaAnalyticsTempestPlugin - -[pbr] -warnerrors = True - diff --git a/setup.py b/setup.py deleted file mode 100644 index bfcb5e5..0000000 --- a/setup.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Monanas setup script. -""" - -from setuptools import setup - -setup( - setup_requires=['pbr>=1.8'], - pbr=True, -) diff --git a/setup_property.py b/setup_property.py deleted file mode 100644 index 7b02f74..0000000 --- a/setup_property.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""Setup property for the Machine Learning Framework.""" - -VERSION = "0.1" diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index b7bf5b4..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -# mock object framework -coverage>=3.6 # Apache-2.0 -hacking>=1.1.0,<1.2.0 -flake8>=2.5.4,<=3.5.0 # MIT -nose==1.3.0 -mock>=1.0.1 diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/aggregator/__init__.py b/test/aggregator/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/__init__.py b/test/banana/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/deadpathck/__init__.py b/test/banana/deadpathck/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/deadpathck/test_at_least_one_sink_or_source.py b/test/banana/deadpathck/test_at_least_one_sink_or_source.py deleted file mode 100644 index a89ef46..0000000 --- a/test/banana/deadpathck/test_at_least_one_sink_or_source.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import monasca_analytics.banana.deadpathck.config as deadpathck -import monasca_analytics.banana.grammar.config as grammar -import monasca_analytics.banana.typeck.config as typeck -import monasca_analytics.exception.banana as exception - -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class PassOneSinkSourceTestCase(MonanasTestCase): - - def setUp(self): - super(PassOneSinkSourceTestCase, self).setUp() - - def tearDown(self): - super(PassOneSinkSourceTestCase, self).tearDown() - - def test_banana_should_fail_when_no_source(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "c -> d -> b" - # Convert the grammar into an AST - parser = grammar.banana_grammar() - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table) - self.assertRaises( - exception.BananaNoFullPath, - deadpathck.contains_at_least_one_path_to_a_sink, - ast, - type_table - ) - - def test_banana_should_fail_when_no_sink(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "a -> c -> d" - # Convert the grammar into an AST - parser = grammar.banana_grammar() - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table) - self.assertRaises( - exception.BananaNoFullPath, - deadpathck.contains_at_least_one_path_to_a_sink, - ast, - type_table - ) - - def test_banana_should_pass_when_more_source_sink(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "a -> c -> d -> b" - # Convert the grammar into an AST - parser = grammar.banana_grammar() - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table) - deadpathck.contains_at_least_one_path_to_a_sink(ast, type_table) - # We should reach this line. - self.assertTrue(True) diff --git a/test/banana/deadpathck/test_deadpathck.py b/test/banana/deadpathck/test_deadpathck.py deleted file mode 100644 index 04e52af..0000000 --- a/test/banana/deadpathck/test_deadpathck.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import monasca_analytics.banana.deadpathck.config as deadpathck -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.grammar.config as grammar -import monasca_analytics.banana.typeck.config as typeck - -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class DeadPathTestCase(MonanasTestCase): - - def setUp(self): - super(DeadPathTestCase, self).setUp() - - def tearDown(self): - super(DeadPathTestCase, self).tearDown() - - def test_banana_should_remove_everything(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "a -> c -> d" - emitter = CustomEmitter() - # Convert the grammar into an AST - parser = grammar.banana_grammar(emitter) - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table, emitter) - self.assertEqual(emitter.nb_errors, 0) - self.assertEqual(emitter.nb_warnings, 4) - self.assertEqual(len(ast.components), 0) - self.assertEqual(len(list(ast.connections.connections)), 0) - - def test_banana_should_remove_one(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "a -> c -> [d, b]" - emitter = CustomEmitter() - # Convert the grammar into an AST - parser = grammar.banana_grammar(emitter) - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table, emitter) - self.assertEqual(emitter.nb_errors, 0) - self.assertEqual(emitter.nb_warnings, 1) - self.assertEqual(len(ast.components), 3) - self.assertEqual(len(list(ast.connections.connections)), 2) - - def test_banana_should_not_remove_anything(self): - banana_str = "" +\ - "a = CloudMarkovChainSource()\n" +\ - "b = StdoutSink()\n" +\ - "c = CloudIngestor()\n" +\ - "d = LiNGAM()\n" +\ - "a -> c -> d -> b" - emitter = CustomEmitter() - # Convert the grammar into an AST - parser = grammar.banana_grammar(emitter) - ast = parser.parse(banana_str) - # Compute the type table for the given AST - type_table = typeck.typeck(ast) - # Remove from the tree path that are "dead" - deadpathck.deadpathck(ast, type_table, emitter) - self.assertEqual(emitter.nb_errors, 0) - self.assertEqual(emitter.nb_warnings, 0) - self.assertEqual(len(ast.components), 4) - self.assertEqual(len(list(ast.connections.connections)), 3) - - -class CustomEmitter(emit.Emitter): - - def __init__(self): - super(CustomEmitter, self).__init__() - self.nb_warnings = 0 - self.nb_errors = 0 - - def emit_warning(self, span, message): - print(span.get_line(), str(span), message) - self.nb_warnings += 1 - - def emit_error(self, span, message): - print(span.get_line(), str(span), message) - self.nb_errors += 1 diff --git a/test/banana/eval/__init__.py b/test/banana/eval/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/eval/should_pass/eval_components_only/cloud_markov_chain_source.banana b/test/banana/eval/should_pass/eval_components_only/cloud_markov_chain_source.banana deleted file mode 100644 index e725ac9..0000000 --- a/test/banana/eval/should_pass/eval_components_only/cloud_markov_chain_source.banana +++ /dev/null @@ -1,3 +0,0 @@ -a = CloudMarkovChainSource() # LHS_EQ IGNORE -c = a.sleep # LHS_EQ 0.01 -c = a.transitions.web_service."run=>slow"."0" # LHS_EQ 0.001 \ No newline at end of file diff --git a/test/banana/eval/should_pass/eval_each_stmt/calc_expressions.banana b/test/banana/eval/should_pass/eval_each_stmt/calc_expressions.banana deleted file mode 100644 index 97596da..0000000 --- a/test/banana/eval/should_pass/eval_each_stmt/calc_expressions.banana +++ /dev/null @@ -1,8 +0,0 @@ -a = 23 # LHS_EQ 23.0 -a = a - a # LHS_EQ 0.0 -a = 12 - 12 - 12 # LHS_EQ -12.0 -a = 3 * 4 - 2 # LHS_EQ 10.0 -a = 2 - 3 * 4 # LHS_EQ -10.0 -b = 21 # LHS_EQ 21.0 -d = 12 # LHS_EQ 12.0 -e = b * (d + a) # LHS_EQ 42.0 diff --git a/test/banana/eval/should_pass/eval_each_stmt/json_expressions.banana b/test/banana/eval/should_pass/eval_each_stmt/json_expressions.banana deleted file mode 100644 index 59e635b..0000000 --- a/test/banana/eval/should_pass/eval_each_stmt/json_expressions.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = {a.b.c: 12} # LHS_EQ {'a': {'b': {'c': 12.0}}} -b = a.a.b.c # LHS_EQ 12.0 -a = {a.b: 21, a.c: "test"} # LHS_EQ {'a': {'b': 21.0, 'c': 'test'}} -d = a.a.c + " " + a.a.b # LHS_EQ 'test 21.0' \ No newline at end of file diff --git a/test/banana/eval/test_eval_config.py b/test/banana/eval/test_eval_config.py deleted file mode 100644 index 9e5c285..0000000 --- a/test/banana/eval/test_eval_config.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os -import re - -from monasca_analytics.banana.pass_manager import compute_evaluation_context -from monasca_analytics.util.string_util import stable_repr -from test.util_for_testing import MonanasTestCase - - -logger = logging.getLogger(__name__) - -_has_some_file_that_should = dict() -_has_some_file_that_should["pass_eval_stmt"] = False - - -class EvalTestCase(MonanasTestCase): - - def setUp(self): - super(EvalTestCase, self).setUp() - - def tearDown(self): - super(EvalTestCase, self).tearDown() - - def test_files_have_been_found(self): - self.assertTrue(_has_some_file_that_should["pass_eval_stmt"]) - - -def upgrade_test_case(): - regex_var_eq = re.compile("#(?: )*LHS_EQ(?: )+([^\n]+)") - - for root, dirs, files in os.walk('./banana/eval/should_pass/'): - for filename in files: - name_no_ext, _ = os.path.splitext(filename) - _has_some_file_that_should["pass_eval_stmt"] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - - expected_values = regex_var_eq.findall(content) - - def create_test(test_str, expect_values): - def should_pass(self): - # Custom checks runned after each statement - box = {"counter": 0} - - def custom_check(ctx, stmt_type, lhs_node, rhs_value): - if expect_values[box["counter"]] != "IGNORE": - self.assertEqual( - expect_values[box["counter"]], - stable_repr(rhs_value)) - box["counter"] += 1 - # Evaluate the file. - compute_evaluation_context(test_str, custom_check) - - should_pass.__name__ = "test_banana_eval_" + name_no_ext - return should_pass - - setattr(EvalTestCase, "test_banana_eval_" + name_no_ext, - create_test(content, expected_values)) - -# Fill the test case with generated test case from banana files -upgrade_test_case() diff --git a/test/banana/grammar/__init__.py b/test/banana/grammar/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/grammar/should_fail/component_cant_be_in_object.banana b/test/banana/grammar/should_fail/component_cant_be_in_object.banana deleted file mode 100644 index 74899f5..0000000 --- a/test/banana/grammar/should_fail/component_cant_be_in_object.banana +++ /dev/null @@ -1,2 +0,0 @@ -a = { b: MyComponent() } -# RAISE ParseSyntaxException \ No newline at end of file diff --git a/test/banana/grammar/should_fail/json_obj_props_cant_shadow.banana b/test/banana/grammar/should_fail/json_obj_props_cant_shadow.banana deleted file mode 100644 index 973c008..0000000 --- a/test/banana/grammar/should_fail/json_obj_props_cant_shadow.banana +++ /dev/null @@ -1,4 +0,0 @@ -# This one shadow the a.b, so this is still an error. -a = { a.b: "test", a.b: 23 } - -# RAISE ParseSyntaxException \ No newline at end of file diff --git a/test/banana/grammar/should_fail/wrong_symbol_in_connection.banana b/test/banana/grammar/should_fail/wrong_symbol_in_connection.banana deleted file mode 100644 index 27977ab..0000000 --- a/test/banana/grammar/should_fail/wrong_symbol_in_connection.banana +++ /dev/null @@ -1,3 +0,0 @@ -# This should fail -a -> b * c -# RAISE ParseException \ No newline at end of file diff --git a/test/banana/grammar/should_fail/wrong_symbol_in_expr.banana b/test/banana/grammar/should_fail/wrong_symbol_in_expr.banana deleted file mode 100644 index 42a5362..0000000 --- a/test/banana/grammar/should_fail/wrong_symbol_in_expr.banana +++ /dev/null @@ -1,2 +0,0 @@ -a = b -> c -# RAISE ParseException \ No newline at end of file diff --git a/test/banana/grammar/should_pass/component_creation.banana b/test/banana/grammar/should_pass/component_creation.banana deleted file mode 100644 index 3e261ed..0000000 --- a/test/banana/grammar/should_pass/component_creation.banana +++ /dev/null @@ -1,12 +0,0 @@ -# Creating some components -a = Test() -b = Test(param={}) -c = Test(param="test") -d = Test(param=234) - -# Assigning parameters -b.param = {} -c.param = "test" -d.param = 234 - -# STMT_EQ { DotPath< Ident< a > > = Component { type_name: Ident< Test >, args: []}, DotPath< Ident< b > > = Component { type_name: Ident< Test >, args: [Ident< param > = JsonObj< {} >]}, DotPath< Ident< c > > = Component { type_name: Ident< Test >, args: [Ident< param > = Expr< [StringLit< "test" >] >]}, DotPath< Ident< d > > = Component { type_name: Ident< Test >, args: [Ident< param > = Expr< [Number< 234.0 >] >]}, DotPath< Ident< b >.Ident< param > > = JsonObj< {} >, DotPath< Ident< c >.Ident< param > > = Expr< [StringLit< "test" >] >, DotPath< Ident< d >.Ident< param > > = Expr< [Number< 234.0 >] > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/connection.banana b/test/banana/grammar/should_pass/connection.banana deleted file mode 100644 index e4a02f9..0000000 --- a/test/banana/grammar/should_pass/connection.banana +++ /dev/null @@ -1,13 +0,0 @@ -# This example would not pass later pass -# but exercise the grammar - -a = Test() -b = Test() - -a -> [b, c] -a -> b -> c -a -> [a -> b, b] -> e -a -> b -[[a]] -> b - -# CONN_EQ Connection< [('Ident< a >', 'Ident< b >'), ('Ident< a >', 'Ident< c >'), ('Ident< b >', 'Ident< c >'), ('Ident< a >', 'Ident< a >'), ('Ident< b >', 'Ident< e >')] > \ No newline at end of file diff --git a/test/banana/grammar/should_pass/dot_accesses.banana b/test/banana/grammar/should_pass/dot_accesses.banana deleted file mode 100644 index 1e1430f..0000000 --- a/test/banana/grammar/should_pass/dot_accesses.banana +++ /dev/null @@ -1,10 +0,0 @@ -a = {} -a.param1 = 23 -a."param3" = 1 -a."param4"."para mmm" = a."param3" -a.param2 = { - "a": 34 + 12, - a.b.c: a.param1 -} - -# STMT_EQ { DotPath< Ident< a > > = JsonObj< {} >, DotPath< Ident< a >.Ident< param1 > > = Expr< [Number< 23.0 >] >, DotPath< Ident< a >.StringLit< "param3" > > = Expr< [Number< 1.0 >] >, DotPath< Ident< a >.StringLit< "param4" >.StringLit< "para mmm" > > = Expr< [DotPath< Ident< a >.StringLit< "param3" > >] >, DotPath< Ident< a >.Ident< param2 > > = JsonObj< {DotPath< Ident< a >.Ident< b >.Ident< c > >: Expr< [DotPath< Ident< a >.Ident< param1 > >] >, StringLit< "a" >: Expr< [Number< 34.0 >, +, Number< 12.0 >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/eval_json_obj.banana b/test/banana/grammar/should_pass/eval_json_obj.banana deleted file mode 100644 index 55d05ca..0000000 --- a/test/banana/grammar/should_pass/eval_json_obj.banana +++ /dev/null @@ -1,6 +0,0 @@ -a = { a.b: "test" } -c = { e: a } -# VAR a EQ_JSON { "a": {"b": "test"} } -# VAR c EQ_JSON { "e": {"a": {"b": "test"}} } - -# STMT_EQ { DotPath< Ident< a > > = JsonObj< {DotPath< Ident< a >.Ident< b > >: Expr< [StringLit< "test" >] >} >, DotPath< Ident< c > > = JsonObj< {DotPath< Ident< e > >: Expr< [DotPath< Ident< a > >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/eval_simple_expression.banana b/test/banana/grammar/should_pass/eval_simple_expression.banana deleted file mode 100644 index ea8082c..0000000 --- a/test/banana/grammar/should_pass/eval_simple_expression.banana +++ /dev/null @@ -1,8 +0,0 @@ -a = 23 + 2 -b = "test " + a -c = a + 4.0 * 2 -# VAR a EQ_NUM 25 -# VAR b EQ_STR "test 25" -# VAR c EQ_NUM 33 - -# STMT_EQ { DotPath< Ident< a > > = Expr< [Number< 23.0 >, +, Number< 2.0 >] >, DotPath< Ident< b > > = Expr< [StringLit< "test " >, +, DotPath< Ident< a > >] >, DotPath< Ident< c > > = Expr< [DotPath< Ident< a > >, +, Expr< [Number< 4.0 >, *, Number< 2.0 >] >] > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/full_example.banana b/test/banana/grammar/should_pass/full_example.banana deleted file mode 100644 index 706164c..0000000 --- a/test/banana/grammar/should_pass/full_example.banana +++ /dev/null @@ -1,14 +0,0 @@ -# Connections -a -> b - -# Some vars -d = 23 -e = d - 23 -c = 23 + 1.5 * 3 - d - -# Components -a = Test(a=23, b=c+10) -b = Test(23, 10) - -# STMT_EQ { DotPath< Ident< d > > = Expr< [Number< 23.0 >] >, DotPath< Ident< e > > = Expr< [DotPath< Ident< d > >, -, Number< 23.0 >] >, DotPath< Ident< c > > = Expr< [Number< 23.0 >, +, Expr< [Number< 1.5 >, *, Number< 3.0 >] >, -, DotPath< Ident< d > >] >, DotPath< Ident< a > > = Component { type_name: Ident< Test >, args: [Ident< a > = Expr< [Number< 23.0 >] >, Ident< b > = Expr< [DotPath< Ident< c > >, +, Number< 10.0 >] >]}, DotPath< Ident< b > > = Component { type_name: Ident< Test >, args: [Expr< [Number< 23.0 >] >, Expr< [Number< 10.0 >] >]} } -# CONN_EQ Connection< [('Ident< a >', 'Ident< b >')] > \ No newline at end of file diff --git a/test/banana/grammar/should_pass/json_obj.banana b/test/banana/grammar/should_pass/json_obj.banana deleted file mode 100644 index 562449f..0000000 --- a/test/banana/grammar/should_pass/json_obj.banana +++ /dev/null @@ -1,8 +0,0 @@ -# Various check for edge cases -a = {} -b = { a: {} } -c = { "a": {} } -d = { "": {} } -e = { "": "" } - -# STMT_EQ { DotPath< Ident< a > > = JsonObj< {} >, DotPath< Ident< b > > = JsonObj< {DotPath< Ident< a > >: JsonObj< {} >} >, DotPath< Ident< c > > = JsonObj< {StringLit< "a" >: JsonObj< {} >} >, DotPath< Ident< d > > = JsonObj< {StringLit< "" >: JsonObj< {} >} >, DotPath< Ident< e > > = JsonObj< {StringLit< "" >: Expr< [StringLit< "" >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/jsonlike_objects.banana b/test/banana/grammar/should_pass/jsonlike_objects.banana deleted file mode 100644 index de15920..0000000 --- a/test/banana/grammar/should_pass/jsonlike_objects.banana +++ /dev/null @@ -1,6 +0,0 @@ -a = {} -b = { "a": a } -c = { a.b: "b" } -d = { a.v."t t": 12 + 23 } - -# STMT_EQ { DotPath< Ident< a > > = JsonObj< {} >, DotPath< Ident< b > > = JsonObj< {StringLit< "a" >: Expr< [DotPath< Ident< a > >] >} >, DotPath< Ident< c > > = JsonObj< {DotPath< Ident< a >.Ident< b > >: Expr< [StringLit< "b" >] >} >, DotPath< Ident< d > > = JsonObj< {DotPath< Ident< a >.Ident< v >.StringLit< "t t" > >: Expr< [Number< 12.0 >, +, Number< 23.0 >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/scary_json_ops.banana b/test/banana/grammar/should_pass/scary_json_ops.banana deleted file mode 100644 index 2621d07..0000000 --- a/test/banana/grammar/should_pass/scary_json_ops.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = { b.c: 21 } -b = { a: { a.b: { a.b.c: 10 }}, b.c: 20 } - -# STMT_EQ { DotPath< Ident< a > > = JsonObj< {DotPath< Ident< b >.Ident< c > >: Expr< [Number< 21.0 >] >} >, DotPath< Ident< b > > = JsonObj< {DotPath< Ident< a > >: JsonObj< {DotPath< Ident< a >.Ident< b > >: JsonObj< {DotPath< Ident< a >.Ident< b >.Ident< c > >: Expr< [Number< 10.0 >] >} >} >, DotPath< Ident< b >.Ident< c > >: Expr< [Number< 20.0 >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/valid_expression.banana b/test/banana/grammar/should_pass/valid_expression.banana deleted file mode 100644 index 3c262f4..0000000 --- a/test/banana/grammar/should_pass/valid_expression.banana +++ /dev/null @@ -1,5 +0,0 @@ -c = SomeComponent() -b = 12 + c.param1."foo bar constant" -a = b * 12 - -# STMT_EQ { DotPath< Ident< c > > = Component { type_name: Ident< SomeComponent >, args: []}, DotPath< Ident< b > > = Expr< [Number< 12.0 >, +, DotPath< Ident< c >.Ident< param1 >.StringLit< "foo bar constant" > >] >, DotPath< Ident< a > > = Expr< [DotPath< Ident< b > >, *, Number< 12.0 >] > } \ No newline at end of file diff --git a/test/banana/grammar/should_pass/various_literal_assignments.banana b/test/banana/grammar/should_pass/various_literal_assignments.banana deleted file mode 100644 index a82c461..0000000 --- a/test/banana/grammar/should_pass/various_literal_assignments.banana +++ /dev/null @@ -1,5 +0,0 @@ -a = "some string" -b = 12.0 -c = {"a": b} - -# STMT_EQ { DotPath< Ident< a > > = Expr< [StringLit< "some string" >] >, DotPath< Ident< b > > = Expr< [Number< 12.0 >] >, DotPath< Ident< c > > = JsonObj< {StringLit< "a" >: Expr< [DotPath< Ident< b > >] >} > } \ No newline at end of file diff --git a/test/banana/grammar/test_config.py b/test/banana/grammar/test_config.py deleted file mode 100644 index 3fa49ae..0000000 --- a/test/banana/grammar/test_config.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os -import pyparsing as p -import re - -from monasca_analytics.banana.grammar.config import banana_grammar -from test.util_for_testing import MonanasTestCase - - -logger = logging.getLogger(__name__) - -_has_some_file_that_should = dict() -_has_some_file_that_should["pass"] = False -_has_some_file_that_should["fail"] = False - - -class GrammarTestCase(MonanasTestCase): - - def setUp(self): - super(GrammarTestCase, self).setUp() - - def tearDown(self): - super(GrammarTestCase, self).tearDown() - - def test_files_have_been_found(self): - self.assertTrue(_has_some_file_that_should["pass"]) - self.assertTrue(_has_some_file_that_should["fail"]) - - -def upgrade_test_case(): - grammar = banana_grammar() - regex_raise = re.compile("#(?: )*RAISE(?: )*([^\n]+)") - regex_ast_eq = re.compile("#(?: )*AST_EQ(?: )(?: )*([^\n]+)") - regex_stmt_eq = re.compile("#(?: )*STMT_EQ(?: )(?: )*([^\n]+)") - regex_conn_eq = re.compile("#(?: )*CONN_EQ(?: )(?: )*([^\n]+)") - - for root, dirs, files in os.walk('./banana/grammar/should_pass'): - for filename in files: - name_no_ext, _ = os.path.splitext(filename) - _has_some_file_that_should["pass"] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - - expected_ast = regex_ast_eq.search(content) - if expected_ast is not None: - expected_ast = expected_ast.group(1) - expected_stmt = regex_stmt_eq.search(content) - if expected_stmt is not None: - expected_stmt = expected_stmt.group(1) - expected_conn = regex_conn_eq.search(content) - if expected_conn is not None: - expected_conn = expected_conn.group(1) - - def create_test(test_str, expect_ast, expect_stmt, exp_conn): - def should_pass(self): - tree = grammar.parse(test_str) - if expect_ast is not None: - self.assertEqual(str(tree), - expect_ast) - if expect_stmt is not None: - self.assertEqual(tree.statements_to_str(), - expect_stmt) - if exp_conn is not None: - self.assertEqual(str(tree.connections), - exp_conn) - if exp_conn is None and expect_ast is None and\ - expect_stmt is None: - raise Exception("Expected at least one check!") - - should_pass.__name__ = "test_banana_pass_" + name_no_ext - return should_pass - - setattr(GrammarTestCase, "test_banana_pass_" + name_no_ext, - create_test(content, expected_ast, expected_stmt, - expected_conn)) - - for root, dirs, files in os.walk('./banana/grammar/should_fail'): - for filename in files: - name_no_ext, _ = os.path.splitext(filename) - _has_some_file_that_should["fail"] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - - def create_test(test_str): - def should_fail(self): - expected_error = regex_raise.search(test_str).group(1) - expected_exception = get_exception_from_str( - expected_error) - self.assertRaises( - expected_exception, - grammar.parse, - test_str) - should_fail.__name__ = "test_banana_fail_" + name_no_ext - return should_fail - - setattr(GrammarTestCase, "test_banana_fail_" + name_no_ext, - create_test(content)) - -# Fill the test case with generated test case from banana files -upgrade_test_case() - - -def get_exception_from_str(string): - if string == p.ParseSyntaxException.__name__: - return p.ParseSyntaxException - if string == p.ParseFatalException.__name__: - return p.ParseFatalException - if string == p.ParseException.__name__: - return p.ParseException - raise Exception("Invalid exception name: '{}'".format(string)) diff --git a/test/banana/test_api.py b/test/banana/test_api.py deleted file mode 100644 index 323e795..0000000 --- a/test/banana/test_api.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.exception.banana import BananaEnvironmentError -from monasca_analytics.exception.banana import BananaInvalidExpression -from monasca_analytics.parsing.api import validate_environment -from monasca_analytics.parsing.api import validate_expression -from monasca_analytics.parsing.api import validate_name_binding -from test.util_for_testing import MonanasTestCase - - -class TestBananaAPI(MonanasTestCase): - - def setUp(self): - super(TestBananaAPI, self).setUp() - - def tearDown(self): - super(TestBananaAPI, self).tearDown() - - def test_validate_expression_is_valid(self): - validate_expression("a + b") - validate_expression("a * b") - validate_expression("a - b") - validate_expression("a / b") - validate_expression("a / b + 12 * (1 - a)") - - def test_validate_expression_is_invalid(self): - self.assertRaises(BananaInvalidExpression, validate_expression, - "a123") - self.assertRaises(BananaInvalidExpression, validate_expression, - "a n + 15") - self.assertRaises(BananaInvalidExpression, validate_expression, - "a * exp(b)") - self.assertRaises(BananaInvalidExpression, validate_expression, - "-a") - self.assertRaises(BananaInvalidExpression, validate_expression, - "- a") - self.assertRaises(BananaInvalidExpression, validate_expression, - "+ b") - - def test_validate_name_binding_is_valid(self): - validate_name_binding( - validate_expression("a + b * c"), - {"a": "foo", "b": "foo", "c": "bar"} - ) - - def test_validate_name_binding_is_invalid(self): - self.assertRaises(BananaInvalidExpression, - validate_name_binding, - validate_expression("a + b * c"), - {"a": "foo", "c": "bar"}) - - def test_validate_environment_is_valid(self): - validate_environment({"a": "foo", "c": "bar"}) - - def test_validate_environment_is_invalid(self): - self.assertRaises(BananaEnvironmentError, - validate_environment, {"a": 0}) diff --git a/test/banana/test_config_examples.py b/test/banana/test_config_examples.py deleted file mode 100644 index 215f984..0000000 --- a/test/banana/test_config_examples.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os - -import monasca_analytics.banana.emitter as emit -import monasca_analytics.banana.pass_manager as p - -from test.util_for_testing import MonanasTestCase - - -logger = logging.getLogger(__name__) - -_has_some_examples_been_found = {0: False} - - -class ConfigExamplesTestCase(MonanasTestCase): - - def setUp(self): - super(ConfigExamplesTestCase, self).setUp() - - def tearDown(self): - super(ConfigExamplesTestCase, self).tearDown() - - def test_files_has_been_found(self): - self.assertTrue(_has_some_examples_been_found[0]) - - -def upgrade_test_case(): - for root, dirs, files in os.walk('../config'): - for filename in files: - name_no_ext, ext = os.path.splitext(filename) - if ext == '.banana': - _has_some_examples_been_found[0] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - - def create_test(test_str): - def should_pass(self): - fake_driver = FakeDriver() - emitter = CustomEmitter() - p.execute_banana_string( - test_str, fake_driver, emitter) - self.assertEqual(emitter.nb_errors, 0) - self.assertEqual(emitter.nb_warnings, 0) - self.assertTrue(fake_driver.set_links_called) - self.assertTrue(fake_driver.start_pipeline_called) - self.assertTrue(fake_driver.stop_pipeline_called) - - should_pass.__name__ = "test_banana_examples_config" - return should_pass - - setattr(ConfigExamplesTestCase, - "test_banana_examples_config_" + name_no_ext, - create_test(content)) - -upgrade_test_case() - - -class FakeDriver(object): - - def __init__(self): - self.start_pipeline_called = False - self.stop_pipeline_called = False - self.set_links_called = False - - def stop_pipeline(self): - self.stop_pipeline_called = True - - def start_pipeline(self): - self.start_pipeline_called = True - - def set_links(self, _): - self.set_links_called = True - - -class CustomEmitter(emit.Emitter): - - def __init__(self): - super(CustomEmitter, self).__init__() - self.nb_warnings = 0 - self.nb_errors = 0 - - def emit_warning(self, span, message): - print(span.get_line(), str(span), message) - self.nb_warnings += 1 - - def emit_error(self, span, message): - print(span.get_line(), str(span), message) - self.nb_errors += 1 diff --git a/test/banana/typeck/__init__.py b/test/banana/typeck/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/banana/typeck/should_fail/comp_var_cant_be_shadowed.banana b/test/banana/typeck/should_fail/comp_var_cant_be_shadowed.banana deleted file mode 100644 index 610c34e..0000000 --- a/test/banana/typeck/should_fail/comp_var_cant_be_shadowed.banana +++ /dev/null @@ -1,3 +0,0 @@ -c = IptablesIngestor() -c = 23 -# RAISE BananaShadowingComponentError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/component_cant_be_in_object.banana b/test/banana/typeck/should_fail/component_cant_be_in_object.banana deleted file mode 100644 index fb8fcb1..0000000 --- a/test/banana/typeck/should_fail/component_cant_be_in_object.banana +++ /dev/null @@ -1,4 +0,0 @@ -c = IptablesIngestor() -a = { b: c } -# TODO(Joan): rename Comp to Components -# RAISE BananaAssignCompError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/component_unkown_param_in_arg.banana b/test/banana/typeck/should_fail/component_unkown_param_in_arg.banana deleted file mode 100644 index 8ed0288..0000000 --- a/test/banana/typeck/should_fail/component_unkown_param_in_arg.banana +++ /dev/null @@ -1,2 +0,0 @@ -a = IPTablesSource(sleep=0.01, test="foobar") -# RAISE BananaComponentTooManyParams \ No newline at end of file diff --git a/test/banana/typeck/should_fail/component_unkown_param_in_stmt.banana b/test/banana/typeck/should_fail/component_unkown_param_in_stmt.banana deleted file mode 100644 index 939ad99..0000000 --- a/test/banana/typeck/should_fail/component_unkown_param_in_stmt.banana +++ /dev/null @@ -1,9 +0,0 @@ -a = IPTablesSource(sleep=0.01) -a.test = "foobar" - -# NEW_TEST - -a = CloudMarkovChainSource() -a.transitions.web_servic = {} - -# RAISE BananaPropertyDoesNotExists \ No newline at end of file diff --git a/test/banana/typeck/should_fail/impossible_connection.banana b/test/banana/typeck/should_fail/impossible_connection.banana deleted file mode 100644 index 218018e..0000000 --- a/test/banana/typeck/should_fail/impossible_connection.banana +++ /dev/null @@ -1,5 +0,0 @@ -a -> b - -a = IPTablesSource(sleep=0.01) -b = IPTablesSource(sleep=0.01) -# RAISE BananaConnectionError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/incompatible_json_props_types.banana b/test/banana/typeck/should_fail/incompatible_json_props_types.banana deleted file mode 100644 index 7e97243..0000000 --- a/test/banana/typeck/should_fail/incompatible_json_props_types.banana +++ /dev/null @@ -1,8 +0,0 @@ -# Incompatible type between string and object required by "a.b" -a = { a: "test", a.b: 23 } - -# NEW_TEST - -a = { "a"."b": "test", a.b.c: 23 } - -# RAISE BananaTypeError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/invalid_str_concat.banana b/test/banana/typeck/should_fail/invalid_str_concat.banana deleted file mode 100644 index 352f8ef..0000000 --- a/test/banana/typeck/should_fail/invalid_str_concat.banana +++ /dev/null @@ -1,14 +0,0 @@ -a = "test" -a = a - a - -# NEW_TEST - -a = "test" -a = a * a - -# NEW_TEST - -a = "test" -a = a / a - -# RAISE BananaUnknownOperator \ No newline at end of file diff --git a/test/banana/typeck/should_fail/type_has_no_nested_properties.banana b/test/banana/typeck/should_fail/type_has_no_nested_properties.banana deleted file mode 100644 index 835dd5f..0000000 --- a/test/banana/typeck/should_fail/type_has_no_nested_properties.banana +++ /dev/null @@ -1,9 +0,0 @@ -a = IPTablesSource(sleep=0.01) -b = a.sleep.test - -# NEW_TEST -a = CloudMarkovChainSource() -# Typo: runs -> run -b = a.transitions.web_service."runs=>slow" - -# RAISE BananaPropertyDoesNotExists \ No newline at end of file diff --git a/test/banana/typeck/should_fail/type_is_not_a_subtype.banana b/test/banana/typeck/should_fail/type_is_not_a_subtype.banana deleted file mode 100644 index cccb3de..0000000 --- a/test/banana/typeck/should_fail/type_is_not_a_subtype.banana +++ /dev/null @@ -1,18 +0,0 @@ -a = RandomSource() -a.model = { - params: { - "origin_types": {} - }, - extra_param: 42 -} - -# NEW_TEST - -a = RandomSource(model = { - params: { - "origin_types": {} - }, - extra_param: 42 -}) - -# RAISE BananaArgumentTypeError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/wrong_param_type.banana b/test/banana/typeck/should_fail/wrong_param_type.banana deleted file mode 100644 index 63fd975..0000000 --- a/test/banana/typeck/should_fail/wrong_param_type.banana +++ /dev/null @@ -1,7 +0,0 @@ -a = IPTablesSource(sleep="foobar") - -# NEW_TEST - -a = IPTablesSource(sleep={}) - -# RAISE BananaArgumentTypeError \ No newline at end of file diff --git a/test/banana/typeck/should_fail/wrong_parameter_name_throw.banana b/test/banana/typeck/should_fail/wrong_parameter_name_throw.banana deleted file mode 100644 index b58752b..0000000 --- a/test/banana/typeck/should_fail/wrong_parameter_name_throw.banana +++ /dev/null @@ -1,9 +0,0 @@ -# slep instead of sleep -a = IPTablesSource(slep=0.01) - -# NEW_TEST - -# priod instead of period -a = MonascaDerivativeLDP(priod=0.01) - -# RAISE BananaComponentIncorrectParamName \ No newline at end of file diff --git a/test/banana/typeck/should_pass/compatible_json_props_types.banana b/test/banana/typeck/should_pass/compatible_json_props_types.banana deleted file mode 100644 index cfb9fd0..0000000 --- a/test/banana/typeck/should_pass/compatible_json_props_types.banana +++ /dev/null @@ -1,3 +0,0 @@ -a = { a.b: "test", a.c: "test" } - -# TYPE_TABLE_EQ {Ident< a >: TypeObject < {a: TypeObject < {b: TypeString, c: TypeString} >} >} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/component_param_has_a_type.banana b/test/banana/typeck/should_pass/component_param_has_a_type.banana deleted file mode 100644 index cb87f0c..0000000 --- a/test/banana/typeck/should_pass/component_param_has_a_type.banana +++ /dev/null @@ -1,3 +0,0 @@ -a = IPTablesSource(sleep=0.01) -b = a.sleep -# TYPE_TABLE_EQ {Ident< a >: IPTablesSource(sleep=TypeNumber), Ident< b >: TypeNumber} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/expression_shenanigan.banana b/test/banana/typeck/should_pass/expression_shenanigan.banana deleted file mode 100644 index 7cd8eb0..0000000 --- a/test/banana/typeck/should_pass/expression_shenanigan.banana +++ /dev/null @@ -1,19 +0,0 @@ -a = 12 * 13 + 1 - -# NEW_TEST - -a = 1 + 12 * 13 - -# NEW_TEST - -a = ((12 * 13) + 1) - -# NEW_TEST - -a = (1 + 3) * 3 - -# NEW_TEST - -a = 4 -5 + 22 - 22 - -# TYPE_TABLE_EQ {Ident< a >: TypeNumber} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/monasca_combine.banana b/test/banana/typeck/should_pass/monasca_combine.banana deleted file mode 100644 index d713dca..0000000 --- a/test/banana/typeck/should_pass/monasca_combine.banana +++ /dev/null @@ -1,22 +0,0 @@ -# Checking that parameters are working as expected - -a = MonascaCombineLDP() -a.metric = "cpu.logical_cores_actives" -a.lambda = "a * b - b - a + c" -a.bindings = { - a: "cpu.idle_perc", - b: "cpu.total_logical_cores", - c: "some_val" -} - -# NEW_TEST - -# Same test as above - -a = MonascaCombineLDP( - metric = "cpu.logical_cores_actives", - lambda = "a * b", - bindings = {a:"cpu.idle_perc", b:"cpu.total_logical_cores", c:"some_val"} -) - -# TYPE_TABLE_EQ {Ident< a >: MonascaCombineLDP(metric=TypeString,period=TypeNumber,lambda=TypeString,bindings=TypeAny)} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/nested_value_in_component_params.banana b/test/banana/typeck/should_pass/nested_value_in_component_params.banana deleted file mode 100644 index 48331bc..0000000 --- a/test/banana/typeck/should_pass/nested_value_in_component_params.banana +++ /dev/null @@ -1,9 +0,0 @@ -a = CloudMarkovChainSource() -b = a.transitions.web_service - -# NEW_TEST - -a = CloudMarkovChainSource() -b = a."transitions"."web_service" - -# TYPE_TABLE_EQ {Ident< a >: CloudMarkovChainSource(sleep=TypeNumber,min_event_per_burst=TypeNumber,transitions=TypeStruct < {host: TypeStruct < {off=>on: TypeNumber, on=>off: TypeNumber} >, switch: TypeStruct < {off=>on: TypeNumber, on=>off: TypeNumber} >, web_service: TypeStruct < {run=>slow: TypeAny, slow=>run: TypeAny, stop=>run: TypeAny} >} >,triggers=TypeStruct < {support: TypeStruct < {get_called: TypeAny} >} >,graph=TypeAny), Ident< b >: TypeStruct < {run=>slow: TypeAny, slow=>run: TypeAny, stop=>run: TypeAny} >} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/number_can_be_shadowed_by_object.banana b/test/banana/typeck/should_pass/number_can_be_shadowed_by_object.banana deleted file mode 100644 index 3d78957..0000000 --- a/test/banana/typeck/should_pass/number_can_be_shadowed_by_object.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = {a: "test"} -a = 23 - -# TYPE_TABLE_EQ {Ident< a >: TypeNumber} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/object_can_be_shadowed_by_number.banana b/test/banana/typeck/should_pass/object_can_be_shadowed_by_number.banana deleted file mode 100644 index 6d478c4..0000000 --- a/test/banana/typeck/should_pass/object_can_be_shadowed_by_number.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = 23 -a = {} - -# TYPE_TABLE_EQ {Ident< a >: TypeObject < {} >} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/simple_connection.banana b/test/banana/typeck/should_pass/simple_connection.banana deleted file mode 100644 index bb96895..0000000 --- a/test/banana/typeck/should_pass/simple_connection.banana +++ /dev/null @@ -1,7 +0,0 @@ -# Simple connection -a -> b - -a = IPTablesSource(sleep=0.01) -b = IptablesIngestor() - -# TYPE_TABLE_EQ {Ident< a >: IPTablesSource(sleep=TypeNumber), Ident< b >: IptablesIngestor()} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/simple_literal.banana b/test/banana/typeck/should_pass/simple_literal.banana deleted file mode 100644 index bfe87a2..0000000 --- a/test/banana/typeck/should_pass/simple_literal.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = "test" -b = 213 -c = {} -# TYPE_TABLE_EQ {Ident< a >: TypeString, Ident< b >: TypeNumber, Ident< c >: TypeObject < {} >} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/type_is_a_subtype.banana b/test/banana/typeck/should_pass/type_is_a_subtype.banana deleted file mode 100644 index 3ae970c..0000000 --- a/test/banana/typeck/should_pass/type_is_a_subtype.banana +++ /dev/null @@ -1,20 +0,0 @@ -a = RandomSource() -a.model = { - name: "test", - params: { - "origin_types": {} - }, - extra_param: 42 -} - -# NEW_TEST - -a = RandomSource(model = { - name: "test", - params: { - "origin_types": {} - }, - extra_param: 42 -}) - -# TYPE_TABLE_EQ {Ident< a >: RandomSource(host=TypeString,port=TypeNumber,model=TypeStruct < {name: TypeString, params: TypeStruct < {origin_types: TypeObject < {} >} >} >,alert_per_burst=TypeNumber,idle_time_between_bursts=TypeNumber)} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/valid_str_concat.banana b/test/banana/typeck/should_pass/valid_str_concat.banana deleted file mode 100644 index fb6799c..0000000 --- a/test/banana/typeck/should_pass/valid_str_concat.banana +++ /dev/null @@ -1,4 +0,0 @@ -a = "test" -a = a + a - -# TYPE_TABLE_EQ {Ident< a >: TypeString} \ No newline at end of file diff --git a/test/banana/typeck/should_pass/various_object_use_case.banana b/test/banana/typeck/should_pass/various_object_use_case.banana deleted file mode 100644 index 3bea1bc..0000000 --- a/test/banana/typeck/should_pass/various_object_use_case.banana +++ /dev/null @@ -1,7 +0,0 @@ -a = {} -b = {a: a} -c.d.e = {} -a.test = 12 -e = a -a.test = "test" -# TYPE_TABLE_EQ {Ident< a >: TypeObject < {test: TypeString} >, Ident< b >: TypeObject < {a: TypeObject < {test: TypeString} >} >, Ident< c >: TypeObject < {d: TypeObject < {e: TypeObject < {} >} >} >, Ident< e >: TypeObject < {test: TypeString} >} \ No newline at end of file diff --git a/test/banana/typeck/test_typeck_config.py b/test/banana/typeck/test_typeck_config.py deleted file mode 100644 index f7551d3..0000000 --- a/test/banana/typeck/test_typeck_config.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os -import re - -import monasca_analytics.banana.pass_manager as p -import monasca_analytics.exception.banana as exception -from test.util_for_testing import MonanasTestCase - - -logger = logging.getLogger(__name__) - -_has_some_file_that_should = dict() -_has_some_file_that_should["pass"] = False -_has_some_file_that_should["fail"] = False - - -class TypecheckTestCase(MonanasTestCase): - - def setUp(self): - super(TypecheckTestCase, self).setUp() - - def tearDown(self): - super(TypecheckTestCase, self).tearDown() - - def test_files_have_been_found(self): - self.assertTrue(_has_some_file_that_should["pass"]) - self.assertTrue(_has_some_file_that_should["fail"]) - - -def upgrade_test_case(): - regex_pass = re.compile("#(?: )*TYPE_TABLE_EQ(?: )*([^\n]+)") - regex_fail = re.compile("#(?: )*RAISE(?: )*([^\n]+)") - regex_split = re.compile("#(?: )*NEW_TEST(?:[^\n]*)\n") - - for root, dirs, files in os.walk('./banana/typeck/should_pass'): - for filename in files: - name_no_ext, _ = os.path.splitext(filename) - _has_some_file_that_should["pass"] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - expect_type_table = regex_pass.search(content) - if expect_type_table is not None: - expect_type_table = expect_type_table.group(1) - - def create_test(test_str, expected_type_table): - def should_pass(self): - type_table = p.compute_type_table(test_str) - if expected_type_table is not None: - self.assertEqual(str(type_table), - expected_type_table) - else: - raise Exception( - "Missing # TYPE_TABLE_EQ <...> in test." - ) - - should_pass.__name__ = "test_banana_pass_" + name_no_ext - return should_pass - - many_tests = regex_split.split(content) - if len(many_tests) == 1: - setattr(TypecheckTestCase, - "test_banana_pass_" + name_no_ext, - create_test(many_tests[0], expect_type_table)) - else: - suffix = 0 - for test_case in many_tests: - suffix += 1 - setattr(TypecheckTestCase, - "test_banana_pass_" + name_no_ext + - str(suffix), - create_test(test_case, expect_type_table)) - - for root, dirs, files in os.walk('./banana/typeck/should_fail'): - for filename in files: - name_no_ext, _ = os.path.splitext(filename) - _has_some_file_that_should["fail"] = True - with open(os.path.join(root, filename), 'r') as f: - content = f.read() - expect_error = regex_fail.search(content) - if expect_error is not None: - expect_error = expect_error.group(1) - - def create_test(s, test_str, expected_error): - def should_fail(self): - if expected_error is not None: - expected_exception = get_exception_from_str( - expected_error) - self.assertRaises( - expected_exception, - p.compute_type_table, - test_str) - else: - raise Exception("Missing # RAISE in test") - should_fail.__name__ = "test_banana_fail_" + name_no_ext +\ - str(s) - return should_fail - - many_tests = regex_split.split(content) - if len(many_tests) == 1: - setattr(TypecheckTestCase, - "test_banana_fail_" + name_no_ext, - create_test("", many_tests[0], expect_error)) - else: - suffix = 0 - for test_case in many_tests: - suffix += 1 - setattr(TypecheckTestCase, - "test_banana_fail_" + name_no_ext + - str(suffix), - create_test(suffix, test_case, expect_error)) - -# Fill the test case with generated test case from banana files -upgrade_test_case() - - -def get_exception_from_str(string): - if string == exception.BananaAssignCompError.__name__: - return exception.BananaAssignCompError - if string == exception.BananaConnectionError.__name__: - return exception.BananaConnectionError - if string == exception.BananaAssignmentError.__name__: - return exception.BananaAssignmentError - if string == exception.BananaTypeError.__name__: - return exception.BananaTypeError - if string == exception.BananaArgumentTypeError.__name__: - return exception.BananaArgumentTypeError - if string == exception.BananaUnknown.__name__: - return exception.BananaUnknown - if string == exception.BananaPropertyDoesNotExists.__name__: - return exception.BananaPropertyDoesNotExists - if string == exception.BananaComponentIncorrectParamName.__name__: - return exception.BananaComponentIncorrectParamName - if string == exception.BananaComponentTooManyParams.__name__: - return exception.BananaComponentTooManyParams - if string == exception.BananaShadowingComponentError.__name__: - return exception.BananaShadowingComponentError - if string == exception.BananaUnknownOperator.__name__: - return exception.BananaUnknownOperator - raise Exception("Invalid exception name: '{}'".format(string)) diff --git a/test/cli/__init__.py b/test/cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/cli/test_dsl.py b/test/cli/test_dsl.py deleted file mode 100644 index dfc6ae9..0000000 --- a/test/cli/test_dsl.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import json -import logging.config -import os -import unittest - -from monasca_analytics.banana.cli.dsl import MonanasDSL -from monasca_analytics.config import const -from monasca_analytics.exception import dsl as dsl_err -from monasca_analytics.exception import monanas as mon_err - - -class TestMonanasDSL(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def get_test_config_file_path(self): - current_dir = os.path.dirname(__file__) - return os.path.join(current_dir, "../resources/test_json.json") - - def setUp(self): - self.setup_logging() - config_file_path = self.get_test_config_file_path() - self.dsl = MonanasDSL(config_file_path) - self.original_config = copy.deepcopy(self.dsl._config) - self.testing_new_source_config = { - "module": "KafkaSource", - "params": { - "zk_host": "myHost", - "zk_port": 1234, - "group_id": "myGroupId", - "topics": { - "myTopic1": 1, - "myTopic2": 2 - } - } - } - self.tmp_file = "tmp_config_file.json" - - def tearDown(self): - if os.path.exists(self.tmp_file): - os.remove(self.tmp_file) - - def test_generate_id(self): - self.assertEqual("src4", self.dsl._generate_id(const.SOURCES)) - self.assertEqual("ing2", self.dsl._generate_id(const.INGESTORS)) - self.assertEqual("sml2", self.dsl._generate_id(const.SMLS)) - self.assertEqual("vot2", self.dsl._generate_id(const.VOTERS)) - self.assertEqual("snk3", self.dsl._generate_id(const.SINKS)) - self.assertEqual("ldp2", self.dsl._generate_id(const.LDPS)) - self.assertEqual("src5", self.dsl._generate_id(const.SOURCES)) - self.assertEqual("ing3", self.dsl._generate_id(const.INGESTORS)) - self.assertEqual("sml3", self.dsl._generate_id(const.SMLS)) - self.assertEqual("vot3", self.dsl._generate_id(const.VOTERS)) - self.assertEqual("snk4", self.dsl._generate_id(const.SINKS)) - self.assertEqual("ldp3", self.dsl._generate_id(const.LDPS)) - self.assertEqual(self.original_config, self.dsl._config) - - def test_generate_id_wrong_type(self): - self.assertRaises(KeyError, self.dsl._generate_id, "wrong_type") - - def test_is_connected(self): - self.assertTrue(self.dsl._is_connected("src1")) - self.assertFalse(self.dsl._is_connected("src2")) - self.assertTrue(self.dsl._is_connected("ing1")) - self.assertTrue(self.dsl._is_connected("sml1")) - self.assertTrue(self.dsl._is_connected("vot1")) - self.assertTrue(self.dsl._is_connected("snk1")) - self.assertTrue(self.dsl._is_connected("snk2")) - self.assertTrue(self.dsl._is_connected("ldp1")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_component_defined(self): - self.assertTrue(self.dsl._component_defined("src1")) - self.assertFalse(self.dsl._component_defined("fake_id")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_validate_connection_by_ids(self): - self.assertTrue(self.dsl._validate_connection_by_ids("src1", "ing1")) - self.assertTrue(self.dsl._validate_connection_by_ids("src1", "ldp1")) - self.assertFalse(self.dsl._validate_connection_by_ids("src2", "sml1")) - self.assertFalse(self.dsl._validate_connection_by_ids("ing1", "vot1")) - self.assertTrue(self.dsl._validate_connection_by_ids("ldp1", "snk1")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_add_component(self): - new_id = self.dsl.add_component(self.testing_new_source_config) - self.assertEqual("src4", new_id) - expected_config = self.original_config - expected_config[const.SOURCES]["src4"] = self.testing_new_source_config - expected_config[const.CONNECTIONS]["src4"] = [] - self.assertEqual(expected_config, self.dsl._config) - - def test_add_component_string(self): - conf_str = json.dumps(self.testing_new_source_config) - new_id = self.dsl.add_component(conf_str) - self.assertEqual("src4", new_id) - expected_config = self.original_config - expected_config[const.SOURCES]["src4"] = self.testing_new_source_config - expected_config[const.CONNECTIONS]["src4"] = [] - self.assertEqual(expected_config, self.dsl._config) - - def test_add_component_wrong_module(self): - self.testing_new_source_config["module"] = "fake_module" - self.assertRaises(mon_err.MonanasNoSuchClassError, - self.dsl.add_component, - self.testing_new_source_config) - self.assertEqual(self.original_config, self.dsl._config) - - def test_modify_component(self): - self.assertTrue(self.dsl.modify_component( - "src3", ["sleep"], 0.02)) - expected_config = self.original_config - expected_config[const.SOURCES]["src3"]["sleep"] = 0.02 - self.assertEqual(expected_config, self.dsl._config) - - def test_modify_component_inexistent(self): - self.assertFalse(self.dsl.modify_component( - "src8", ["params", "server_sleep_in_seconds"], 0.02)) - self.assertEqual(self.original_config, self.dsl._config) - - def test_modify_component_to_invalid_config(self): - self.assertFalse(self.dsl.modify_component( - "src3", ["fake", "fake_param"], 123)) - self.assertEqual(self.original_config, self.dsl._config) - - def test_modify_dictionary_new_path(self): - original = self.original_config["voters"]["vot1"] - modified = self.dsl._modify_dictionary( - original, ["params", "param1", "subparam1A"], "new_value") - expected = { - "module": "voter_module", - "params": { - "param1": { - "subparam1A": "new_value" - } - } - } - self.assertEqual(expected, modified) - - def test_modify_dictioinary_overwrite_value(self): - original = self.original_config["sources"]["src1"] - modified = self.dsl._modify_dictionary( - original, ["params", "param1"], "new_value") - expected = { - "module": "src_module1", - "params": { - "param1": "new_value", - "param2": "val2", - "model_id": 3 - } - } - self.assertEqual(expected, modified) - - def test_modify_dictionary_overwrite_path(self): - original = self.original_config["sources"]["src1"] - modified = self.dsl._modify_dictionary( - original, ["params"], "new_value") - expected = { - "module": "src_module1", - "params": "new_value" - } - self.assertEqual(expected, modified) - - def test_remove_unconnected_component(self): - self.assertTrue(self.dsl.remove_component("src2")) - expected_config = self.original_config - del(expected_config[const.SOURCES]["src2"]) - del(expected_config[const.CONNECTIONS]["src2"]) - self.assertEqual(expected_config, self.dsl._config) - - def test_remove_connected_component(self): - self.assertRaises(dsl_err.DSLExistingConnection, - self.dsl.remove_component, "src1") - self.assertEqual(self.original_config, self.dsl._config) - - def test_remove_component_wrong_id(self): - self.assertFalse(self.dsl.remove_component("fake_id")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_connect_component_new_allowed(self): - self.assertTrue(self.dsl.connect_components("src2", "ing1")) - expected_config = self.original_config - expected_config[const.CONNECTIONS]["src2"].append("ing1") - self.assertEqual(self.original_config, self.dsl._config) - - def test_connect_existing(self): - self.assertFalse(self.dsl.connect_components("src1", "ing1")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_connect_component_new_forbidden(self): - self.assertRaises(dsl_err.DSLInvalidConnection, - self.dsl.connect_components, "src1", "vot1") - self.assertEqual(self.original_config, self.dsl._config) - - def test_disconnect(self): - self.assertTrue(self.dsl.disconnect_components("src1", "ing1")) - expected_config = self.original_config - expected_config[const.CONNECTIONS]["src1"] = ["ldp1"] - self.assertEqual(self.original_config, self.dsl._config) - - def test_disconnect_inexistent_components(self): - self.assertFalse(self.dsl.disconnect_components("fake_1", "fake_2")) - self.assertFalse(self.dsl.disconnect_components("fake_id", "snk1")) - self.assertFalse(self.dsl.disconnect_components("src1", "fake_id")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_disconnect_inexistent_connection(self): - self.assertFalse(self.dsl.disconnect_components("src2", "ing1")) - self.assertEqual(self.original_config, self.dsl._config) - - def test_save_configuration_overwrite_no_file(self): - self.assertTrue( - self.dsl.save_configuration(self.tmp_file, overwrite_file=True)) - self.dsl._config = None - self.dsl.load_configuration(self.tmp_file) - self.assertEqual(self.original_config, self.dsl._config) - - def test_save_configuration_not_overwrite_no_file(self): - self.assertTrue( - self.dsl.save_configuration(self.tmp_file, overwrite_file=False)) - self.dsl._config = None - self.dsl.load_configuration(self.tmp_file) - self.assertEqual(self.original_config, self.dsl._config) - - def _create_dirty_fyle(self, fname): - with open(fname, "w") as f: - f.write("This content may be overwritten") - - def test_save_configuration_overwrite_file(self): - self._create_dirty_fyle(self.tmp_file) - self.assertTrue( - self.dsl.save_configuration(self.tmp_file, overwrite_file=True)) - self.dsl._config = None - self.dsl.load_configuration("tmp_config_file.json") - self.assertEqual(self.original_config, self.dsl._config) - - def test_save_configuration_not_overwrite_file(self): - self._create_dirty_fyle(self.tmp_file) - old_size = os.stat(self.tmp_file).st_size - self.assertFalse( - self.dsl.save_configuration(self.tmp_file, overwrite_file=False)) - self.assertEqual(old_size, os.stat(self.tmp_file).st_size) diff --git a/test/cli/test_interpreter.py b/test/cli/test_interpreter.py deleted file mode 100644 index 9cc9808..0000000 --- a/test/cli/test_interpreter.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import json -import logging.config -import os -import unittest - -from monasca_analytics.banana.cli import interpreter -from monasca_analytics.config import const -from monasca_analytics.exception import dsl as dsl_err -from monasca_analytics.exception import monanas as mon_err -from monasca_analytics.source import iptables_markov_chain as ipt_src -from monasca_analytics.source import kafka - - -class TestDSLInterpreter(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - current_dir = os.path.dirname(__file__) - self.dsl_file_path = os.path.join(current_dir, - "../resources/dsl_code.txt") - self.test_config_path = os.path.join(current_dir, - "../resources/test_json.json") - self.tmp_save_file = "my_config.json" - self.setup_logging() - self.inter = interpreter.DSLInterpreter() - - def tearDown(self): - if os.path.exists(self.tmp_save_file): - os.remove(self.tmp_save_file) - - def test_cmd_create(self): - comp_id = self.inter.execute_string("A = IPTablesSource") - self.assertEqual("src1", comp_id) - self.assertEqual({"A": "src1"}, self.inter.mappings) - self.assertEqual(ipt_src.IPTablesSource.get_default_config(), - self.inter.dsl._config[const.SOURCES]["src1"]) - - def test_cmd_create_inexistent(self): - self.assertRaises(mon_err.MonanasNoSuchClassError, - self.inter.execute_string, - "A = fakeModule") - - def test_cmd_connect(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("B = IptablesIngestor") - self.assertTrue(self.inter.execute_string("A -> B")) - self.assertListEqual(["ing1"], - self.inter.dsl._config[const.CONNECTIONS]["src1"]) - - def test_cmd_connect_connected(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("B = IptablesIngestor") - self.inter.execute_string("A -> B") - self.assertFalse(self.inter.execute_string("A -> B")) - self.assertListEqual(["ing1"], - self.inter.dsl._config[const.CONNECTIONS]["src1"]) - - def test_cmd_connect_inexistent(self): - self.assertRaises(dsl_err.DSLInterpreterException, - self.inter.execute_string, "A -> B") - - def test_cmd_connect_forbidden(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("B = PickIndexVoter") - self.assertRaises(dsl_err.DSLInvalidConnection, - self.inter.execute_string, "A -> B") - - def test_cmd_disconnect(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("B = IptablesIngestor") - self.inter.execute_string("A -> B") - self.assertTrue(self.inter.execute_string("A !-> B")) - self.assertListEqual([], - self.inter.dsl._config[const.CONNECTIONS]["src1"]) - - def test_cmd_load(self): - self.inter.execute_string("load(" + self.test_config_path + ")") - with open(self.test_config_path) as f: - expected_config = json.loads(f.read()) - self.assertEqual(expected_config, self.inter.dsl._config) - - def test_cmd_save(self): - self.inter.execute_string("save(" + self.tmp_save_file + ")") - self.inter.execute_string("load(" + self.tmp_save_file + ")") - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("save()") - expected = const.get_default_base_config() - expected[const.SOURCES]["src1"] = ipt_src.IPTablesSource.\ - get_default_config() - expected[const.CONNECTIONS]["src1"] = [] - with open(self.tmp_save_file) as f: - saved_config = json.loads(f.read()) - self.assertEqual(expected, saved_config) - pass - - def test_cmd_save_as(self): - self.inter.execute_string("save(" + self.tmp_save_file + ")") - with open(self.tmp_save_file) as f: - saved_config = json.loads(f.read()) - self.assertEqual(const.get_default_base_config(), saved_config) - - def test_cmd_remove(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("rm(A)") - self.assertEqual({}, self.inter.dsl._config[const.SOURCES]) - - def test_cmd_remove_inexistent(self): - self.assertRaises(dsl_err.DSLInterpreterException, - self.inter.execute_string, "rm(A)") - - def test_cmd_remove_connected(self): - self.inter.execute_string("A = IPTablesSource") - self.inter.execute_string("B = IptablesIngestor") - self.inter.execute_string("A -> B") - self.assertRaises(dsl_err.DSLExistingConnection, - self.inter.execute_string, "rm(A)") - - def test_cmd_modify_to_valid_float(self): - self.inter.execute_string("A = IPTablesSource") - self.assertTrue(self.inter.execute_string( - "A.sleep = 0.02")) - self.assertEqual({ - "module": "IPTablesSource", - "sleep": 0.02 - }, self.inter.dsl._config[const.SOURCES]["src1"]) - - def test_cmd_modify_to_invalid_float(self): - self.inter.execute_string("A = IPTablesSource") - self.assertFalse(self.inter.execute_string( - "A.sleep = 1.2")) - - def test_cmd_modify_int(self): - self.inter.execute_string("A = KafkaSource") - self.assertTrue(self.inter.execute_string( - "A.params.zk_port = 1234")) - expected = copy.deepcopy(kafka.KafkaSource.get_default_config()) - expected["params"]["zk_port"] = 1234 - self.assertEqual(expected, - self.inter.dsl._config[const.SOURCES]["src1"]) - - def test_cmd_modify_str(self): - self.inter.execute_string("A = KafkaSource") - self.assertTrue(self.inter.execute_string( - "A.params.zk_host = my_host")) - expected = copy.deepcopy(kafka.KafkaSource.get_default_config()) - expected["params"]["zk_host"] = "my_host" - self.assertEqual(expected, - self.inter.dsl._config[const.SOURCES]["src1"]) - - def test_get_id_from_name(self): - self.inter.execute_string("A = IPTablesSource") - _id = self.inter._get_id("A") - self.assertEqual("src1", _id) - - def test_get_id_from_id(self): - self.inter.execute_string("A = IPTablesSource") - _id = self.inter._get_id("src1") - self.assertEqual("src1", _id) diff --git a/test/cli/test_parser.py b/test/cli/test_parser.py deleted file mode 100644 index 7460a2e..0000000 --- a/test/cli/test_parser.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging.config -import os -import six -import unittest - -from monasca_analytics.banana.cli import const -from monasca_analytics.banana.cli import parser - - -class TestMonanasDSL(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - current_dir = os.path.dirname(__file__) - self.dsl_file_path = os.path.join(current_dir, - "../resources/dsl_code.txt") - self.setup_logging() - - def tearDown(self): - pass - - def assert_create(self, info, varname, module): - self.assertEqual(varname, info[const.CREATE][0]) - self.assertEqual(module, info[const.CREATE][1]) - - def assert_modify(self, info, varname, params, value): - self.assertEqual(varname, info[const.MODIFY][0]) - self.assertListEqual(info[const.MODIFY][1:-1], params) - self.assertEqual(value, info[const.MODIFY][-1]) - - def assert_connect(self, info, varname1, varname2): - self.assertEqual(varname1, info[const.CONNECT][0]) - self.assertEqual(varname2, info[const.CONNECT][1]) - - def assert_disconnect(self, info, varname1, varname2): - self.assertEqual(varname1, info[const.DISCONNECT][0]) - self.assertEqual(varname2, info[const.DISCONNECT][1]) - - def assert_remove(self, info, varname): - self.assertEqual(varname, info[const.REMOVE][0]) - - def assert_load(self, info, filepaht): - self.assertEqual(filepaht, info[const.LOAD][0]) - - def assert_save(self, info): - self.assertIn(const.SAVE, info) - - def assert_save_as(self, info, filepaht): - self.assertEqual(filepaht, info[const.SAVE_AS][0]) - - def test_parse_create(self): - info = parser.get_parser().parseString("A = my_module") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.CREATE], info[0].keys()) - self.assert_create(info[0], "A", "my_module") - - def test_parse_modify(self): - info = parser.get_parser().parseString("_A1.params.123._inf- = my.val") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.MODIFY], info[0].keys()) - self.assert_modify(info[0], "_A1", ["params", "123", "_inf-"], - "my.val") - - def test_parse_connect(self): - info = parser.get_parser().parseString("_A1->B") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.CONNECT], info[0].keys()) - self.assert_connect(info[0], "_A1", "B") - - def test_parse_disconnect(self): - info = parser.get_parser().parseString("_A1!->B") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.DISCONNECT], info[0].keys()) - self.assert_disconnect(info[0], "_A1", "B") - - def test_parse_remove(self): - info = parser.get_parser().parseString("rM(A)") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.REMOVE], info[0].keys()) - self.assert_remove(info[0], "A") - - def test_parse_load(self): - info = parser.get_parser().parseString("LoAd(_some/path/123.json)") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.LOAD], info[0].keys()) - self.assert_load(info[0], "_some/path/123.json") - - def test_parse_save(self): - info = parser.get_parser().parseString("sAVe()") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.SAVE], info[0].keys()) - self.assert_save(info[0]) - - def test_parse_save_as(self): - info = parser.get_parser().parseString("sAVE(/root/0/path_/f.conf)") - self.assertEqual(1, len(info)) - six.assertCountEqual(self, [const.SAVE_AS], info[0].keys()) - self.assert_save_as(info[0], "/root/0/path_/f.conf") - - def test_parse_multiline(self): - info = parser.get_parser().parseString( - "load(_path/conf.json)\n\nA=MySource1\nA->ing1") - self.assertEqual(3, len(info)) - self.assert_load(info[0], "_path/conf.json") - self.assert_create(info[1], "A", "MySource1") - self.assert_connect(info[2], "A", "ing1") - - def test_parse_comments(self): - info = parser.get_parser().parseString( - "load(_path/conf.json)\n#Comment1\nA=MySource1#Comment2\nA->ing1") - self.assertEqual(3, len(info)) - self.assert_load(info[0], "_path/conf.json") - self.assert_create(info[1], "A", "MySource1") - self.assert_connect(info[2], "A", "ing1") - - def test_parse_file(self): - info = parser.get_parser().parseFile(self.dsl_file_path) - self.assertEqual(13, len(info)) - self.assert_create(info[0], "A", "CloudMarkovChainSource") - self.assert_modify(info[1], "A", ["params", "server_sleep_in_seconds"], - "0.1") - self.assert_create(info[2], "B", "CloudIngestor") - self.assert_create(info[3], "C", "LiNGAM") - self.assert_modify(info[4], "C", ["params", "threshold"], "0.1") - self.assert_create(info[5], "D", "PickIndexVoter") - self.assert_create(info[6], "E", "KafkaSink") - self.assert_create(info[7], "F", "CloudCausalityLDP") - self.assert_connect(info[8], "A", "B") - self.assert_connect(info[9], "A", "F") - self.assert_connect(info[10], "C", "D") - self.assert_connect(info[11], "D", "F") - self.assert_connect(info[12], "F", "E") diff --git a/test/config/__init__.py b/test/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/config/test_create_components.py b/test/config/test_create_components.py deleted file mode 100644 index 2f092f4..0000000 --- a/test/config/test_create_components.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os - -from monasca_analytics.config import const -from monasca_analytics.config import creation -from monasca_analytics.exception import monanas as err -import monasca_analytics.util.common_util as cu -from test.mocks import sml_mocks -from test.util_for_testing import MonanasTestCase - - -class CreateComponentsTest(MonanasTestCase): - - def setUp(self): - """ - Keep a copy of the original functions that will be mocked, then - mock them, reset variables, and initialize ML_Framework. - """ - super(CreateComponentsTest, self).setUp() - self._backup_functions() - self._mock_functions() - sml_mocks.sml_mocks.reset() - self.init_sml_config() - - def tearDown(self): - """ - Restore the potentially mocked functions to the original ones - """ - super(CreateComponentsTest, self).tearDown() - self._restore_functions() - - def _backup_functions(self): - self.original_get_class_by_name = cu.get_class_by_name - - def _restore_functions(self): - cu.get_class_by_name = self.original_get_class_by_name - - def _mock_functions(self): - cu.get_class_by_name = sml_mocks.mock_get_class_by_name - - def init_sml_config(self): - """ - Initialize the ML_Framework object with the test_json config - """ - current_dir = os.path.dirname(__file__) - test_json_file = os.path.join(current_dir, - "../resources/test_json.json") - self._config = cu.parse_json_file(test_json_file) - - def test_create_component_by_module(self): - sml_mocks.sml_mocks.reset() - component_id = "ing1" - component_config = {"module": "ingestor_module", "sink_id": 1} - creation._create_component_by_module(component_id, component_config, - "ingestors") - self.assert_only_instantiated("ingestor_module") - - def test_create_component_by_module_inexistent_module(self): - sml_mocks.sml_mocks.reset() - component_id = "inex1" - component_config = {"module": "inexistent_module"} - self.assertRaises( - err.MonanasNoSuchClassError, - creation._create_component_by_module, - component_id, component_config, "ingestors") - self.assert_instantiated_no_classes() - - def test_create_components_by_module(self): - sml_mocks.sml_mocks.reset() - creation._create_comps_by_module(const.LDPS, self._config) - self.assert_only_instantiated("ldp_module1") - - def test_create_components_by_module_inexistent1(self): - sml_mocks.sml_mocks.reset() - self._config["voter"] = {"inex1": {"module": "inexistent_voter"}} - self.assertRaises(err.MonanasNoSuchClassError, - creation._create_comps_by_module, - "voter", self._config) - self.assert_instantiated_no_classes() - - def test_create_components_by_module_inexistent2(self): - sml_mocks.sml_mocks.reset() - self._config["ingestors"] = { - "inex2": {"module": "inexistent_ingestor", "param": {}} - } - self.assertRaises(err.MonanasNoSuchClassError, - creation._create_comps_by_module, - "ingestors", self._config) - self.assert_instantiated_no_classes() - - def test_create_components_by_module_mixed_existance(self): - sml_mocks.sml_mocks.reset() - self._config[const.INGESTORS]["inex2"] =\ - {"module": "inexistent_ingestor", "params": {}} - self.assertRaises(err.MonanasNoSuchClassError, - creation._create_comps_by_module, - const.INGESTORS, self._config) - - def assert_instantiated_no_classes(self): - for n in sml_mocks.sml_mocks.instantiated.keys(): - self.assertEqual(0, len(sml_mocks.sml_mocks.instantiated[n])) - - def assert_only_instantiated(self, name): - self.assertEqual(1, len(sml_mocks.sml_mocks.instantiated[name])) - for n in sml_mocks.sml_mocks.instantiated.keys(): - if n != name: - self.assertEqual(0, len(sml_mocks.sml_mocks.instantiated[n])) diff --git a/test/ingestor/__init__.py b/test/ingestor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/ingestor/test_base.py b/test/ingestor/test_base.py deleted file mode 100644 index 3a6c742..0000000 --- a/test/ingestor/test_base.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging.config -import os -import unittest - -from test.mocks import ingestors - - -class BaseIngestorTest(unittest.TestCase): - """ - Class that tests the BaseIngestor. It uses the Mock as a - testing target, because it extends the abstract class BaseIngestor, - so the base logic can be tested. - """ - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - self.setup_logging() - self.bi = ingestors.IngestorBasicChild("fake_id", "fake_config") - - def tearDown(self): - pass diff --git a/test/ingestor/test_cloud.py b/test/ingestor/test_cloud.py deleted file mode 100644 index 95f2de9..0000000 --- a/test/ingestor/test_cloud.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging.config -import os -import unittest - -from monasca_analytics.ingestor import cloud - - -class TestIptablesIngestor(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - self.setup_logging() - - def tearDown(self): - pass - - def test_get_default_config(self): - default_config = cloud.CloudIngestor.get_default_config() - cloud.CloudIngestor.validate_config(default_config) - self.assertEqual("CloudIngestor", default_config["module"]) diff --git a/test/ingestor/test_iptables_ingestor.py b/test/ingestor/test_iptables_ingestor.py deleted file mode 100644 index eca290e..0000000 --- a/test/ingestor/test_iptables_ingestor.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging.config -import os -import unittest - -import numpy as np - -from monasca_analytics.ingestor import iptables as ipt_ing -from monasca_analytics.source import iptables_markov_chain as ipt_src - - -class TestIptablesIngestor(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "../resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - self.setup_logging() - self.rdd_entry = [{ - "ctime": "Mon Apr 11 19:59:12 2016", - "event": { - "msg": "OUTPUT -p icmp --icmp-type echo-request -j ACCEPT", - "id": "1" - } - }, { - "ctime": "Mon Apr 11 19:59:12 2016", - "event": { - "msg": "OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT", - "id": "1" - } - }] - self.ip_ing = ipt_ing.IptablesIngestor("fake_id", - {"module": "fake_config"}) - self.ip_ing.set_feature_list(["ssh", "ip", "http", "ping"]) - - def tearDown(self): - pass - - def test_get_default_config(self): - default_config = ipt_ing.IptablesIngestor.get_default_config() - ipt_ing.IptablesIngestor.validate_config(default_config) - self.assertEqual("IptablesIngestor", default_config["module"]) - - def test_process_data(self): - rdd_entry = [] - for iptable in ipt_src.iptables: - rdd_entry.append({ - 'ctime': "Mon Apr 11 19:59:12 2016", - 'event': { - "msg": iptable, - "id": 1 - } - }) - processed = self.ip_ing._process_data(rdd_entry, self.ip_ing._features) - np.testing.assert_array_equal( - processed, np.array([2, 4, 2, 4])) diff --git a/test/ldp/__init__.py b/test/ldp/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/ldp/test_cloud_causality.py b/test/ldp/test_cloud_causality.py deleted file mode 100644 index 7ce8f52..0000000 --- a/test/ldp/test_cloud_causality.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ldp import cloud_causality as cloud -from test.util_for_testing import MonanasTestCase - - -class TestCloudCausalityLDP(MonanasTestCase): - - def setUp(self): - super(TestCloudCausalityLDP, self).setUp() - - def tearDown(self): - super(TestCloudCausalityLDP, self).tearDown() - - def test_get_default_config(self): - default_config = cloud.CloudCausalityLDP.get_default_config() - cloud.CloudCausalityLDP.validate_config(default_config) - self.assertEqual("CloudCausalityLDP", default_config["module"]) diff --git a/test/ldp/test_iptables_ldp.py b/test/ldp/test_iptables_ldp.py deleted file mode 100644 index 7dab201..0000000 --- a/test/ldp/test_iptables_ldp.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ldp import iptables_ldp -from test.mocks import classifier_mock -from test.util_for_testing import MonanasTestCase - - -class TestIptablesLDP(MonanasTestCase): - - def setUp(self): - super(TestIptablesLDP, self).setUp() - self.rdd_entry = [{ - "ctime": "Mon Apr 11 19:59:12 2016", - "event": { - "msg": "OUTPUT -p icmp --icmp-type echo-request -j ACCEPT", - "id": "1" - } - }, { - "ctime": "Mon Apr 11 19:59:12 2016", - "event": { - "msg": "OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT", - "id": "1" - } - }] - self.raw_events = [x["event"] for x in self.rdd_entry] - self.ip_ldp = iptables_ldp.IptablesLDP("fake_id", - {"module": "fake_config"}) - - def tearDown(self): - super(TestIptablesLDP, self).tearDown() - - def assert_anomalous_events(self, events, anomalous=True): - expected_events = self.raw_events - for exv in expected_events: - exv["anomalous"] = anomalous - self.assertEqual(expected_events, events) - - def test_detect_anomalies_no_features(self): - self.clf = classifier_mock.MockClassifier(False) - self.ip_ldp.set_voter_output(self.clf) - ret = self.ip_ldp._detect_anomalies(self.rdd_entry, - self.ip_ldp._data) - self.assertEqual(self.raw_events, ret) - - def test_detect_anomalies_no_classifier(self): - self.clf = classifier_mock.MockClassifier(False) - self.ip_ldp.set_feature_list(["ssh", "ip", "http", "ping"]) - ret = self.ip_ldp._detect_anomalies(self.rdd_entry, - self.ip_ldp._data) - self.assertEqual(self.raw_events, ret) - - def test_detect_anomalies_non_anomalous(self): - self.clf = classifier_mock.MockClassifier(False) - self.ip_ldp.set_feature_list(["ssh", "ip", "http", "ping"]) - self.ip_ldp.set_voter_output(self.clf) - ret = self.ip_ldp._detect_anomalies(self.rdd_entry, - self.ip_ldp._data) - self.assert_anomalous_events(ret, False) - - def test_detect_anomalies_anomalous(self): - self.clf = classifier_mock.MockClassifier(True) - self.ip_ldp.set_feature_list(["ssh", "ip", "http", "ping"]) - self.ip_ldp.set_voter_output(self.clf) - ret = self.ip_ldp._detect_anomalies(self.rdd_entry, - self.ip_ldp._data) - self.assert_anomalous_events(ret, True) diff --git a/test/ldp/test_monasca_aggregator.py b/test/ldp/test_monasca_aggregator.py deleted file mode 100644 index 4712b19..0000000 --- a/test/ldp/test_monasca_aggregator.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ldp.monasca_aggregate import MonascaAggregateLDP -from test.util_for_testing import gen_metric -from test.util_for_testing import MonanasTestCase - - -class TestMonascaAggregateLDP(MonanasTestCase): - - def setUp(self): - super(TestMonascaAggregateLDP, self).setUp() - self.all_metrics = [ - gen_metric("memory", 1.5, 0, "h1"), - gen_metric("memory", 2.0, 1, "h1"), - gen_metric("memory", 1.0, 0, "h2"), - gen_metric("memory", 3.0, 1, "h2"), - ] - - def tearDown(self): - super(TestMonascaAggregateLDP, self).tearDown() - - def _reduce(self, fn, iterable): - # iterable = map(lambda i: {"metric": {"value": i}}, iterable) - cnt = len(iterable) - acc = fn[0](iterable[0], cnt) - for index in range(1, cnt): - acc = fn[1](acc, iterable[index], cnt) - return acc - - def _conf(self, fn_name): - return { - "func": fn_name - } - - def test_reducer_avg(self): - avg_reducer = MonascaAggregateLDP.select_reducer(self._conf("avg")) - self.assertEqual( - self._reduce(avg_reducer, [1.0, 2.0, 3.0, 6.0]), - 3 - ) - - def test_reducer_max(self): - max_reducer = MonascaAggregateLDP.select_reducer(self._conf("max")) - self.assertEqual( - self._reduce(max_reducer, [1, 2, 3, 6]), - 6 - ) - - def test_reducer_min(self): - min_reducer = MonascaAggregateLDP.select_reducer(self._conf("min")) - self.assertEqual( - self._reduce(min_reducer, [1, 2, 3, 6]), - 1 - ) - - def test_reducer_sum(self): - sum_reducer = MonascaAggregateLDP.select_reducer(self._conf("sum")) - self.assertEqual( - self._reduce(sum_reducer, [1, 2, 3, 6]), - 12 - ) - - def test_reducer_cnt(self): - cnt_reducer = MonascaAggregateLDP.select_reducer(self._conf("cnt")) - self.assertEqual( - self._reduce(cnt_reducer, [1, 2, 3, 6]), - 4 - ) - - def test_aggregate_with_avg(self): - reducer = MonascaAggregateLDP.select_reducer(self._conf("avg")) - res = MonascaAggregateLDP.aggregate(self.all_metrics, reducer, "_avg") - res = [m["metric"]["value"] for m in res] - self.assertEqual(res, [1.25, 2.5]) - - def test_aggregate_with_min(self): - reducer = MonascaAggregateLDP.select_reducer(self._conf("min")) - res = MonascaAggregateLDP.aggregate(self.all_metrics, reducer, "_min") - res = [m["metric"]["value"] for m in res] - self.assertEqual(res, [1.0, 2.0]) - - def test_aggregate_with_max(self): - reducer = MonascaAggregateLDP.select_reducer(self._conf("max")) - res = MonascaAggregateLDP.aggregate(self.all_metrics, reducer, "_max") - res = [m["metric"]["value"] for m in res] - self.assertEqual(res, [1.5, 3.0]) - - def test_aggregate_with_sum(self): - reducer = MonascaAggregateLDP.select_reducer(self._conf("sum")) - res = MonascaAggregateLDP.aggregate(self.all_metrics, reducer, "_sum") - res = [m["metric"]["value"] for m in res] - self.assertEqual(res, [2.5, 5.0]) - - def test_aggregate_with_cnt(self): - reducer = MonascaAggregateLDP.select_reducer(self._conf("cnt")) - res = MonascaAggregateLDP.aggregate(self.all_metrics, reducer, "_cnt") - res = [m["metric"]["value"] for m in res] - self.assertEqual(res, [2, 2]) diff --git a/test/ldp/test_monasca_combine.py b/test/ldp/test_monasca_combine.py deleted file mode 100644 index 44cda9d..0000000 --- a/test/ldp/test_monasca_combine.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from test.util_for_testing import MonanasTestCase - - -class TestMonascaAggregateLDP(MonanasTestCase): - - def setUp(self): - super(TestMonascaAggregateLDP, self).setUp() - self.all_metrics = [ - gen_metric("nb_cores", 1.2, 0, "h1"), - gen_metric("nb_cores", 2.0, 1, "h1"), - gen_metric("idl_perc", 0.2, 0, "h1"), - gen_metric("idl_perc", 0.8, 1, "h1"), - ] - - def tearDown(self): - super(TestMonascaAggregateLDP, self).tearDown() diff --git a/test/ldp/test_monasca_derivative.py b/test/ldp/test_monasca_derivative.py deleted file mode 100644 index e6c008e..0000000 --- a/test/ldp/test_monasca_derivative.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ldp.monasca_derivative import MonascaDerivativeLDP -from pyspark.resultiterable import ResultIterable -from test.util_for_testing import gen_metric -from test.util_for_testing import MonanasTestCase - - -class TestMonascaAggregateLDP(MonanasTestCase): - - def setUp(self): - super(TestMonascaAggregateLDP, self).setUp() - self.all_metrics = [ - gen_metric("memory", 1.5, 0, "h1"), - gen_metric("memory", 2.0, 1, "h1"), - gen_metric("memory", 1.0, 0, "h1"), - gen_metric("memory", 3.0, 1, "h1"), - gen_metric("memory", 1.5, 4, "h1"), - gen_metric("memory", 2.0, 2, "h1"), - gen_metric("memory", 1.0, 3, "h1"), - gen_metric("memory", 3.0, 5, "h1"), - ] - - def _values(self, values): - return [m["metric"]["value"] for m in values] - - def tearDown(self): - super(TestMonascaAggregateLDP, self).tearDown() - - def test_derivative_should_do_nothing_with_1_value(self): - self.assertEqual(MonascaDerivativeLDP.derivative( - ResultIterable(self.all_metrics[0:1])), - []) - - def test_derivative_should_work_on_first_and_last_values(self): - new_values = MonascaDerivativeLDP.derivative( - ResultIterable(self.all_metrics[0:2])) - new_values = self._values(new_values) - self.assertEqual(new_values, - [0.5, 0.5]) - - def test_derivative_should_remove_duplicate(self): - new_values = MonascaDerivativeLDP.derivative( - ResultIterable(self.all_metrics[0:4])) - new_values = self._values(new_values) - self.assertEqual(new_values, - [0.5, 0.5]) - - def test_derivative_should_work(self): - new_values = MonascaDerivativeLDP.derivative( - ResultIterable(self.all_metrics)) - new_values = self._values(new_values) - self.assertEqual(new_values, - [0.5, 0.25, -0.5, -0.25, 1.0, 1.5]) diff --git a/test/mocks/__init__.py b/test/mocks/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/mocks/classifier_mock.py b/test/mocks/classifier_mock.py deleted file mode 100644 index c8f5e36..0000000 --- a/test/mocks/classifier_mock.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import numpy as np - -from monasca_analytics.sml import svm_one_class as svm - - -class MockClassifier(object): - - def __init__(self, predict_anomaly=False): - self._predict_anomaly = predict_anomaly - self.predict_cnt = 0 - - def predict(self, _): - self.predict_cnt += 1 - if self._predict_anomaly: - return np.array([svm.ANOMALY]) - return np.array([svm.NON_ANOMALY]) diff --git a/test/mocks/ingestors.py b/test/mocks/ingestors.py deleted file mode 100644 index c31cc47..0000000 --- a/test/mocks/ingestors.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.ingestor import base - - -class IngestorBasicChild(base.BaseIngestor): - """ - BaseIngestor with abstract classes implemented in order to test it - """ - - validation_cnt = 0 - - def __init__(self, _id, _config): - IngestorBasicChild.validation_cnt = 0 - self.process_stream_cnt = 0 - self.before_stop_ingesting_cnt = 0 - super(IngestorBasicChild, self).__init__(_id, _config) - - @staticmethod - def validate_config(_config): - IngestorBasicChild.validation_cnt += 1 - - @staticmethod - def get_default_config(): - {"module": IngestorBasicChild.__name__} - - def map_dstream(self): - self.process_stream_cnt += 1 - - def before_stop_ingesting(self): - self.before_stop_ingesting_cnt += 1 - - -class MockIngestor(IngestorBasicChild): - """ - Mock of BaseIngestor in order to test code that uses it - """ - - def __init__(self, _id, _config): - self.ingest_cnt = 0 - super(MockIngestor, self).__init__(_id, _config) - - def ingest(self, dstream, ssc): - self.ingest_cnt += 1 diff --git a/test/mocks/markov.py b/test/mocks/markov.py deleted file mode 100644 index 695d40b..0000000 --- a/test/mocks/markov.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -import monasca_analytics.source.markov_chain.base as bmkv - - -class MockRequestBuilder(bmkv.RequestBuilder): - - def __init__(self, events): - super(MockRequestBuilder, self).__init__(request=None) - self.events = events - - def send(self, data): - self.events.append(data) - - def finalize(self): - pass diff --git a/test/mocks/sml_mocks.py b/test/mocks/sml_mocks.py deleted file mode 100644 index baf6401..0000000 --- a/test/mocks/sml_mocks.py +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import numpy as np - -from monasca_analytics.exception import monanas as err -from monasca_analytics.ingestor import base as base_ing -from monasca_analytics.ldp import base as base_ldp -from monasca_analytics.sink import base as base_snk -from monasca_analytics.sml import base as base_sml -from monasca_analytics.source import base as base_src -from monasca_analytics.spark import aggregator -from monasca_analytics.voter import base as base_voter - - -class SMLMocks(object): - """ - Auxiliary class to track modules instantiations, classes got by name, - and validated configuration. - """ - - def __init__(self): - self.reset() - - def reset(self): - """ - Resets all the elements (counts and lists) - """ - self.instantiated = {"src_module1": [], - "src_module2": [], - "IPTablesSource": [], - "ingestor_module": [], - "sml_module": [], - "voter_module": [], - "sink_module1": [], - "sink_module2": [], - "ldp_module1": [] - } - self.classes_got_by_name = [] - self.bound_sources = [] - self.terminated_sources = [] - self.killed = False - - def reset_connections(self): - """ - Resets the variables of the instantiated elements only - """ - for comp_type in self.instantiated.values(): - for comp in comp_type: - comp.reset_vars() - -sml_mocks = SMLMocks() - - -class MockClass_src(base_src.BaseSource): - - def __init__(self, _id, _config): - super(MockClass_src, self).__init__(_id, _config) - self.reset_vars() - - def reset_vars(self): - self.get_feature_list_cnt = 0 - self.create_dstream_cnt = 0 - self.terminate_source_cnt = 0 - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_src.__name__} - - @staticmethod - def get_params(): - return [] - - def get_feature_list(self): - self.get_feature_list_cnt += 1 - return ["a", "b"] - - def create_dstream(self, ssc): - self.create_dstream_cnt += 1 - return ssc.mockDStream() - - def terminate_source(self): - self.terminate_source_cnt += 1 - - -class MockClass_src_module1(MockClass_src): - - def __init__(self, _id, _config): - sml_mocks.instantiated["src_module1"].append(self) - super(MockClass_src_module1, self).__init__(_id, _config) - - -class MockClass_src_module2(MockClass_src): - - def __init__(self, _id, _config): - sml_mocks.instantiated["src_module2"].append(self) - super(MockClass_src_module2, self).__init__(_id, _config) - - -class MockClass_src_module3(MockClass_src): - - def __init__(self, _id, _config): - sml_mocks.instantiated["IPTablesSource"].append(self) - super(MockClass_src_module3, self).__init__(_id, _config) - - -class MockClass_ingestor_module(base_ing.BaseIngestor): - - def __init__(self, _id, _config): - super(MockClass_ingestor_module, self).__init__(_id, _config) - sml_mocks.instantiated["ingestor_module"].append(self) - self.reset_vars() - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_ingestor_module.__name__} - - @staticmethod - def get_params(): - return [] - - def reset_vars(self): - self.map_dstream_cnt = 0 - - def map_dstream(self, dstream): - self.map_dstream_cnt += 1 - return dstream - - -class MockClass_aggr_module(aggregator.Aggregator): - - def __init__(self, driver): - super(MockClass_aggr_module, self).__init__(driver) - self.reset_vars() - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_aggr_module.__name__} - - @staticmethod - def get_params(): - return [] - - def reset_vars(self): - self.accumulate_dstream_samples_cnt = 0 - self.append_sml_cnt = 0 - self._smls = [] - - def append_sml(self, sml): - super(MockClass_aggr_module, self).append_sml(sml) - self.append_sml_cnt += 1 - - def accumulate_dstream_samples(self, dstream): - self._samples = np.array([]) - self._combined_stream = None - super(MockClass_aggr_module, self).accumulate_dstream_samples(dstream) - self.accumulate_dstream_samples_cnt += 1 - - -class MockClass_sml_module(base_sml.BaseSML): - - def __init__(self, _id, _config): - super(MockClass_sml_module, self).__init__(_id, _config) - sml_mocks.instantiated["sml_module"].append(self) - self.reset_vars() - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_sml_module.__name__} - - @staticmethod - def get_params(): - return [] - - def reset_vars(self): - self._voter = None - self.learn_structure_cnt = 0 - - def learn_structure(self, _): - self.learn_structure_cnt += 1 - - def number_of_samples_required(self): - return 0 - - -class MockClass_voter_module(base_voter.BaseVoter): - - def __init__(self, _id, _config): - super(MockClass_voter_module, self).__init__(_id, _config) - sml_mocks.instantiated["voter_module"].append(self) - self.reset_vars() - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_voter_module.__name__} - - @staticmethod - def get_params(): - return [] - - def reset_vars(self): - self.elect_structure_cnt = 0 - - def elect_structure(self, _): - self.elect_structure_cnt += 1 - - -class MockClass_sink(base_snk.BaseSink): - - def __init__(self, _id, _config): - super(MockClass_sink, self).__init__(_id, _config) - self.reset_vars() - - def reset_vars(self): - self.sink_dstream_cnt = 0 - self.sink_sml_cnt = 0 - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_sink.__name__} - - @staticmethod - def get_params(): - return [] - - def sink_dstream(self, _): - self.sink_dstream_cnt += 1 - - def sink_ml(self, *_): - self.sink_sml_cnt += 1 - - -class MockClass_sink_module1(MockClass_sink): - - def __init__(self, _id, _config): - sml_mocks.instantiated["sink_module1"].append(self) - super(MockClass_sink_module1, self).__init__(_id, _config) - - -class MockClass_sink_module2(MockClass_sink): - - def __init__(self, _id, _config): - sml_mocks.instantiated["sink_module2"].append(self) - super(MockClass_sink_module2, self).__init__(_id, _config) - - -class MockClass_ldp_module1(base_ldp.BaseLDP): - - def __init__(self, _id, _config): - super(MockClass_ldp_module1, self).__init__(_id, _config) - sml_mocks.instantiated["ldp_module1"].append(self) - self.reset_vars() - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": MockClass_ldp_module1.__name__} - - @staticmethod - def get_params(): - return [] - - def map_dstream(self, dstream): - self.map_dstream_cnt += 1 - return dstream - - def reset_vars(self): - self.map_dstream_cnt = 0 - - -def mock_kill(pid, code): - sml_mocks.killed = True - - -def mock_get_class_by_name(module, class_type): - sml_mocks.classes_got_by_name.append([module, class_type]) - if module == "src_module1": - return MockClass_src_module1 - elif module == "src_module2": - return MockClass_src_module2 - elif module == "IPTablesSource": - return MockClass_src_module3 - elif module == "ingestor_module": - return MockClass_ingestor_module - elif module == "aggr_module": - return MockClass_aggr_module - elif module == "sml_module": - return MockClass_sml_module - elif module == "voter_module": - return MockClass_voter_module - elif module == "sink_module1": - return MockClass_sink_module1 - elif module == "sink_module2": - return MockClass_sink_module2 - elif module == "ldp_module1": - return MockClass_ldp_module1 - raise err.MonanasNoSuchClassError("testing NoSuchClassError") diff --git a/test/mocks/sources.py b/test/mocks/sources.py deleted file mode 100644 index 1cc7103..0000000 --- a/test/mocks/sources.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.source import base - - -class MockBaseSource(base.BaseSource): - - validation_cnt = 0 - - def __init__(self, _id, _config): - MockBaseSource.validation_cnt = 0 - self.before_binding_cnt = 0 - self.after_binding_cnt = 0 - self.before_unbinding_cnt = 0 - self.after_unbinding_cnt = 0 - super(MockBaseSource, self).__init__(_id, _config) - - @staticmethod - def validate_config(_config): - MockBaseSource.validation_cnt += 1 - - @staticmethod - def get_default_config(): - return {"module": MockBaseSource.__name__} - - @staticmethod - def get_params(): - return [] - - def create_dstream(self, ssc): - self.before_binding_cnt += 1 - return None - - def terminate_source(self): - pass - - def get_feature_list(self): - pass diff --git a/test/mocks/spark_mocks.py b/test/mocks/spark_mocks.py deleted file mode 100644 index fe77aa1..0000000 --- a/test/mocks/spark_mocks.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import time - - -class MockSparkContext(object): - - def __init__(self, appName): - self.parallelize_cnt = 0 - pass - - def parallelize(self, param): - self.parallelize_cnt += 1 - pass - - -class MockStreamingContext(object): - - def __init__(self, sc, streaming_batch_interval): - self.sparkContext = sc - self.started_cnt = 0 - self.stopped_cnt = 0 - self._textFileStreamDirectory = None - self._port = None - - def start(self): - self.started_cnt += 1 - - def stop(self, stopSparkContext=True, stopGraceFully=False): - self.stopped_cnt += 1 - - def awaitTermination(self): - self.stopped_cnt += 1 - - def textFileStream(self, directory): - self._textFileStreamDirectory = directory - return "file_dstream" - - def socketTextStream(self, host, port): - self._port = port - self._host = host - return MockDStream(None, None, None) - - def mockDStream(self): - return MockDStream(None, None, None) - - def addStreamingListener(self, *arg, **kwargs): - pass - - def checkpoint(self, directory): - pass - - -class MockKafkaUtils(object): - - @staticmethod - def createStream(ssc, hostport, groupid, topics): - return "kafka_dstream" - - -class MockDStream(object): - - def __init__(self, jdstream, ssc, jrdd_deserializer): - self.transform_cnt = 0 - self.join_cnt = 0 - self.foreachRDD_cnt = 0 - self.map_cnt = 0 - self.jdstream = jdstream - self.ssc = ssc - self.fake_rdd = None - self.jrdd_deserializer = jrdd_deserializer - - def transform(self, func): - self.transform_cnt += 1 - self.fake_rdd = MockRDD( - self.jdstream, self.ssc, self.jrdd_deserializer) - timestamp = time.time() - func(timestamp, self.fake_rdd) - - def join(self, other_dstream): - self.join_cnt += 1 - - def foreachRDD(self, func): - self.foreachRDD_cnt += 1 - self.fake_rdd = MockRDD( - self.jdstream, self.ssc, self.jrdd_deserializer) - timestamp = time.time() - func(timestamp, self.fake_rdd) - - def map(self, func): - self.map_cnt += 1 - self.fake_rdd = MockRDD( - self.jdstream, self.ssc, self.jrdd_deserializer) - for rdd_entry in self.fake_rdd.collect(): - func(rdd_entry) - - def pprint(self, num=10): - pass - - -class MockRDD(object): - - def __init__(self, jdstream, ssc, jrdd_deserializer): - self.collect_cnt = 0 - self._rdd_entries = [] - - def set_rdd_entries(self, rdd_entries): - self._rdd_entries = rdd_entries - - def collect(self): - self.collect_cnt += 1 - return self._rdd_entries diff --git a/test/resources/dsl_code.txt b/test/resources/dsl_code.txt deleted file mode 100644 index 6373b91..0000000 --- a/test/resources/dsl_code.txt +++ /dev/null @@ -1,15 +0,0 @@ -#target generated_config.json - -A = CloudMarkovChainSource -A.params.server_sleep_in_seconds = 0.1 -B = CloudIngestor -C = LiNGAM -C.params.threshold = 0.1 -D = PickIndexVoter -E = KafkaSink -F = CloudCausalityLDP -A -> B -A -> F -C -> D -D -> F -F -> E \ No newline at end of file diff --git a/test/resources/logging.json b/test/resources/logging.json deleted file mode 100644 index a4f4e8c..0000000 --- a/test/resources/logging.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": 1, - "disable_existing_loggers": false, - "formatters": { - "standard": { - "format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s" - } - }, - "handlers": { - "default": { - "level": "DEBUG", - "class": "logging.StreamHandler", - "formatter": "standard" - } - }, - "loggers": { - "": { - "handlers": ["default"], - "level": "ERROR", - "propagate": true - } - } -} diff --git a/test/resources/test_json.json b/test/resources/test_json.json deleted file mode 100644 index af7fbff..0000000 --- a/test/resources/test_json.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "spark_config": { - "appName": "testApp", - "streaming": { - "batch_interval": 1 - } - }, - "server": { - "port": 3000, - "debug": true - }, - "sources": { - "src1": { - "module": "src_module1", - "params": { - "param1": "val1", - "param2": "val2", - "model_id": 3 - } - }, - "src2": { - "module": "src_module2" - }, - "src3": { - "module": "IPTablesSource", - "sleep": 0.01 - } - }, - "ingestors": { - "ing1": { - "module": "ingestor_module" - } - }, - "smls": { - "sml1": { - "module": "sml_module" - } - }, - "voters": { - "vot1": { - "module": "voter_module" - } - }, - "sinks": { - "snk1": { - "module": "sink_module1" - }, - "snk2": { - "module": "sink_module2" - } - }, - "ldps": { - "ldp1": { - "module": "ldp_module1" - } - }, - "connections": { - "src1": ["ing1", "ldp1"], - "src2": [], - "ing1": [], - "sml1": ["vot1", "snk1"], - "vot1": ["ldp1"], - "ldp1": ["snk2"], - "snk2": [], - "snk1": [] - }, - "feedback": { - "snk1": ["sml1"], - "snk2": ["vot1"] - } -} diff --git a/test/sink/__init__.py b/test/sink/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/sink/test_base_sqlite.py b/test/sink/test_base_sqlite.py deleted file mode 100644 index c35d9af..0000000 --- a/test/sink/test_base_sqlite.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os -import sqlite3 -import unittest - -import numpy as np -import six -from six.moves import cPickle -import voluptuous - -import monasca_analytics.banana.typeck.type_util as type_util -import monasca_analytics.component.params as params -from monasca_analytics.sink import base_sqlite as bsql -from test.mocks import spark_mocks - - -class BaseSQLiteSinkDummyExtension(bsql.BaseSQLiteSink): - - def _rdds_table_create_query(self): - return """CREATE TABLE IF NOT EXISTS rdds - (fake_col1 TEXT, fake_col2 TEXT)""" - - def _rdd_insert_query(self, rdd_json): - return ('INSERT INTO rdds VALUES("' + rdd_json["one"] + - '", "' + rdd_json["two"] + '")') - - @staticmethod - def get_default_config(): - return { - "module": BaseSQLiteSinkDummyExtension.__name__, - "params": { - "db_name": "sqlite_sink.db" - } - } - - @staticmethod - def get_params(): - return [ - params.ParamDescriptor( - "db_name", - type_util.String(), - "sqlite_sink.db" - ) - ] - - @staticmethod - def validate_config(_config): - base_schema = voluptuous.Schema({ - "module": voluptuous.And( - six.string_types[0], - lambda i: not any(c.isspace() for c in i)), - voluptuous.Optional("db_name"): voluptuous.And( - six.string_types[0], - lambda i: not any(c.isspace() for c in i)), - }, required=True) - return base_schema(_config) - - -class TestSQLiteSink(unittest.TestCase): - - def setUp(self): - unittest.TestCase.setUp(self) - self._valid_config = {"module": "BaseSQLiteSinkDummyExtension"} - self.snk = BaseSQLiteSinkDummyExtension("fake_id", self._valid_config) - - def get_rdd_mock(self): - rdd = spark_mocks.MockRDD(None, None, None) - rdd_entries = [{"one": "row1col1", "two": "row1col2"}, - {"one": "row2col1", "two": "row2col2"}, - {"one": "row3col1", "two": "row3col2"}] - rdd.set_rdd_entries(rdd_entries) - return rdd - - def assert_rdd_written_to_db(self, rdd): - with sqlite3.connect("sqlite_sink.db") as conn: - c = conn.cursor() - for row in c.execute('SELECT * FROM rdds'): - if self._find_row_in_rdd(row, rdd): - return - self.fail("Did not find rdd in database") - - def _find_row_in_rdd(self, row, rdd): - for rdd_entry in rdd._rdd_entries: - if rdd_entry["one"] == row[0] and rdd_entry["two"] == row[1]: - return True - return False - - def assert_sml_written_to_db(self, sml, voter_id): - with sqlite3.connect("sqlite_sink.db") as conn: - c = conn.cursor() - c.execute('SELECT sml FROM smls WHERE voter_id = "' + - voter_id + '"') - fetched_sml = c.fetchone() - if six.PY2: - fetched_sml = cPickle.loads(str(fetched_sml[0])) - else: - fetched_sml = cPickle.loads(fetched_sml[0]) - self.assertEqual(len(sml), len(fetched_sml)) - self.assertTrue((sml == fetched_sml).all()) - - def test_validate_valid_config_no_dbname(self): - conf = {"module": "BaseSQLiteSinkDummyExtension"} - self.snk.validate_config(conf) - - def test_validate_valid_config_with_dbname(self): - conf = {"module": "BaseSQLiteSinkDummyExtension", - "db_name": "mySQLite.db"} - self.snk.validate_config(conf) - - def test_validate_config_no_module(self): - conf = {"db_name": "mySQLite.db"} - self.assertRaises(voluptuous.Invalid, self.snk.validate_config, conf) - - def test_validate_config_extra_param(self): - conf = {"module": "BaseSQLiteSinkDummyExtension", - "infiltrated": "I shouldn't be here"} - self.assertRaises(voluptuous.Invalid, self.snk.validate_config, conf) - - def test_get_db_name(self): - conf = {"db_name": "mySQLite.db"} - db_name = self.snk._get_db_name(conf) - self.assertEqual("mySQLite.db", db_name) - - def test_get_db_name_default(self): - conf = {"module": "BaseSQLiteSinkDummyExtension"} - db_name = self.snk._get_db_name(conf) - self.assertEqual(bsql.DB_NAME_DEFAULT, db_name) - - def test_persist(self): - rdd = self.get_rdd_mock() - self.snk._persist(None, rdd) - self.assert_rdd_written_to_db(rdd) - - def test_sink_ml_array(self): - sml = np.array([[1, 2, 3], ["a", "b", "c"], [.1, .5, .9]]) - self.snk.sink_ml("vot1", sml) - self.assert_sml_written_to_db(sml, "vot1") - - def tearDown(self): - unittest.TestCase.tearDown(self) - os.remove("sqlite_sink.db") - -if __name__ == "__main__": - unittest.main() diff --git a/test/sink/test_iptables_sqlite.py b/test/sink/test_iptables_sqlite.py deleted file mode 100644 index 31bf97b..0000000 --- a/test/sink/test_iptables_sqlite.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os -import unittest - -from monasca_analytics.sink import iptables_sqlite as ipt_snk - - -class TestIptablesSQLiteSink(unittest.TestCase): - - def setUp(self): - unittest.TestCase.setUp(self) - self._valid_config = {"module": "IptablesSQLiteSink"} - self.snk = ipt_snk.IptablesSQLiteSink("fake_id", self._valid_config) - - def test_rdds_table_create_query(self): - query = self.snk._rdds_table_create_query() - self.assertEqual("""CREATE TABLE IF NOT EXISTS rdds - (msg TEXT, anomalous TEXT, msg_id TEXT, ctime TEXT)""", query) - - def test_rdd_insert_query_valid_rdd(self): - rdd_entry = { - "msg": "test message", - "id": 1, - "anomalous": True, - "ctime": "t1" - } - query = self.snk._rdd_insert_query(rdd_entry) - self.assertEqual( - 'INSERT INTO rdds VALUES("test message", "True", "1", "t1")', - query) - - def test_rdd_insert_query_invalid_rdd(self): - rdd_entry = { - "msg": "test message", - "anomalous": True, - "ctime": "t1" - } - self.assertRaises(KeyError, self.snk._rdd_insert_query, rdd_entry) - - def tearDown(self): - unittest.TestCase.tearDown(self) - os.remove("sqlite_sink.db") - -if __name__ == "__main__": - unittest.main() diff --git a/test/sink/test_kafka.py b/test/sink/test_kafka.py deleted file mode 100644 index fec0d69..0000000 --- a/test/sink/test_kafka.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import unittest - -# This file is name kafkas otherwise it will conflict -# with the global import 'kafka' -import monasca_analytics.sink.kafkas as kf - - -class KafkaSinkTest(unittest.TestCase): - def setUp(self): - unittest.TestCase.setUp(self) - - class MockedKafka(object): - def __init__(self): - self.has_been_called = False - - def KafkaProducer(self, *_, **kwargs): - self.has_been_called = True - - self.mock_kafka = MockedKafka() - self.original_kafka = kf.kafka - kf.kafka = self.mock_kafka - - def testKafkaSinkInit(self): - kf.KafkaSink("id", { - "module": "KafkaSink", - "host": "localhost", - "port": 00, - "topic": "boom", - }) - self.assertTrue(self.mock_kafka) - - def tearDown(self): - unittest.TestCase.tearDown(self) - kf.kafka = self.original_kafka - - def test_get_default_config(self): - default_config = kf.KafkaSink.get_default_config() - kf.KafkaSink.validate_config(default_config) - self.assertEqual("KafkaSink", default_config["module"]) - -if __name__ == "__main__": - unittest.main() diff --git a/test/sink/test_sink_config_validator.py b/test/sink/test_sink_config_validator.py deleted file mode 100644 index 514b82b..0000000 --- a/test/sink/test_sink_config_validator.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import unittest -import voluptuous - -import monasca_analytics.sink.sink_config_validator as validator - -kafka = validator.validate_kafka_sink_config - - -class SinkConfigValidatorTest(unittest.TestCase): - def setUp(self): - unittest.TestCase.setUp(self) - self._valid_config = { - "module": "KafkaSink", - "host": "127.0.0.1", - "port": 9092, - "topic": "transformed_data" - } - - def test_validate_kafka_sink_valid_config(self): - try: - kafka(self._valid_config) - except voluptuous.Invalid as e: - self.fail(e.__str__()) - - def test_validate_kafka_sink_invalid_module(self): - invalid_config = self._valid_config - invalid_config["module"] = "invalid_module" - self.assertRaises(voluptuous.Invalid, kafka, invalid_config) - - def test_validate_kafka_sink_invalid_host(self): - invalid_config = self._valid_config - invalid_config["host"] = "invalid host" - self.assertRaises(voluptuous.Invalid, kafka, invalid_config) - - def test_validate_kafka_sink_invalid_port(self): - invalid_config = self._valid_config - invalid_config["port"] = "invalid_port" - self.assertRaises(voluptuous.Invalid, kafka, invalid_config) - - def test_validate_kafka_sink_invalid_topic(self): - invalid_config = self._valid_config - invalid_config["topic"] = "invalid topic" - self.assertRaises(voluptuous.Invalid, kafka, invalid_config) - - def tearDown(self): - unittest.TestCase.tearDown(self) - -if __name__ == "__main__": - unittest.main() diff --git a/test/sml/__init__.py b/test/sml/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/sml/test_decision_tree.py b/test/sml/test_decision_tree.py deleted file mode 100644 index 0675fa9..0000000 --- a/test/sml/test_decision_tree.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import tree - -from monasca_analytics.sml import decision_tree -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestDecisionTreeClassifier(MonanasTestCase): - - def setUp(self): - super(TestDecisionTreeClassifier, self).setUp() - self.dt_sml = decision_tree.DecisionTreeClassifier( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestDecisionTreeClassifier, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - labels = np.random.randint(2, size=1000) - return np.array([a, b, c, d, labels]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - X_train, X_train_labeled, X_test, X_test_labeled =\ - self.dt_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(X_train)) - self.assertEqual(600, len(X_train_labeled)) - self.assertEqual(400, len(X_test)) - self.assertEqual(400, len(X_test_labeled)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.dt_sml.learn_structure(data) - self.assertIsInstance(clf, tree.DecisionTreeClassifier) diff --git a/test/sml/test_elliptic_envelope.py b/test/sml/test_elliptic_envelope.py deleted file mode 100644 index 0031ebb..0000000 --- a/test/sml/test_elliptic_envelope.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import covariance - -from monasca_analytics.sml import elliptic_envelope -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestEllipticEnvelope(MonanasTestCase): - - def setUp(self): - super(TestEllipticEnvelope, self).setUp() - self.ee_sml = elliptic_envelope.EllipticEnvelope( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestEllipticEnvelope, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - return np.array([a, b, c, d]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - train, test = self.ee_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(train)) - self.assertEqual(400, len(test)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.ee_sml.learn_structure(data) - self.assertIsInstance(clf, covariance.EllipticEnvelope) diff --git a/test/sml/test_isolation_forest.py b/test/sml/test_isolation_forest.py deleted file mode 100644 index 1947e73..0000000 --- a/test/sml/test_isolation_forest.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import ensemble - -from monasca_analytics.sml import isolation_forest -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestIsolationForest(MonanasTestCase): - - def setUp(self): - super(TestIsolationForest, self).setUp() - self.if_sml = isolation_forest.IsolationForest( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestIsolationForest, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - return np.array([a, b, c, d]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - train, test = self.if_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(train)) - self.assertEqual(400, len(test)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.if_sml.learn_structure(data) - self.assertIsInstance(clf, ensemble.IsolationForest) diff --git a/test/sml/test_lingam.py b/test/sml/test_lingam.py deleted file mode 100644 index b72bf14..0000000 --- a/test/sml/test_lingam.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np - -from monasca_analytics.sml import lingam -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class LiNGAMTest(MonanasTestCase): - - def setUp(self): - super(LiNGAMTest, self).setUp() - - def tearDown(self): - super(LiNGAMTest, self).tearDown() - - def test_continuous_lingam_algorithm(self): - b = np.random.laplace(size=500) - a = np.random.laplace(size=500) + b - d = np.random.laplace(size=500) + a + b - c = np.random.laplace(size=500) + d - data = np.array([a, b, c, d]) - causality_matrix, causal_order =\ - lingam.LiNGAM._discover_structure(data.T) - - logger.debug("\nb deps (should be almost zero): {}" - .format(np.sum(np.abs(causality_matrix[1, :])))) - logger.debug("\ncausality matrix:\n{}".format(causality_matrix)) - self.assertEqual(np.all(causal_order == np.array([1, 0, 3, 2])), True, - "Algorithm didn't found the causal order!") - - def test_discrete_set_lingam_algorithm(self): - b = np.random.laplace(size=500) - a = np.random.laplace(size=500) + b - d = np.random.laplace(size=500) + a + b - c = np.random.laplace(size=500) + d - data = np.array([a, b, c, d]) - data = np.floor(data) - causality_matrix, causal_order =\ - lingam.LiNGAM._discover_structure(data.T) - - logger.debug("\nb deps (should be almost zero): {}" - .format(np.sum(np.abs(causality_matrix[1, :])))) - logger.debug("\ncausality matrix:\n{}".format(causality_matrix)) - self.assertEqual(np.all(causal_order == np.array([1, 0, 3, 2])), True, - "Algorithm didn't found the causal order!") - - def test_discrete_set_absolute_value_lingam_algorithm(self): - b = np.random.laplace(size=500) - a = np.random.laplace(size=500) + b - d = np.random.laplace(size=500) + a + b - c = np.random.laplace(size=500) + d - data = np.array([a, b, c, d]) - data = np.floor(data) - data = np.abs(data) - causality_matrix, causal_order =\ - lingam.LiNGAM._discover_structure(data.T) - - logger.debug("\nb deps (should be almost zero): {}" - .format(np.sum(np.abs(causality_matrix[1, :])))) - logger.debug("\ncausality matrix:\n{}".format(causality_matrix)) - self.assertEqual(np.all(causal_order == np.array([1, 0, 3, 2])), True, - "Algorithm didn't found the causal order!") - - def test_get_default_config(self): - default_config = lingam.LiNGAM.get_default_config() - lingam.LiNGAM.validate_config(default_config) - self.assertEqual("LiNGAM", default_config["module"]) diff --git a/test/sml/test_logistic_regression.py b/test/sml/test_logistic_regression.py deleted file mode 100644 index 4c3b9b3..0000000 --- a/test/sml/test_logistic_regression.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import linear_model - -from monasca_analytics.sml import logistic_regression -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestLogisticRegression(MonanasTestCase): - - def setUp(self): - super(TestLogisticRegression, self).setUp() - self.lr_sml = logistic_regression.LogisticRegression( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestLogisticRegression, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - labels = np.random.randint(2, size=1000) - return np.array([a, b, c, d, labels]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - X_train, X_train_labeled, X_test, X_test_labeled =\ - self.lr_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(X_train)) - self.assertEqual(600, len(X_train_labeled)) - self.assertEqual(400, len(X_test)) - self.assertEqual(400, len(X_test_labeled)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.lr_sml.learn_structure(data) - self.assertIsInstance(clf, linear_model.LogisticRegression) diff --git a/test/sml/test_random_forest_classifier.py b/test/sml/test_random_forest_classifier.py deleted file mode 100644 index 78f2b9d..0000000 --- a/test/sml/test_random_forest_classifier.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import ensemble - -from monasca_analytics.sml import random_forest_classifier -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestRandomForestClassifier(MonanasTestCase): - - def setUp(self): - super(TestRandomForestClassifier, self).setUp() - self.rf_sml = random_forest_classifier.RandomForestClassifier( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestRandomForestClassifier, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - labels = np.random.randint(2, size=1000) - return np.array([a, b, c, d, labels]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - X_train, X_train_labeled, X_test, X_test_labeled =\ - self.rf_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(X_train)) - self.assertEqual(600, len(X_train_labeled)) - self.assertEqual(400, len(X_test)) - self.assertEqual(400, len(X_test_labeled)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.rf_sml.learn_structure(data) - self.assertIsInstance(clf, ensemble.RandomForestClassifier) diff --git a/test/sml/test_svc.py b/test/sml/test_svc.py deleted file mode 100644 index 750dc79..0000000 --- a/test/sml/test_svc.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import svm - -from monasca_analytics.sml import svc -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestSvc(MonanasTestCase): - - def setUp(self): - super(TestSvc, self).setUp() - self.svc_sml = svc.Svc( - "fakeid", {"module": "fake", "nb_samples": 1000}) - - def tearDown(self): - super(TestSvc, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - labels = np.random.randint(2, size=1000) - return np.array([a, b, c, d, labels]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - X_train, X_train_labeled, X_test, X_test_labeled =\ - self.svc_sml._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(X_train)) - self.assertEqual(600, len(X_train_labeled)) - self.assertEqual(400, len(X_test)) - self.assertEqual(400, len(X_test_labeled)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.svc_sml.learn_structure(data) - self.assertIsInstance(clf, svm.SVC) diff --git a/test/sml/test_svm_one_class.py b/test/sml/test_svm_one_class.py deleted file mode 100644 index 75cefe9..0000000 --- a/test/sml/test_svm_one_class.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -import numpy as np -from sklearn import svm - -from monasca_analytics.sml import svm_one_class -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestSvmOneClass(MonanasTestCase): - - def setUp(self): - super(TestSvmOneClass, self).setUp() - self.svm = svm_one_class.SvmOneClass("fakeid", { - "module": "fake", - "nb_samples": 1000 - }) - - def tearDown(self): - super(TestSvmOneClass, self).tearDown() - - def get_testing_data(self): - a = np.random.uniform(size=1000) - b = np.random.uniform(size=1000) - c = np.random.uniform(size=1000) - d = np.random.uniform(size=1000) - return np.array([a, b, c, d]).T - - def test_generate_train_test_sets(self): - data = self.get_testing_data() - train, test = self.svm._generate_train_test_sets(data, 0.6) - self.assertEqual(600, len(train)) - self.assertEqual(400, len(test)) - - def test_learn_structure(self): - data = self.get_testing_data() - clf = self.svm.learn_structure(data) - self.assertIsInstance(clf, svm.OneClassSVM) diff --git a/test/source/__init__.py b/test/source/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/source/markov_chain/__init__.py b/test/source/markov_chain/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/source/markov_chain/test_base.py b/test/source/markov_chain/test_base.py deleted file mode 100644 index 4d13dd9..0000000 --- a/test/source/markov_chain/test_base.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import datetime - -from monasca_analytics.source.markov_chain import base -import monasca_analytics.source.markov_chain.events as ev -import monasca_analytics.source.markov_chain.prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import monasca_analytics.source.markov_chain.transition as tr -import test.mocks.markov as markov_mocks -from test.util_for_testing import MonanasTestCase - - -class StateNodeTest(MonanasTestCase): - - def setUp(self): - super(StateNodeTest, self).setUp() - - def tearDown(self): - super(StateNodeTest, self).tearDown() - - def test_collect_events_should_be_populated_by_trigger(self): - some_trigger = ev.Trigger( - node_check=dck.EqCheck(0), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("test") - ) - node = base.StateNode(0, None, some_trigger) - events = [] - node.collect_events(1, datetime.datetime.now(), - markov_mocks.MockRequestBuilder(events)) - self.assertTrue(len(events) == 1) - self.assertEqual(events[0]["event"].msg, "test", "a") - - def test_next_state_should_use_available_transitions(self): - tr1 = tr.Transition( - from_state=0, - to_state=1, - deps_check=dck.TrueCheck(), - prob_check=pck.NoProbCheck() - ) - tr2 = tr.Transition( - from_state=1, - to_state=2, - deps_check=dck.EqCheck(1), - prob_check=pck.NoProbCheck() - ) - mc = tr.MarkovChain([tr1, tr2]) - n1 = base.StateNode(0, mc, None) - n2 = base.StateNode(1, mc, None) - n3 = base.StateNode(0, mc, None) - n1.dependencies.append(n2) - n2.dependencies.append(n3) - # First round - n1.next_state(1, set()) - self.assertEqual(n1.state, 1) - self.assertEqual(n2.state, 1) - self.assertEqual(n3.state, 0) - # Second round - n1.next_state(1, set()) - self.assertEqual(n1.state, 2) - self.assertEqual(n2.state, 1) - self.assertEqual(n3.state, 0) - - def test_next_state_update_only_deps_and_deps_in_first(self): - tr1 = tr.Transition( - from_state=0, - to_state=1, - prob_check=pck.NoProbCheck() - ) - tr2 = tr.Transition( - from_state=1, - to_state=2, - deps_check=dck.EqCheck(1), - prob_check=pck.NoProbCheck() - ) - mc = tr.MarkovChain([tr1, tr2]) - n1 = base.StateNode(0, mc, None) - n2 = base.StateNode(1, mc, None) - n3 = base.StateNode(0, mc, None) - n1.dependencies.append(n2) - n2.dependencies.append(n3) - n2.next_state(1, set()) - self.assertEqual(n1.state, 0) - self.assertEqual(n2.state, 2) - self.assertEqual(n3.state, 1) diff --git a/test/source/markov_chain/test_events.py b/test/source/markov_chain/test_events.py deleted file mode 100644 index 8960158..0000000 --- a/test/source/markov_chain/test_events.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import datetime - -import monasca_analytics.source.markov_chain.events as ev -import monasca_analytics.source.markov_chain.prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import test.mocks.markov as markov_mocks - -from test.util_for_testing import MonanasTestCase - - -class DummyState(object): - - def __init__(self, state=0): - self.state = state - self.dependencies = [] - - def id(self): - return 0 - - -class TriggersTest(MonanasTestCase): - - def setUp(self): - super(TriggersTest, self).setUp() - - def tearDown(self): - super(TriggersTest, self).tearDown() - - def test_trigger_should_create_event_when_necessary(self): - some_trigger = ev.Trigger( - node_check=dck.EqCheck(0), - prob_check=pck.NoProbCheck(), - event_builder=ev.EventBuilder("") - ) - events = [] - some_trigger.apply_on( - DummyState(), - 1, - datetime.datetime.now(), - markov_mocks.MockRequestBuilder(events)) - self.assertEqual(len(events), 1) - events = [] - some_trigger.apply_on( - DummyState(1), - 1, - datetime.datetime.now(), - markov_mocks.MockRequestBuilder(events)) - self.assertEqual(len(events), 0) diff --git a/test/source/markov_chain/test_transition.py b/test/source/markov_chain/test_transition.py deleted file mode 100644 index ce3c794..0000000 --- a/test/source/markov_chain/test_transition.py +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import monasca_analytics.source.markov_chain.prob_checks as pck -import monasca_analytics.source.markov_chain.state_check as dck -import monasca_analytics.source.markov_chain.transition as t -from test.util_for_testing import MonanasTestCase - - -class DummyState(object): - - def __init__(self, state=0): - self.state = state - self.dependencies = [] - - -class MarkovChainTransitionsTest(MonanasTestCase): - - def setUp(self): - super(MarkovChainTransitionsTest, self).setUp() - - def tearDown(self): - super(MarkovChainTransitionsTest, self).tearDown() - - def test_first_order_dep_check(self): - state = DummyState() - state.dependencies.append(DummyState(1)) - dc = dck.DepCheck(dck.EqCheck(1)) - self.assertTrue(dc(state)) - state = DummyState() - self.assertFalse(dc(state)) - state = DummyState() - state.dependencies.append(DummyState(2)) - self.assertFalse(dc(state)) - - def test_second_order_dep_check(self): - state = DummyState() - state1 = DummyState() - state.dependencies.append(state1) - state1.dependencies.append(DummyState(1)) - dc = dck.DepCheck(dck.DepCheck(dck.EqCheck(1))) - self.assertTrue(dc(state)) - state = DummyState() - self.assertFalse(dc(state)) - self.assertFalse(dc(state1)) - - def test_combiner_and_dep_check(self): - state = DummyState() - state1 = DummyState(1) - state.dependencies.append(state1) - state1.dependencies.append(DummyState(2)) - dc = dck.AndCheck(c1=dck.DepCheck(dck.EqCheck(1)), - c2=dck.DepCheck(dck.DepCheck(dck.EqCheck(2)))) - self.assertTrue(dc(state)) - self.assertFalse(dc(state1)) - state1.state = 2 - self.assertFalse(dc(state)) - state1.state = 1 - state1.dependencies[0].state = 1 - self.assertFalse(dc(state)) - state = DummyState() - self.assertFalse(dc(state)) - - def test_combiner_or_dep_check(self): - state = DummyState() - state1 = DummyState(1) - state.dependencies.append(state1) - state1.dependencies.append(DummyState(2)) - dc = dck.OrCheck(c1=dck.DepCheck(dck.EqCheck(1)), - c2=dck.DepCheck(dck.DepCheck(dck.EqCheck(2)))) - self.assertTrue(dc(state)) - self.assertFalse(dc(state1)) - state1.dependencies[0].state = 1 - self.assertTrue(dc(state)) - self.assertTrue(dc(state1)) - state1.state = 2 - self.assertFalse(dc(state)) - state = DummyState() - self.assertFalse(dc(state)) - - def test_prob_check(self): - pc = pck.ProbCheck(0.5) - i = 0 - while i < 30: - if pc(0): - break - i += 1 - self.assertTrue(i < 30) - - def test_prob_check_interpolate(self): - pc = pck.ProbCheck({0: 0.0, 1: 0.0, 24: 1.0}) - self.assertFalse(pc(0)) - self.assertFalse(pc(1)) - self.assertTrue(pc(24)) - i = 0 - while i < 30: - if pc(12): - break - i += 1 - self.assertTrue(i < 30) - - def test_transition(self): - tr = t.Transition(0, 1, pck.ProbCheck(1.0)) - state = DummyState(0) - self.assertTrue(tr(state, 1)) - self.assertEqual(state.state, 1) - state = DummyState(2) - self.assertFalse(tr(state, 1)) - self.assertEqual(state.state, 2) - - def test_transition_with_true_check(self): - tr = t.Transition(0, 1, pck.NoProbCheck(), dck.TrueCheck()) - state = DummyState(0) - self.assertFalse(tr(state, 1)) - state1 = DummyState(123456) - state.dependencies.append(state1) - self.assertTrue(tr(state, 1)) - self.assertEqual(state.state, 1) - - def test_markov_chain(self): - tr1 = t.Transition(0, 1, pck.ProbCheck(1.0)) - tr2 = t.Transition(1, 2, pck.ProbCheck(1.0)) - mc = t.MarkovChain([tr1, tr2]) - state1 = DummyState(0) - state2 = DummyState(1) - mc.apply_on(state1, 1) - mc.apply_on(state2, 1) - self.assertEqual(state1.state, 1) - self.assertEqual(state2.state, 2) - mc.apply_on(state1, 1) - mc.apply_on(state2, 1) - self.assertEqual(state1.state, 2) - self.assertEqual(state2.state, 2) diff --git a/test/source/test_base.py b/test/source/test_base.py deleted file mode 100644 index 4aa834f..0000000 --- a/test/source/test_base.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from test.mocks import sources -from test.util_for_testing import MonanasTestCase - - -class BaseSourceTest(MonanasTestCase): - """ - Class that tests the BaseDataSource. It uses the Mock as a testing target, - because it extends the abstract class BaseIngestor, so the base logic - can be tested. - """ - - def setUp(self): - super(BaseSourceTest, self).setUp() - self.bs = sources.MockBaseSource("fake_id", "fake_config") - - def tearDown(self): - super(BaseSourceTest, self).tearDown() - - def test_validate_called(self): - self.assertEqual(1, sources.MockBaseSource.validation_cnt) diff --git a/test/source/test_iptables_markov_chain.py b/test/source/test_iptables_markov_chain.py deleted file mode 100644 index 3783043..0000000 --- a/test/source/test_iptables_markov_chain.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import voluptuous - -from monasca_analytics.source import iptables_markov_chain -from test.util_for_testing import MonanasTestCase - - -import six - - -class TestIPTablesSource(MonanasTestCase): - - def setUp(self): - super(TestIPTablesSource, self).setUp() - self.valid_config = { - "module": "IPTablesSource", - "sleep": 0.01 - } - self.config_extra_param = { - "module": "IPTablesSource", - "sleep": 0.01, - "infiltrated": "wrong_param" - } - self.config_missing_param = { - "module": "IPTablesSource", - } - self.config_wrong_type = { - "module": "IPTablesSource", - "sleep": "I should be an integer" - } - self.config_missing_params = {"module": "IPTablesSource"} - self.ips = iptables_markov_chain.IPTablesSource("fake_id", - self.valid_config) - - def tearDown(self): - super(TestIPTablesSource, self).tearDown() - - def test_validate_valid_config(self): - self.assertEqual(self.valid_config, self.ips._config) - - def test_validate_config_extra_param(self): - self.assertRaises( - voluptuous.Invalid, self.ips.validate_config, - self.config_extra_param) - - def test_validate_config_missing_param(self): - self.assertRaises( - voluptuous.Invalid, self.ips.validate_config, - self.config_missing_param) - - def test_validate_config_wrong_type(self): - self.assertRaises( - voluptuous.Invalid, - self.ips.validate_config, - self.config_wrong_type) - - def test_get_default_config(self): - default_config = iptables_markov_chain.\ - IPTablesSource.get_default_config() - iptables_markov_chain.IPTablesSource.validate_config(default_config) - self.assertEqual("IPTablesSource", default_config["module"]) - - def assertStateNode(self, node, state, num_triggers, states_transitions): - self.assertEqual(node.state, state) - self.assertEqual(len(node._triggers), num_triggers) - self.assertEqual(len(node._markov_chain._transitions), - len(states_transitions.keys())) - for state, num_transitions in six.iteritems(states_transitions): - self.assertEqual(len(node._markov_chain._transitions[state]), - num_transitions) - - def assertTransition(self, transition, from_state, to_state): - self.assertEqual(transition._from_state, from_state) - self.assertEqual(transition._to_state, to_state) - - def assert_all_correct_transitions(self, trs): - self.assertTransition(trs[iptables_markov_chain.STATE_STOP][0], - from_state=iptables_markov_chain.STATE_STOP, - to_state=iptables_markov_chain.STATE_NORMAL) - self.assertTransition(trs[iptables_markov_chain.STATE_NORMAL][0], - from_state=iptables_markov_chain.STATE_NORMAL, - to_state=iptables_markov_chain.STATE_STOP) - self.assertTransition(trs[iptables_markov_chain.STATE_NORMAL][1], - from_state=iptables_markov_chain.STATE_NORMAL, - to_state=iptables_markov_chain.STATE_ATTACK) - self.assertTransition(trs[iptables_markov_chain.STATE_ATTACK][0], - from_state=iptables_markov_chain.STATE_ATTACK, - to_state=iptables_markov_chain.STATE_NORMAL) - - def test_create_system(self): - nodes = self.ips._create_system() - self.assertEqual(1, len(nodes)) - self.assertStateNode(nodes[0], - state=iptables_markov_chain.STATE_STOP, - num_triggers=16, - states_transitions={ - iptables_markov_chain.STATE_STOP: 1, - iptables_markov_chain.STATE_NORMAL: 2, - iptables_markov_chain.STATE_ATTACK: 1}) - self.assert_all_correct_transitions(nodes[0]. - _markov_chain._transitions) - - def test_create_markov_chain_model(self): - markov_chain = self.ips._create_markov_chain_model() - self.assert_all_correct_transitions(markov_chain._transitions) diff --git a/test/source/test_kafka.py b/test/source/test_kafka.py deleted file mode 100644 index 9d43a4a..0000000 --- a/test/source/test_kafka.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import voluptuous - -from monasca_analytics.source import kafka -from test.mocks import spark_mocks -from test.util_for_testing import MonanasTestCase - - -class KafkaSourceTest(MonanasTestCase): - - def _mock_functions(self): - kafka.kafka.KafkaUtils = spark_mocks.MockKafkaUtils - - def setUp(self): - super(KafkaSourceTest, self).setUp() - self._mock_functions() - self.valid_config = { - "module": "kafka", - "params": { - "zk_host": "my_host", - "zk_port": 1234, - "group_id": "my_group_id", - "topics": {"topic1": 1, "topic2": 2} - } - } - self.config_extra_param = { - "module": "kafka", - "params": { - "zk_host": "my_host", - "zk_port": 1234, - "group_id": "my_group_id", - "topics": {"topic1": 1, "topic2": 2}, - "infiltrated": "wrong_param" - } - } - self.config_missing_param = { - "module": "kafka", - "params": { - "zk_host": "my_host", - "group_id": "my_group_id", - "topics": {"topic1": 1, "topic2": 2} - } - } - self.config_wrong_type = { - "module": 123, - "params": { - "zk_host": "my_host", - "zk_port": 1234, - "group_id": "my_group_id", - "topics": {"topic1": 1, "topic2": 2} - } - } - self.config_missing_params = {"module": "file"} - self.ks = kafka.KafkaSource("fake_id", self.valid_config) - - def tearDown(self): - super(KafkaSourceTest, self).tearDown() - - def test_validate_valid_config(self): - self.assertEqual(self.valid_config, self.ks._config) - - def test_validate_config_extra_param(self): - self.assertRaises( - voluptuous.Invalid, - self.ks.validate_config, - self.config_extra_param) - - def test_validate_config_wrong_type(self): - self.assertRaises( - voluptuous.Invalid, - self.ks.validate_config, - self.config_wrong_type) - - def test_validate_config_missing_params(self): - self.assertRaises( - voluptuous.Invalid, - self.ks.validate_config, - self.config_missing_params) - - def test_get_default_config(self): - default_config = kafka.KafkaSource.get_default_config() - kafka.KafkaSource.validate_config(default_config) - self.assertEqual("KafkaSource", default_config["module"]) - - def test_before_bind_source_dstream_created(self): - ssc = spark_mocks.MockStreamingContext(None, None) - self.assertIsNotNone(self.ks.create_dstream(ssc)) diff --git a/test/source/test_markov_chain.py b/test/source/test_markov_chain.py deleted file mode 100644 index 60bed5c..0000000 --- a/test/source/test_markov_chain.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import voluptuous - -from monasca_analytics.source import cloud_markov_chain as cloud -from test.mocks import spark_mocks -from test.util_for_testing import MonanasTestCase - - -class MarkovChainSourceTest(MonanasTestCase): - - def setUp(self): - super(MarkovChainSourceTest, self).setUp() - transitions = { - "web_service": { - "run=>slow": { - 0: 0.01, - 8: 0.2, - 12: 0.7, - 14: 0.7, - 22: 0.3, - 24: 0.1 - }, - "slow=>run": { - 0: 1, - 8: 0.7, - 12: 0.1, - 14: 0.1, - 22: 0.8, - 24: 0.99 - }, - "stop=>run": 0.5 - }, - "switch": { - "on=>off": 0.1, - "off=>on": 0.5 - }, - "host": { - "on=>off": 0.5, - "off=>on": 0.1 - }, - } - self.valid_config = { - "module": "markov_chain_source", - "transitions": dict(transitions), - "triggers": { - "support": { - "get_called": { - 0: 0.1, - 8: 0.2, - 12: 0.8, - 14: 0.8, - 22: 0.5, - 24: 0.0 - } - } - }, - "sleep": 0.1, - "min_event_per_burst": 500, - "graph": { - "h1:host": ["s1"], - "h2:host": ["s1"], - "s1:switch": [], - "w1:web_service": ["h1"], - "w2:web_service": ["h2"] - } - } - self.config_extra_param = dict(self.valid_config) - self.config_extra_param["extra_param"] = "john doe" - self.config_missing_param = dict(self.valid_config) - self.config_missing_param["transitions"] = dict(transitions) - self.config_missing_param["transitions"].pop("host") - self.config_wrong_type = { - "module": 123, - "transitions": dict(self.valid_config["transitions"]), - "sleep": 0.1, - "min_event_per_burst": 500, - "graph": {} - } - self.mcs = cloud.CloudMarkovChainSource("fake_id", self.valid_config) - - def tearDown(self): - super(MarkovChainSourceTest, self).tearDown() - - def test_validate_valid_config(self): - self.assertEqual(self.valid_config, self.mcs._config) - - def test_validate_config_extra_param(self): - self.assertRaises( - voluptuous.Invalid, - self.mcs.validate_config, - self.config_extra_param) - - def test_validate_config_wrong_type(self): - self.assertRaises( - voluptuous.Invalid, - self.mcs.validate_config, - self.config_wrong_type) - - def test_get_default_config(self): - default_config = cloud.CloudMarkovChainSource.get_default_config() - cloud.CloudMarkovChainSource.validate_config(default_config) - self.assertEqual("CloudMarkovChainSource", default_config["module"]) - - def test_create_dstream_created(self): - ssc = spark_mocks.MockStreamingContext(None, None) - self.assertIsNotNone(self.mcs.create_dstream(ssc)) - self.mcs.terminate_source() - self.assertEqual(ssc._host, "localhost") - - def test_create_system(self): - [support_node] = self.mcs._create_system() - ws = support_node.dependencies - self.assertEqual(len(ws), 2) - ws1 = ws[0] - self.assertEqual(len(ws1.dependencies), 1) - ws2 = ws[1] - self.assertEqual(len(ws2.dependencies), 1) - hs1 = ws1.dependencies[0] - self.assertEqual(len(hs1.dependencies), 1) - hs2 = ws2.dependencies[0] - self.assertEqual(len(hs2.dependencies), 1) - self.assertEqual(hs1.dependencies[0], hs2.dependencies[0]) diff --git a/test/source/test_random.py b/test/source/test_random.py deleted file mode 100644 index 40b8a5d..0000000 --- a/test/source/test_random.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.source import randoms -from test.util_for_testing import MonanasTestCase - - -class TestRandomSource(MonanasTestCase): - - def setUp(self): - super(TestRandomSource, self).setUp() - - def tearDown(self): - super(TestRandomSource, self).tearDown() - - def test_get_default_config(self): - default_config = randoms.RandomSource.get_default_config() - randoms.RandomSource.validate_config(default_config) - self.assertEqual("RandomSource", default_config["module"]) diff --git a/test/spark/__init__.py b/test/spark/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/spark/test_aggregator.py b/test/spark/test_aggregator.py deleted file mode 100644 index b894ccd..0000000 --- a/test/spark/test_aggregator.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.spark import aggregator -from test.mocks import spark_mocks -from test.util_for_testing import MonanasTestCase - - -class BaseAggregatorTest(MonanasTestCase): - - def setUp(self): - super(BaseAggregatorTest, self).setUp() - self.da = AggregatorBasicChild(None) - self.set_mocks() - - def tearDown(self): - super(BaseAggregatorTest, self).tearDown() - - def set_mocks(self): - pass - - def test_aggregate_first_time(self): - dstream1 = spark_mocks.MockDStream(None, None, None) - self.da.accumulate_dstream_samples(dstream1) - self.assertEqual(dstream1, self.da._combined_stream) - self.assertEqual(0, self.da._combined_stream.join_cnt) - - def test_aggregate_with_no_smls(self): - dstream1 = spark_mocks.MockDStream(None, None, None) - self.da.accumulate_dstream_samples(dstream1) - - -class AggregatorBasicChild(aggregator.Aggregator): - - def __init__(self, driver): - super(AggregatorBasicChild, self).__init__(driver) - self.accumulation_logic_cnt = 0 - - def prepare_final_accumulate_stream_step(self): - super(AggregatorBasicChild, self)\ - .prepare_final_accumulate_stream_step() - self.accumulation_logic_cnt += 1 diff --git a/test/spark/test_driver.py b/test/spark/test_driver.py deleted file mode 100644 index 6bf5a89..0000000 --- a/test/spark/test_driver.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os - -from monasca_analytics.config import const -import monasca_analytics.spark.driver as driver -import monasca_analytics.util.common_util as cu -from test.mocks import sml_mocks -from test.mocks import spark_mocks -from test.util_for_testing import MonanasTestCase - - -class DriverExecutorTest(MonanasTestCase): - - def setUp(self): - """ - Keep a copy of the original functions that will be mocked, then - mock them, reset variables, and initialize ML_Framework. - """ - super(DriverExecutorTest, self).setUp() - self._backup_functions() - self._mock_functions() - sml_mocks.sml_mocks.reset() - self.init_sml_config() - - def tearDown(self): - """ - Restore the potentially mocked functions to the original ones - """ - super(DriverExecutorTest, self).tearDown() - self._restore_functions() - sml_mocks.sml_mocks.reset_connections() - - def _backup_functions(self): - self.original_get_class_by_name = cu.get_class_by_name - self.original_SparkContext = driver.pyspark.SparkContext - self.original_StreamingContext = \ - driver.streamingctx.streaming.StreamingContext - self.original_Aggregator = driver.agg.Aggregator - - def _restore_functions(self): - cu.get_class_by_name = self.original_get_class_by_name - driver.pyspark.SparkContext = self.original_SparkContext - driver.streamingctx.streaming.StreamingContext = \ - self.original_StreamingContext - driver.agg.Aggregator = self.original_Aggregator - - def _mock_functions(self): - cu.get_class_by_name = sml_mocks.mock_get_class_by_name - driver.pyspark.SparkContext = spark_mocks.MockSparkContext - driver.streamingctx.streaming.StreamingContext = \ - spark_mocks.MockStreamingContext - driver.agg.Aggregator = sml_mocks.MockClass_aggr_module - - def init_sml_config(self): - """ - Initialize the ML_Framework object with the test_json config - """ - current_dir = os.path.dirname(__file__) - test_json_file = os.path.join(current_dir, - "../resources/test_json.json") - config = cu.parse_json_file(test_json_file) - self.mlf = driver.DriverExecutor(config) - - def assert_got_classes_by_name_once(self): - self.assertEqual(9, len(sml_mocks.sml_mocks.classes_got_by_name)) - self.assertIn(["src_module1", const.SOURCES], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["src_module2", const.SOURCES], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["IPTablesSource", const.SOURCES], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["ingestor_module", const.INGESTORS], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["sml_module", const.SMLS], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["voter_module", const.VOTERS], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["sink_module1", const.SINKS], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["sink_module2", const.SINKS], - sml_mocks.sml_mocks.classes_got_by_name) - self.assertIn(["ldp_module1", const.LDPS], - sml_mocks.sml_mocks.classes_got_by_name) - - def assert_instantiated_classes_once(self): - for n in sml_mocks.sml_mocks.instantiated.keys(): - self.assertEqual(1, len(sml_mocks.sml_mocks.instantiated[n])) - - def assert_instantiated_no_classes(self): - for n in sml_mocks.sml_mocks.instantiated.keys(): - self.assertEqual(0, len(sml_mocks.sml_mocks.instantiated[n])) - - def assert_only_instantiated(self, name): - self.assertEqual(1, len(sml_mocks.sml_mocks.instantiated[name])) - for n in sml_mocks.sml_mocks.instantiated.keys(): - if n != name: - self.assertEqual(0, len(sml_mocks.sml_mocks.instantiated[n])) - - def assert_src_initialized(self, src): - self.assertEqual(src.get_feature_list_cnt, 1) - self.assertEqual(src.create_dstream_cnt, 1) - - def assert_src_termintated(self, src): - self.assertEqual(src.terminate_source_cnt, 1) - - def assert_ingestor(self, ing): - self.assertEqual(ing.map_dstream_cnt, 1) - - def assert_agg(self, agg): - self.assertEqual(agg.accumulate_dstream_samples_cnt, 1) - self.assertEqual(agg.append_sml_cnt, 1) - - def assert_sml(self, sml): - self.assertEqual(sml.learn_structure_cnt, 1) - - def assert_voter(self, voter): - self.assertEqual(voter.elect_structure_cnt, 1) - - def assert_sink(self, sink): - self.assertEqual(sink.sink_dstream_cnt + sink.sink_sml_cnt, 1) - - def assert_sink_dstream(self, sink): - self.assertEqual(sink.sink_dstream_cnt, 1) - - def assert_sink_ml(self, sink): - self.assertEqual(sink.sink_sml_cnt, 1) - - def assert_ldp(self, ldp): - self.assertEqual(ldp.map_dstream_cnt, 1) - - def test_driver_orchestration_at_creation(self): - """ - Tests that the Monanas constructor checks the config json file, - gets all the modules classes by name and instantiates them. - """ - self.assert_got_classes_by_name_once() - self.assert_instantiated_classes_once() - - def test_pipeline_connected(self): - self.mlf.start_pipeline() - self.assert_src_initialized( - sml_mocks.sml_mocks.instantiated["src_module1"][0]) - self.assert_src_initialized( - sml_mocks.sml_mocks.instantiated["src_module2"][0]) - self.assert_ingestor( - sml_mocks.sml_mocks.instantiated["ingestor_module"][0]) - self.assert_agg(self.mlf._orchestrator) - self.mlf._orchestrator.accumulate_dstream_samples( - spark_mocks.MockDStream(None, None, None)) - self.mlf._orchestrator.prepare_final_accumulate_stream_step() - self.assert_sml(sml_mocks.sml_mocks.instantiated["sml_module"][0]) - self.assert_voter(sml_mocks.sml_mocks.instantiated["voter_module"][0]) - self.assert_sink( - sml_mocks.sml_mocks.instantiated["sink_module1"][0]) - self.assert_sink_ml( - sml_mocks.sml_mocks.instantiated["sink_module1"][0]) - - def test_start_pipeline(self): - self.mlf.start_pipeline() - - def test_phase2(self): - self.mlf.start_pipeline() - self.assertEqual(1, self.mlf._ssc.started_cnt) - self.mlf._orchestrator.accumulate_dstream_samples( - spark_mocks.MockDStream(None, None, None)) - self.mlf._orchestrator.prepare_final_accumulate_stream_step() - self.assert_ldp( - sml_mocks.sml_mocks.instantiated["ldp_module1"][0]) - self.assert_sink( - sml_mocks.sml_mocks.instantiated["sink_module2"][0]) - self.assert_sink_dstream(sml_mocks.sml_mocks.instantiated[ - "sink_module2"][0]) - - def assert_stopped_streaming_state(self, ssc=None): - if ssc: - self.assertEqual(1, ssc.stopped_cnt) - - def test_stop_pipeline(self): - self.mlf.start_pipeline() - ssc = self.mlf._ssc - self.mlf.stop_pipeline() - self.assert_stopped_streaming_state(ssc) diff --git a/test/test_monanas.py b/test/test_monanas.py deleted file mode 100644 index f01c961..0000000 --- a/test/test_monanas.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os - -from monasca_analytics.exception import monanas as err -import monasca_analytics.monanas as mnn -import monasca_analytics.spark.driver as driver -import monasca_analytics.util.common_util as cu -from test.mocks import sml_mocks -from test.mocks import spark_mocks -from test.util_for_testing import MonanasTestCase - - -class MonanasTest(MonanasTestCase): - - def setUp(self): - """ - Keep a copy of the original functions that will be mocked, then - mock them, reset variables, and initialize ML_Framework. - """ - super(MonanasTest, self).setUp() - self._backup_functions() - self._mock_functions() - sml_mocks.sml_mocks.reset() - self.init_sml_config() - - def tearDown(self): - """ - Restore the potentially mocked functions to the original ones - """ - super(MonanasTest, self).tearDown() - self._restore_functions() - - def _backup_functions(self): - self.original_kill = mnn.os.kill - self.original_get_class_by_name = cu.get_class_by_name - self.original_SparkContext = driver.pyspark.SparkContext - self.original_StreamingContext = \ - driver.streamingctx.streaming.StreamingContext - self.original_Aggregator = driver.agg.Aggregator - - def _restore_functions(self): - cu.get_class_by_name = self.original_get_class_by_name - mnn.os.kill = self.original_kill - driver.pyspark.SparkContext = self.original_SparkContext - driver.streamingctx.streaming.StreamingContext = \ - self.original_StreamingContext - driver.agg.Aggregator = self.original_Aggregator - - def _mock_functions(self): - cu.get_class_by_name = sml_mocks.mock_get_class_by_name - mnn.os.kill = sml_mocks.mock_kill - driver.pyspark.SparkContext = spark_mocks.MockSparkContext - driver.streamingctx.streaming.StreamingContext = \ - spark_mocks.MockStreamingContext - driver.agg.Aggregator = sml_mocks.MockClass_aggr_module - - def init_sml_config(self): - """ - Initialize the ML_Framework object with the test_json config - """ - current_dir = os.path.dirname(__file__) - test_json_file = os.path.join(current_dir, "resources/test_json.json") - config = cu.parse_json_file(test_json_file) - self.mlf = mnn.Monanas(config) - - def test_is_streaming(self): - self.assertFalse(self.mlf.is_streaming()) - self.mlf._is_streaming = True - self.assertTrue(self.mlf.is_streaming()) - self.mlf._is_streaming = False - self.assertFalse(self.mlf.is_streaming()) - - def test_start_streaming_no_param(self): - self.mlf.start_streaming() - self.assertTrue(self.mlf.is_streaming()) - - def assert_stopped_streaming_state(self, ssc=None): - if ssc: - self.assertEqual(1, ssc.stopped_cnt) - self.assertFalse(self.mlf.is_streaming()) - - def test_stop_streaming(self): - self.mlf.start_streaming() - self.mlf.stop_streaming() - - def test_stop_streaming_no_streaming(self): - self.mlf.start_streaming() - self.mlf.stop_streaming() - self.assertRaises(err.MonanasAlreadyStoppedStreaming, - self.mlf.stop_streaming) - - def test_stop_streaming_and_terminate_from_init_state(self): - self.assertFalse(sml_mocks.sml_mocks.killed) - self.mlf.stop_streaming_and_terminate() - self.assertTrue(sml_mocks.sml_mocks.killed) - self.assert_stopped_streaming_state() - - def test_stop_streaming_and_terminate_from_streaming_state(self): - self.assertFalse(sml_mocks.sml_mocks.killed) - self.mlf.start_streaming() - self.mlf.stop_streaming_and_terminate() - self.assertTrue(sml_mocks.sml_mocks.killed) - - def test_stop_streaming_and_terminate_from_stopped_state(self): - self.assertFalse(sml_mocks.sml_mocks.killed) - self.mlf.start_streaming() - self.mlf.stop_streaming() - self.mlf.stop_streaming_and_terminate() - self.assertTrue(sml_mocks.sml_mocks.killed) diff --git a/test/test_run.py b/test/test_run.py deleted file mode 100644 index 848ad99..0000000 --- a/test/test_run.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2018 FUJITSU LIMITED -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import run -from test.util_for_testing import MonanasTestCase - - -class ParserTest(MonanasTestCase): - """Test argment parser in run.py""" - - def setUp(self): - super(ParserTest, self).setUp() - self.parser = run.setup_parser() - - def tearDown(self): - super(ParserTest, self).tearDown() - - def _get_parser(self, args): - try: - parsed = self.parser.parse_args(args) - except SystemExit: - raise ParserException("Argument parse failed") - - return parsed - - def _check_parser(self, parsed, args, verify_args): - for av in verify_args: - attr, value = av - if attr: - self.assertIn(attr, parsed) - self.assertEqual(value, getattr(parsed, attr)) - - def test_parser_required(self): - arglist = [ - '--config', '/path/to/config_file', - '--log_config', '/path/to/log_file', - '--spark_path', '/path/to/spark', - ] - - verifylist = [ - ('config', '/path/to/config_file'), - ('log_config', '/path/to/log_file'), - ('spark_path', '/path/to/spark'), - ] - - parsed = self._get_parser(arglist) - self._check_parser(parsed, arglist, verifylist) - - def test_parser_optional(self): - arglist = [ - '--config', '/path/to/config_file', - '--log_config', '/path/to/log_file', - '--spark_path', '/path/to/spark', - '--sources', '/path/to/src1', '/path/to/src2', - ] - - verifylist = [ - ('config', '/path/to/config_file'), - ('log_config', '/path/to/log_file'), - ('spark_path', '/path/to/spark'), - ('sources', ['/path/to/src1', '/path/to/src2']), - ] - - parsed = self._get_parser(arglist) - self._check_parser(parsed, arglist, verifylist) - - def test_parser_optional_bool(self): - arglist = [ - '--config', '/path/to/config_file', - '--log_config', '/path/to/log_file', - '--spark_path', '/path/to/spark', - '--debug', - ] - - parsed = self._get_parser(arglist) - self.assertTrue(parsed.debug) diff --git a/test/util/__init__.py b/test/util/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/util/inheritance.py b/test/util/inheritance.py deleted file mode 100644 index 471d543..0000000 --- a/test/util/inheritance.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -class Baseclass(object): - pass - - -class Extended_1_1(Baseclass): - pass - - -class Extended_1_2(Baseclass): - pass - - -class Extended_1_3(Baseclass): - pass - - -class Extended_2_1(Extended_1_1): - pass - - -class Extended_3_1(Extended_2_1): - pass diff --git a/test/util/test_common_util.py b/test/util/test_common_util.py deleted file mode 100644 index 91b7d83..0000000 --- a/test/util/test_common_util.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os -import six -import unittest - -from monasca_analytics.config import const -from monasca_analytics.exception import monanas as err -from monasca_analytics.sml import lingam -from monasca_analytics.source import kafka -from monasca_analytics.util import common_util -from monasca_analytics.voter import pick_index -from test import util -from test.util import inheritance as inh - - -class CommonUtilTest(unittest.TestCase): - - def test_parse_json_file(self): - current_dir = os.path.dirname(__file__) - test_json_file = os.path.join(current_dir, - "../resources/test_json.json") - parsed_json = common_util.parse_json_file(test_json_file) - six.assertCountEqual(self, parsed_json["sources"]["src1"], - {"module": "src_module1", - "params": { - "param1": "val1", - "param2": "val2", - "model_id": 3} - }) - six.assertCountEqual(self, parsed_json["ingestors"]["ing1"], - {"module": "ingestor_module"}) - six.assertCountEqual(self, parsed_json["smls"]["sml1"], - {"module": "sml_module"}) - self.assertEqual(parsed_json["voters"]["vot1"], - {"module": "voter_module"}) - six.assertCountEqual(self, parsed_json["sinks"]["snk1"], - {"module": "sink_module1"}) - six.assertCountEqual(self, parsed_json["sinks"]["snk2"], - {"module": "sink_module2"}) - six.assertCountEqual(self, parsed_json["ldps"]["ldp1"], - {"module": "ldps_module1"}) - six.assertCountEqual(self, parsed_json["connections"], - {"src1": ["ing1"], - "src2": ["ing1"], - "ing1": ["aggr1", "ldp1", "sin1"], - "snk1": [], - "snk2": [], - "sml1": ["vot1", "snk1"], - "vot1": ["ldp1", "snk1"], - "ldp1": ["snk2"]}) - six.assertCountEqual(self, parsed_json["feedback"], - {"snk1": ["sml1"], - "snk2": ["vot1"]}) - - def test_get_class_by_name(self): - common_util.get_class_by_name("RandomSource", const.SOURCES) - - def test_get_class_by_name_no_such_class(self): - self.assertRaises(err.MonanasNoSuchClassError, - common_util.get_class_by_name, - "InventedSource", - const.SOURCES) - - def test_get_available_inherited_classes(self): - children = common_util.get_available_inherited_classes(util, - inh.Baseclass) - classes = [source_class.__name__ for source_class in children] - six.assertCountEqual(self, classes, - ["Extended_1_1", "Extended_1_2", - "Extended_1_3", "Extended_2_1", "Extended_3_1"]) - - def test_get_source_class_by_name(self): - clazz = common_util.get_source_class_by_name("KafkaSource") - self.assertEqual(clazz, kafka.KafkaSource) - - def test_get_available_source_class_names(self): - names = common_util.get_available_source_class_names() - six.assertCountEqual( - self, - ['RandomSource', 'KafkaSource', - 'CloudMarkovChainSource', 'IPTablesSource', - 'MonascaMarkovChainSource'], - names) - - def test_get_available_ingestor_class_names(self): - names = common_util.get_available_ingestor_class_names() - six.assertCountEqual( - self, - ['CloudIngestor', 'IptablesIngestor'], - names) - - def test_get_sml_class_by_name(self): - clazz = common_util.get_sml_class_by_name( - "LiNGAM") - self.assertEqual(clazz, lingam.LiNGAM) - - def test_get_available_sml_class_names(self): - names = common_util.get_available_sml_class_names() - six.assertCountEqual( - self, - ['LiNGAM', - 'SvmOneClass', - 'IsolationForest', - 'EllipticEnvelope', - 'DecisionTreeClassifier', - 'LogisticRegression', - 'RandomForestClassifier', - 'Svc'], - names) - - def test_get_voter_class_by_name(self): - clazz = common_util.get_voter_class_by_name( - "PickIndexVoter") - self.assertEqual(clazz, pick_index.PickIndexVoter) - - def test_get_available_voter_class_names(self): - names = common_util.get_available_voter_class_names() - six.assertCountEqual(self, ["PickIndexVoter"], names) - - def test_get_available_ldp_class_names(self): - names = common_util.get_available_ldp_class_names() - six.assertCountEqual(self, [ - "CloudCausalityLDP", "IptablesLDP", - 'MonascaDerivativeLDP', 'MonascaAggregateLDP', - 'MonascaCombineLDP' - ], names) diff --git a/test/util/test_config_model.py b/test/util/test_config_model.py deleted file mode 100644 index 66cea0b..0000000 --- a/test/util/test_config_model.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import os - -import voluptuous - -from monasca_analytics.config import validation -from monasca_analytics.util import common_util -from test.util_for_testing import MonanasTestCase - -logger = logging.getLogger(__name__) - - -class TestConfigModel(MonanasTestCase): - - def get_config(self): - current_dir = os.path.dirname(__file__) - test_json_file = os.path.join(current_dir, - "../resources/test_json.json") - return common_util.parse_json_file(test_json_file) - - def setUp(self): - super(TestConfigModel, self).setUp() - self.comp_types = ["sources", "ingestors", "smls", - "voters", "ldps", "sinks"] - self.config = self.get_config() - - def test_validate_config_valid(self): - ret = validation.validate_config(self.config) - self.assertIsNone(ret) - - def test_validate_config_missing_key(self): - for key in self.comp_types: - del self.config[key] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_config_extra_key(self): - self.config = self.get_config() - self.config["infiltrated"] = "I should not exist" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_config_missing_spark_key(self): - for key in list(self.config["spark_config"].keys()): - del self.config["spark_config"][key] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - del self.config["spark_config"]["streaming"]["batch_interval"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_config_spark_wrong_format(self): - self.config["spark_config"]["streaming"][ - "batch_interval"] = "I should not be a string" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - self.config["spark_config"]["appName"] = 123 - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_config_server_wrong_format(self): - self.config["server"]["port"] = "I should be an int" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - self.config["server"]["debug"] = 52 - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_config_spark_extra_parameters(self): - self.config["spark_config"]["infiltrated"] = "I should not exist" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - self.config["spark_config"]["streaming"][ - "infiltrated"] = "I should not exist" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_config_server_extra_parameters(self): - self.config["server"]["infiltrated"] = "I should not exist" - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_config_wrong_format_components(self): - for key in self.comp_types: - self.config[key] = ["I", "should", "be", "a", "dictionary"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - for comp_id in self.config[key].keys(): - self.config[key][comp_id] = ["I", "should", "be", "a", "dict"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_config_wrong_format_connections(self): - self.config["connections"] = ["I", "should", "be", "a", "dictionary"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - for comp_id in self.config["connections"].keys(): - self.config["connections"][comp_id] = {"I": "should", - "be": "a list"} - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_connections_data_models(self): - self.config["connections"]["mod1"] = ["src1"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - - def test_validate_connections_wrong_dest(self): - wrong_destinations = { - "src1": ["src1", "src2", "agg1", "sml1", - "vot1", "sin1", "sin2"], - "src2": ["src1", "src2", "agg1", "sml1", - "vot1", "sin1", "sin2"], - "ing1": ["src1", "src2", "ing1", "sml1", "vot1", "ldp1"], - "agg1": ["src1", "src2", "ing1", "agg1", - "vot1", "ldp1"], - "sml1": ["src1", "src2", "ing1", "sml1", - "ldp1"], - "vot1": ["src1", "src2", "ing1", "agg1", "sml1", "vot1"], - "sin1": ["src1", "src2", "ing1", "agg1", "sml1", - "vot1", "sin1", "sin2", "ldp1"], - "sin2": ["src1", "src2", "ing1", "agg1", "sml1", - "vot1", "sin1", "sin2", "ldp1"], - "ldp1": ["src1", "src2", "ing1", "agg1", "sml1", - "vot1", "ldp1"] - } - for from_id in wrong_destinations.keys(): - for dst_id in wrong_destinations[from_id]: - self.config["connections"][from_id] = [dst_id] - logger.debug("checking wrong connection: " + - from_id + " --> " + dst_id) - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_connections_inexisteng_source(self): - self.config["connections"]["inex"] = ["sin2"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() - - def test_validate_connections_inexisteng_dest(self): - self.config["connections"]["src1"] = ["inex"] - self.assertRaises(voluptuous.Invalid, - validation.validate_config, self.config) - self.config = self.get_config() diff --git a/test/util/test_math.py b/test/util/test_math.py deleted file mode 100644 index 774aa9d..0000000 --- a/test/util/test_math.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.util import math -from test.util_for_testing import MonanasTestCase - - -class MathTest(MonanasTestCase): - - def setUp(self): - super(MathTest, self).setUp() - - def tearDown(self): - super(MathTest, self).tearDown() - - def test_interp1(self): - table = [(0, 1.), (1, 1.), (2, 3)] - self.assertAlmostEqual(math.interpolate_1d(table, 0), 1.) - self.assertAlmostEqual(math.interpolate_1d(table, 0.), 1.) - self.assertAlmostEqual(math.interpolate_1d(table, 1.), 1.) - self.assertAlmostEqual(math.interpolate_1d(table, 0.5), 1.) - self.assertAlmostEqual(math.interpolate_1d(table, 0.7), 1.) - self.assertAlmostEqual(math.interpolate_1d(table, 2.), 3.) - self.assertAlmostEqual(math.interpolate_1d(table, 1.5), 2.) diff --git a/test/util_for_testing.py b/test/util_for_testing.py deleted file mode 100644 index db11692..0000000 --- a/test/util_for_testing.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import json -import logging.config -import os -import unittest - - -class MonanasTestCase(unittest.TestCase): - - def setup_logging(self): - current_dir = os.path.dirname(__file__) - logging_config_file = os.path.join(current_dir, - "./resources/logging.json") - with open(logging_config_file, "rt") as f: - config = json.load(f) - logging.config.dictConfig(config) - - def setUp(self): - unittest.TestCase.setUp(self) - self.setup_logging() - - def tearDown(self): - unittest.TestCase.tearDown(self) - - -def gen_metric(name, value, timestamp, host): - return { - "metric": { - "dimensions": {"hostname": host}, - "timestamp": timestamp, - "name": name, - "value": value - }, - "meta": {}, - } diff --git a/test/voter/__init__.py b/test/voter/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/voter/test_base_voter.py b/test/voter/test_base_voter.py deleted file mode 100644 index 8b20707..0000000 --- a/test/voter/test_base_voter.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.voter import base -from test.util_for_testing import MonanasTestCase - - -class BaseVoterTest(MonanasTestCase): - - def setUp(self): - super(BaseVoterTest, self).setUp() - self.vot = VoterBasicChild("fake_id", "fake_config") - - def tearDown(self): - super(BaseVoterTest, self).tearDown() - - def test_suggest_structure_no_smls_or_structures(self): - self.vot.suggest_structure("who", "struct") - - -class VoterBasicChild(base.BaseVoter): - - def __init__(self, _id, _config): - self.elect_cnt = 0 - super(VoterBasicChild, self).__init__(_id, _config) - - def elect_structure(self, structures): - self.elect_cnt += 1 - - @staticmethod - def validate_config(_config): - pass - - @staticmethod - def get_default_config(): - return {"module": VoterBasicChild.__name__} - - @staticmethod - def get_params(): - return [] diff --git a/test/voter/test_pick_index.py b/test/voter/test_pick_index.py deleted file mode 100644 index 8806a9c..0000000 --- a/test/voter/test_pick_index.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Hewlett Packard Enterprise Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from monasca_analytics.voter import pick_index -from test.util_for_testing import MonanasTestCase - - -class TestPickIndexVoter(MonanasTestCase): - - def setUp(self): - super(TestPickIndexVoter, self).setUp() - - def tearDown(self): - super(TestPickIndexVoter, self).tearDown() - - def test_get_default_config(self): - default_config = pick_index.PickIndexVoter.get_default_config() - pick_index.PickIndexVoter.validate_config(default_config) - self.assertEqual("PickIndexVoter", default_config["module"]) diff --git a/tools/test-setup.sh b/tools/test-setup.sh deleted file mode 100755 index 3e2fec8..0000000 --- a/tools/test-setup.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -xe - -# This script will be run by OpenStack CI before unit tests are run, -# it sets up the test system as needed. -# Developers should setup their test systems in a similar way. - -HOME=${HOME:-/home/jenkins} -SPARK_DIR=$HOME/spark -SPARK_VERSION=${SPARK_VERSION:-2.4.4} -SPARK_TARBALL_NAME=spark-$SPARK_VERSION.tgz -SPARK_URL=http://archive.apache.org/dist/spark/spark-$SPARK_VERSION/$SPARK_TARBALL_NAME - -mkdir -p $SPARK_DIR -curl $SPARK_URL -o $SPARK_DIR/$SPARK_TARBALL_NAME -tar -xzf $SPARK_DIR/$SPARK_TARBALL_NAME -C $SPARK_DIR diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 7c48b4a..0000000 --- a/tox.ini +++ /dev/null @@ -1,51 +0,0 @@ -[tox] -minversion = 2.0 -skipsdist = True -envlist = py37,pep8,cover - -[testenv] -basepython = python3 -usedevelop = True -setenv = - PYTHONUNBUFFERED=1 - VIRTUAL_ENV={envdir} - DISCOVER_DIRECTORY=tests - PYTHONPATH={homedir}/spark/spark-2.4.4/python:{homedir}/spark/spark-2.4.4/python/lib/py4j-0.10.7-src.zip: -install_command = pip install -U {opts} {packages} -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -whitelist_externals = bash - find -commands = - find ./ -type f -name "*.py[c|o]" -delete - nosetests -w test - -[testenv:cover] -commands = nosetests -w test --cover-package monasca_analytics -setenv = VIRTUAL_ENV={envdir} - NOSE_WITH_COVERAGE=1 - NOSE_COVER_BRANCHES=1 - NOSE_COVER_HTML=1 - NOSE_COVER_HTML_DIR={toxinidir}/cover - PYTHONPATH={homedir}/spark/spark-2.4.4/python:{homedir}/spark/spark-2.4.4/python/lib/py4j-0.10.7-src.zip: - -[testenv:pep8] -commands = - flake8 monasca_analytics test - -[testenv:genconfig] - -[testenv:docs] - -[testenv:venv] -install_command = pip install -U {opts} {packages} -commands = {posargs} - -[flake8] -ignore = F821,H201,H404,H405,E305 -max-complexity = 50 -builtins = _ -exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools,build -show-source = True - -[hacking]